package common

import (
	"Crimson-Gatekeeper/internal/query"
	"fmt"

	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

// GetDataBaseClient 获取数据库链接
//
// 返回值
//   - 一个 gorm.DB 的指针
//   - 一个清理所有数据库相关数据的函数
func GetDataBaseClient() (*gorm.DB, func(), error) {
	dsn := "host=localhost " +
		"user=gatekeeper " +
		"dbname=crimson " +
		"sslmode=disable " +
		"port=5432 " +
		"password=crimson " +
		"connect_timeout=20 "

	client, ero := gorm.Open(postgres.Open(dsn), &gorm.Config{})
	if ero != nil {
		fmt.Println("数据库链接建立失败")
		return nil, nil, ero
	}

	poolCfg, ero := client.DB()
	if ero != nil {
		fmt.Println("获取数据库链接池失败")

		return nil, nil, ero
	}

	cleanPoolCfg := func() {
		ero := poolCfg.Close()
		if ero != nil {
			fmt.Println("清理过程中出现错误")
			panic(ero)
		}
	}

	poolCfg.SetConnMaxIdleTime(3)
	poolCfg.SetMaxOpenConns(10)

	return client, cleanPoolCfg, nil
}

func GetQuery(db *gorm.DB) *query.Query {
	return query.Use(db)
}
