package common

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql" //nolint
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"sec-cycle-scan/model"
)

func InitMysql() *gorm.DB {

	d := CONFIG.DB
	//dsn := d.Username + ":" + d.Password + "@tcp(" + d.Host + ":" + d.Port + ")/" + d.Dbname + "?" + m.DbConfig

	if d.Dbname == "" {
		panic("initialize db error: 未配置DB名称")
		return nil
	}

	//charset=utf8mb4&parseTime=True&loc=Local&readTimeout=500ms
	dsn := fmt.Sprintf(
		"%s:%s@tcp(%s:%s)/%s?%s",
		d.Username,
		d.Password,
		d.Host,
		d.Port,
		d.Dbname,
		d.Config,
	)

	fmt.Println("d.Host: " + d.Host)
	fmt.Println("d.Port: " + d.Port)

	mysqlConfig := mysql.Config{
		DSN:                       dsn,   // DSN data source name
		DefaultStringSize:         191,   // string 类型字段的默认长度
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}

	if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig()); err != nil {
		panic(fmt.Sprintf("initialize db error: %s", err.Error()))
		return nil
	} else {
		sqlDB, _ := db.DB()

		sqlDB.SetMaxIdleConns(d.MaxIdleConns)
		sqlDB.SetMaxOpenConns(d.MaxOpenConns)

		_ = db.AutoMigrate(&model.SecretResult{})
		_ = db.AutoMigrate(&model.ScanInfo{})
		//_ = db.AutoMigrate(&model.AccessManagement{})
		//_ = db.AutoMigrate(&model.SCAWhiteList{})
		//_ = db.AutoMigrate(&model.VulStatistics{})

		return db
	}
}

func gormConfig() *gorm.Config {

	d := CONFIG.DB

	var config = &gorm.Config{

		//Logger: logger.Default.LogMode(logger.Info),
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
		DisableForeignKeyConstraintWhenMigrating: true,
	}

	//if !d.LogZap {
	//	return config
	//}

	if !d.LogZap {
		config.Logger = logger.Default.LogMode(logger.Silent)
		return config
	}

	config.Logger = logger.Default.LogMode(logger.Info)

	//_default := logger.New(internal.NewWriter(log.New(os.Stdout, "\r\n", log.LstdFlags)), logger.Config{
	//	SlowThreshold: 200 * time.Millisecond,
	//	LogLevel:      logger.Warn,
	//	Colorful:      true,
	//})
	//
	//switch d.LogMode {
	//case "silent", "Silent":
	//	config.Logger = _default.LogMode(logger.Silent)
	//case "error", "Error":
	//	config.Logger = _default.LogMode(logger.Error)
	//case "warn", "Warn":
	//	config.Logger = _default.LogMode(logger.Warn)
	//case "info", "Info":
	//	config.Logger = _default.LogMode(logger.Info)
	//case "zap", "Zap":
	//	config.Logger = _default.LogMode(logger.Info)
	//default:
	//	config.Logger = _default.LogMode(logger.Info)
	//}

	return config
}
