package initialize

import (
	"fmt"

	"kra/internal/conf"

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

// GormPgsql 初始化PostgreSQL数据库
func GormPgsql(p *conf.Pgsql) (*gorm.DB, error) {
	if p == nil || p.DbName == "" {
		return nil, fmt.Errorf("pgsql config is empty")
	}
	return initPgsqlDatabase(p)
}

// GormPgsqlByConfig 通过传入配置初始化PostgreSQL数据库
func GormPgsqlByConfig(p *conf.Pgsql) (*gorm.DB, error) {
	return initPgsqlDatabase(p)
}

// initPgsqlDatabase 初始化PostgreSQL数据库的辅助函数
func initPgsqlDatabase(p *conf.Pgsql) (*gorm.DB, error) {
	if p.DbName == "" {
		return nil, nil
	}

	dsn := PgsqlDsn(p)
	pgsqlConfig := postgres.Config{
		DSN:                  dsn,
		PreferSimpleProtocol: false,
	}

	gormConfig := GormConfig(p.Prefix, p.Singular, p.LogMode)

	db, err := gorm.Open(postgres.New(pgsqlConfig), gormConfig)
	if err != nil {
		return nil, err
	}

	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}

	sqlDB.SetMaxIdleConns(int(p.MaxIdleConns))
	sqlDB.SetMaxOpenConns(int(p.MaxOpenConns))

	return db, nil
}

// PgsqlDsn 生成PostgreSQL DSN
func PgsqlDsn(p *conf.Pgsql) string {
	return fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s %s",
		p.Path, p.Username, p.Password, p.DbName, p.Port, p.Config)
}
