package dao

import (
	"fmt"
	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/config"

	// "github.com/pingcap-inc/clinic/clinic_data_service/pkg/entity"
	"sync"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var (
	db   *gorm.DB
	once sync.Once
)

// InitMySqlDB initializes the DB connection and returns *gorm.DB.
func InitMySqlDB() *gorm.DB {
	once.Do(func() {
		mysqlConfig := config.AppConfig.Database.MySQL
		// Build DSN with TLS support for TiDB Cloud connection
		// dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local&tls=true&allowNativePasswords=true",
		dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=UTC&tls=true&allowNativePasswords=true",
			mysqlConfig.User,
			mysqlConfig.Password,
			mysqlConfig.Host,
			mysqlConfig.Port,
			mysqlConfig.Database,
			mysqlConfig.Charset,
		)

		// Open DB connection
		var err error
		db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
		if err != nil {
			panic(fmt.Sprintf("failed to connect database: %v", err))
		}

		// Configure connection pool
		sqlDB, err := db.DB()
		if err != nil {
			panic(fmt.Sprintf("failed to get sql.DB: %v", err))
		}
		sqlDB.SetMaxOpenConns(20)
		sqlDB.SetMaxIdleConns(10)
		sqlDB.SetConnMaxLifetime(30 * time.Minute)
		sqlDB.SetConnMaxIdleTime(5 * time.Minute)

		// Auto migrate models
		// if err := db.AutoMigrate(&entity.DailySummary{}, &entity.DailyStat{}); err != nil {
		// 	panic("failed to migrate schema")
		// }

	})
	return db
}
