package dao

import (
	"fmt"
	"mini_server/internal/logger"
	"time"

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

type Service struct {
	dsn string
	db  *gorm.DB
}

var s *Service

// 获取当前时间，精度只精确到秒，去掉毫秒等数据。避免保存到数据库时时间进位
func now_func() time.Time {
	tmp := time.Now().Local().Format(time.DateTime)
	now, _ := time.ParseInLocation(time.DateTime, tmp, time.Local)
	return now
}

// // dsn example: "root:123@tcp(127.0.0.1:3306)/test"
func InitDefaultService(dsn string) error {

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger:  logger.GormLogger,
		NowFunc: now_func,
	})
	if err != nil {
		return fmt.Errorf("open mysql failed, dsn:%v, err:%v", dsn, err)
	}

	dbs := &Service{dsn: dsn, db: db}

	// 自动创建相关的表结构
	if err := auto_migrate_all(db); err != nil {
		return fmt.Errorf("automigrate failed, err:%v", err)
	}

	// 数据库连接相关配置
	config_connection_info(db)

	s = dbs

	return nil
}

// 自动创建对应的数据表结构
func auto_migrate_all(db *gorm.DB) error {
	return db.AutoMigrate(
		//&Character{}, // 后续需要注释掉，避免修改客户创建的数据表
		&ChatRecord{},
		&File{},
		&Draft{},
		&PostLike{},
		&PostComment{},
		&Post{},
		&Bluetooth{},
		//&UserCharacter{}, // 需要注释掉，避免修改客户创建的数据表
		//&User{},          // 需要注释掉，避免修改客户创建的数据表
	)
}

// 数据库连接相关配置
func config_connection_info(db *gorm.DB) {
	mysqlDb, err := db.DB()
	if err != nil {
		return
	}
	mysqlDb.SetMaxIdleConns(10)  // 设置连接池的最大限制连接数
	mysqlDb.SetMaxOpenConns(100) // 设置连接池中的最大连接数量
}
