package repository

import (
	"database/sql"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	loglevel "gorm.io/gorm/logger"
	"mylomen_server/common/config"
	"mylomen_server/common/logs"

	"os"
	"time"
)

var Db = getInstance()

func getInstance() *gorm.DB {
	// unmarshal config
	ll := logs.NewZapLogger()
	if config.Instance.PgSql.LogSql {
		ll = ll.LogMode(loglevel.Warn)
	} else {
		ll = ll.LogMode(loglevel.Warn)
	}

	// 调用 Open 方法,传入驱动名和连接字符串
	conn, instanceErr := gorm.Open(postgres.Open(config.Instance.PgSql.Dsn), &gorm.Config{
		Logger:                 ll,
		SkipDefaultTransaction: true,
	})

	if instanceErr != nil {
		logs.NewLog("").Errorf("mysql_getInstance instanceErr: %v", instanceErr)
		os.Exit(-1)
	}

	var sqlDB *sql.DB
	sqlDB, instanceErr = conn.DB()
	if instanceErr != nil {
		logs.NewLog("").Errorf("mysql_getInstance sqlDB: %v", instanceErr)
		os.Exit(-1)
	}

	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(config.Instance.PgSql.ConnMaxLifetime)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(config.Instance.PgSql.MaxOpenConn)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Duration(config.Instance.PgSql.MaxIdleConn) * time.Second)

	db := conn
	return db
}

func GetDB() *gorm.DB {
	return Db
}