package dao

import (
	"fmt"
	"gorm.io/driver/sqlserver"
	"os"
	"time"

	//_ "github.com/denisenkom/go-mssqldb"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"

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

	// _ "github.com/jinzhu/gorm/dialects/mysql"
	// "github.com/jinzhu/gorm"
	"kpt.xdmy/apiserver/config"
	"kpt.xdmy/apiserver/routers/restful"
	"kpt.xdmy/pkg/log"
	"kpt.xdmy/pkg/setting"
)

var D *Dao

type Dao struct {
	DB *gorm.DB
}

var SqlServerDB *SqlServer

type SqlServer struct {
	DB *gorm.DB
}

func New(conf *config.Config) *Dao {
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n"), // io writer
		logger.Config{
			SlowThreshold:             time.Second,  // Slow SQL threshold
			LogLevel:                  logger.Error, // Log level
			IgnoreRecordNotFoundError: false,        // Ignore ErrRecordNotFound error for logger
			Colorful:                  true,         // Disable color
			// LogMode:
		})
	gc := &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
			NoLowerCase:   true,
		},
		//Logger: newLogger,
		Logger: logger.Default.LogMode(logger.Silent),
	}

	db, err := gorm.Open(mysql.Open(conf.DB.DSN), gc)
	tx := db.Session(&gorm.Session{Logger: newLogger})
	if err != nil {
		log.Error("model.Setup err: %v", err, conf.DB.DSN)
	}
	sqlDB, _ := db.DB()
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(300 * time.Second)

	D = &Dao{
		DB: tx,
	}

	return D
}

func Setup() {
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
		setting.DatabaseSetting.User,
		setting.DatabaseSetting.Password,
		setting.DatabaseSetting.Host,
		setting.DatabaseSetting.Name)
	// restful  接口的 数据库初始化
	err := restful.SQLInit("mysql", dsn, 500, 50, setting.DatabaseSetting.ShowXormlog)
	if err != nil {
		log.Fatal("dao Setup ", err)
		fmt.Println("dbs 数据库初始化失败 ")
	}

	if err != nil {
		log.Fatal("dao  Setup ", err)
	}
}

func NewSqlServer(conf *config.Config) *SqlServer {
	sqlserverSourceName := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;encrypt=disable", setting.SQlServerSetting.Host,
		setting.SQlServerSetting.User, setting.SQlServerSetting.Password, setting.SQlServerSetting.Name)

	newLogger := logger.New(
		log.New(os.Stdout, "\r\n"), // io writer
		logger.Config{
			SlowThreshold:             time.Second,  // Slow SQL threshold
			LogLevel:                  logger.Error, // Log level
			IgnoreRecordNotFoundError: false,        // Ignore ErrRecordNotFound error for logger
			Colorful:                  true,         // Disable color
			// LogMode:
		})
	gc := &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
			NoLowerCase:   true,
		},
		//Logger: newLogger,
		Logger: logger.Default.LogMode(logger.Silent),
	}

	db, err := gorm.Open(sqlserver.Open(sqlserverSourceName), gc)
	tx := db.Session(&gorm.Session{Logger: newLogger})
	if err != nil {
		log.Error("model.Setup err: %v", err, conf.DB.DSN)
	}
	sqlDB, _ := db.DB()
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(300 * time.Second)
	SqlServerDB = &SqlServer{
		DB: tx,
	}

	return SqlServerDB
}