package db

import (
	"database/sql"
	"fmt"
	"log"
	"os"
	"time"

	_ "github.com/lib/pq"
)

var PgDB *sql.DB

// ConnectPostgres → PostgreSQL veritabanına bağlanır
func ConnectPostgres() (*sql.DB, error) {
	// Bağlantı stringi (istersen .env’den oku)
	connStr := os.Getenv("POSTGRES_CONN")
	if connStr == "" {
		// fallback → sabit tanımlı bağlantı
		connStr = "host=172.16.0.3 port=5432 user=postgres password=tayitkan dbname=baggib2b sslmode=disable"
	}

	db, err := sql.Open("postgres", connStr)
	if err != nil {
		return nil, fmt.Errorf("PostgreSQL bağlantı hatası: %w", err)
	}

	// =======================================================
	// 🔹 BAĞLANTI HAVUZU (AUDIT LOG UYUMLU)
	// =======================================================
	db.SetMaxOpenConns(30) // audit + api paralel çalışsın
	db.SetMaxIdleConns(10)
	db.SetConnMaxLifetime(30 * time.Minute)
	db.SetConnMaxIdleTime(5 * time.Minute) // 🔥 uzun idle audit bağlantılarını kapat

	// 🔹 Test et
	if err = db.Ping(); err != nil {
		return nil, fmt.Errorf("PostgreSQL erişilemiyor: %w", err)
	}

	log.Println("✅ PostgreSQL bağlantısı başarılı!")
	PgDB = db
	return db, nil

}

// GetPostgresUsers → test amaçlı ilk 5 kullanıcıyı listeler
func GetPostgresUsers(db *sql.DB) error {
	query := `SELECT id, code, email FROM mk_dfusr ORDER BY id LIMIT 5`
	rows, err := db.Query(query)
	if err != nil {
		return fmt.Errorf("PostgreSQL sorgu hatası: %w", err)
	}
	defer rows.Close()

	fmt.Println("📋 İlk 5 PostgreSQL kullanıcısı:")
	for rows.Next() {
		var id int
		var code, email string
		if err := rows.Scan(&id, &code, &email); err != nil {
			return err
		}
		fmt.Printf("  ➜ ID: %-4d | USER: %-20s | EMAIL: %s\n", id, code, email)
	}

	return rows.Err()
}
