package dbutil

import (
	"fmt"
	"log"
	"os"
	"time"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var MySQLDB *gorm.DB

func InitMySQLDB() {
	config := struct {
		MySQL struct {
			Host            string        `mapstructure:"host"`
			Port            int           `mapstructure:"port"`
			User            string        `mapstructure:"user"`
			Password        string        `mapstructure:"password"`
			Name            string        `mapstructure:"name"`
			MaxIdleConns    int           `mapstructure:"max_idle_conns"`
			MaxOpenConns    int           `mapstructure:"max_open_conns"`
			ConnMaxLifetime time.Duration `mapstructure:"conn_max_lifetime"`
			ConnMaxIdleTime time.Duration `mapstructure:"conn_max_idle_time"`
		} `mapstructure:"mysql"`
	}{}

	viper.SetConfigFile("./config/config.toml")
	viper.SetConfigType("toml")

	err := viper.ReadInConfig()
	if err != nil {
		panic(fmt.Errorf("fatal error config file: %s", err))
	}

	err = viper.Unmarshal(&config)
	if err != nil {
		panic(fmt.Errorf("fatal error config file: %s", err))
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.MySQL.User,
		config.MySQL.Password,
		config.MySQL.Host,
		config.MySQL.Port,
		config.MySQL.Name,
	)

	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second,  // Slow SQL threshold
			LogLevel:      logger.Error, // Log level
			Colorful:      true,         // Enable color
		},
	)

	MySQLDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		panic("连接数据库失败: " + err.Error())
	}

	// MySQLDB.Debug()

	sqlDB, err := MySQLDB.DB()
	if err != nil {
		panic("获取数据库连接失败: " + err.Error())
	}

	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(config.MySQL.MaxIdleConns)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(config.MySQL.MaxOpenConns)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(config.MySQL.ConnMaxLifetime * time.Hour)

	// SetConnMaxIdleTime 设置连接最大空闲时间
	sqlDB.SetConnMaxIdleTime(config.MySQL.ConnMaxIdleTime * time.Minute)

}
