package database

import (
	"database/sql"
	"fmt"
	"sync"
	"weatherstation/internal/config"

	_ "github.com/go-sql-driver/mysql"
	_ "github.com/lib/pq"
)

var (
	instance *sql.DB
	once     sync.Once
)

// GetDB 返回数据库连接单例
func GetDB() *sql.DB {
	once.Do(func() {
		cfg := config.GetConfig()
		connStr := fmt.Sprintf(
			"host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
			cfg.Database.Host,
			cfg.Database.Port,
			cfg.Database.User,
			cfg.Database.Password,
			cfg.Database.DBName,
			cfg.Database.SSLMode,
		)

		var err error
		instance, err = sql.Open("postgres", connStr)
		if err != nil {
			panic(fmt.Sprintf("无法连接到数据库: %v", err))
		}

		if err = instance.Ping(); err != nil {
			panic(fmt.Sprintf("数据库连接测试失败: %v", err))
		}
	})
	return instance
}

// Close 关闭数据库连接
func Close() error {
	if instance != nil {
		return instance.Close()
	}
	return nil
}

// -------------------- MySQL 连接（rtk_data） --------------------

var (
	mysqlInstance *sql.DB
	mysqlOnce     sync.Once
)

// GetMySQL 返回 MySQL 连接单例（rtk_data）
func GetMySQL() *sql.DB {
	mysqlOnce.Do(func() {
		cfg := config.GetConfig().MySQL
		var dsn string
		if cfg.Params != "" {
			dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Params)
		} else {
			dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName)
		}
		var err error
		mysqlInstance, err = sql.Open("mysql", dsn)
		if err != nil {
			panic(fmt.Sprintf("无法连接到 MySQL: %v", err))
		}
		if err = mysqlInstance.Ping(); err != nil {
			panic(fmt.Sprintf("MySQL 连接测试失败: %v", err))
		}
	})
	return mysqlInstance
}

// CloseMySQL 关闭 MySQL 连接
func CloseMySQL() error {
	if mysqlInstance != nil {
		return mysqlInstance.Close()
	}
	return nil
}
