package initialize

import (
	"fmt"

	"kra/internal/conf"

	"gorm.io/driver/sqlserver"
	"gorm.io/gorm"
)

// GormMssql 初始化MSSQL数据库
func GormMssql(m *conf.Mssql) (*gorm.DB, error) {
	if m == nil || m.DbName == "" {
		return nil, fmt.Errorf("mssql config is empty")
	}
	return initMssqlDatabase(m)
}

// GormMssqlByConfig 通过传入配置初始化MSSQL数据库
func GormMssqlByConfig(m *conf.Mssql) (*gorm.DB, error) {
	return initMssqlDatabase(m)
}

// initMssqlDatabase 初始化MSSQL数据库的辅助函数
func initMssqlDatabase(m *conf.Mssql) (*gorm.DB, error) {
	if m.DbName == "" {
		return nil, nil
	}

	dsn := MssqlDsn(m)
	mssqlConfig := sqlserver.Config{
		DSN:               dsn,
		DefaultStringSize: 191,
	}

	gormConfig := GormConfig(m.Prefix, m.Singular, m.LogMode)

	db, err := gorm.Open(sqlserver.New(mssqlConfig), gormConfig)
	if err != nil {
		return nil, err
	}

	if m.Engine != "" {
		db.InstanceSet("gorm:table_options", "ENGINE="+m.Engine)
	}

	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}

	sqlDB.SetMaxIdleConns(int(m.MaxIdleConns))
	sqlDB.SetMaxOpenConns(int(m.MaxOpenConns))

	return db, nil
}

// MssqlDsn 生成MSSQL DSN
func MssqlDsn(m *conf.Mssql) string {
	return fmt.Sprintf("sqlserver://%s:%s@%s:%s?database=%s&%s",
		m.Username, m.Password, m.Path, m.Port, m.DbName, m.Config)
}
