package database

import (
	"eta/eta_mini_ht_api/common/component/config"
	"eta/eta_mini_ht_api/common/component/database/dialector"
	logger "eta/eta_mini_ht_api/common/component/log"
	"eta/eta_mini_ht_api/common/contants"
	"gorm.io/gorm"
	"os"
	"sync"
)

const (
	MAIN = "main"
	EMAS = "emas"

	ETA = "eta"

	GL        = "gl"
	etaDriver = "mysql"

	glDriver = "mysql"
)

var (
	dbOnce    sync.Once
	etaDBOnce sync.Once
	glDBOnce  sync.Once
)

var dbInsts = make(map[string]*gorm.DB)

func Register(name string, dbInst *gorm.DB) {
	if dbInst == nil {
		panic("数据库不能为空")
	}
	if _, ok := dbInsts[name]; ok {
		panic("当前数据库实例已注册:" + name)
	}
	dbInsts[name] = dbInst
}
func Select(name string) *gorm.DB {
	db := dbInsts[name]
	if db == nil {
		panic("数据库未初始化")
	}
	return db
}
func init() {
	//初始化主数据库
	dbOnce.Do(func() {
		dbConfig, ok := config.GetConfig(contants.DATABASE).(*config.DBConfig)
		if !ok {
			panic("初始化数据库失败,配置文件格式不正确")
		}
		driver := dbConfig.GetDriver()
		dns := dbConfig.GetUrl()
		open, err := gorm.Open(dialector.GetGormDial(driver).GetDial(dns), &gorm.Config{})
		if err != nil {
			logger.Error("初始化数据库失败:%v", err)
			os.Exit(0)
		}
		Register(MAIN, open)
		logger.Info("初始化主库数据库成功")
		//第三方的数据库
		initDataBases()

	})
}

func initDataBases() {
	initEtaDatabase()
	initGLDatabase()
}
func initEtaDatabase() {
	etaDBOnce.Do(func() {
		etaConfig, ok := config.GetConfig(contants.ETA).(*config.ETAConfig)
		if !ok {
			panic("初始化eta数据库失败,配置文件格式不正确")
		}
		dns := etaConfig.GetDBUrl()
		open, err := gorm.Open(dialector.GetGormDial(etaDriver).GetDial(dns), &gorm.Config{})
		if err != nil {
			logger.Error("初始化ETA数据库失败:%v", err)
			os.Exit(0)
		}
		Register(ETA, open)
		logger.Info("初始化ETA数据库成功")
	})
}

func initGLDatabase() {
	glDBOnce.Do(func() {
		etaConfig, ok := config.GetConfig(contants.GL).(*config.GLConfig)
		if !ok {
			panic("初始化钢联数据库失败,配置文件格式不正确")
		}
		dns := etaConfig.GetDBUrl()
		open, err := gorm.Open(dialector.GetGormDial(glDriver).GetDial(dns), &gorm.Config{})
		if err != nil {
			logger.Error("初始化钢联数据库失败:%v", err)
			os.Exit(0)
		}
		Register(GL, open)
		logger.Info("初始化钢联数据库成功")
	})
}
