package controller

import (
	"go.uber.org/dig"
	"gorm.io/gorm"

	"github.com/tidbcloud/dataflow-service/internal/config"
	"github.com/tidbcloud/dataflow-service/internal/core_ctx/infra/facade_imp"
	"github.com/tidbcloud/pkgv2/db"
	"github.com/tidbcloud/pkgv2/gormutil"
)

var globalDI *dig.Container

func init() {
	globalDI = dig.New()
}

func mustProvide(constructor interface{}, options ...dig.ProvideOption) {
	if err := globalDI.Provide(constructor, options...); err != nil {
		panic(err)
	}
}

func DiCall(fn interface{}, options ...dig.InvokeOption) error {
	return globalDI.Invoke(fn, options...)
}

func InitDependencies() {
	mustProvide(func() *config.CentralConfig { return config.Global() })
	mustProvide(newGormDB)
	mustProvide(newDBProvider)
	mustProvide(newTransProvider)

	// -- infra-facade -- //
	mustProvide(facade_imp.NewTimeFacadeImp)
	mustProvide(facade_imp.NewEncryptor)
}

func newDBProvider(handle *gorm.DB) db.Provider {
	return db.NewProvider(handle)
}

func newTransProvider(handle *gorm.DB) db.TransProvider {
	return db.NewProvider(handle)
}

func newGormDB(conf *config.CentralConfig) *gorm.DB {
	handle, err := gormutil.InitializeWithoutMigrate(conf.MysqlConfig)
	if err != nil {
		panic(err)
	}
	return handle
}
