package models

import (
	adminmodel "github.com/tidbcloud/core-portal/internal/admin/admin"
	"github.com/tidbcloud/core-portal/internal/admin/admin/grafana"
	"github.com/tidbcloud/core-portal/internal/central/config"
	"github.com/tidbcloud/core-portal/internal/central/dbinit"
	"github.com/tidbcloud/core-portal/internal/central/model/testtoken"
	"github.com/tidbcloud/core-portal/internal/central/pkg/docker_db"
	"github.com/tidbcloud/pkgv2/secret/encrypt"

	"github.com/juju/errors"
	"github.com/pingcap/log"
	panicIf "github.com/tidbcloud/pkgv2/panicif"
	"go.uber.org/zap"
)

var (
	adminModel     *adminmodel.Model
	testTokenModel *testtoken.Model
)

func GetAdminModel() *adminmodel.Model {
	return adminModel
}

func GetTestTokenModel() *testtoken.Model {
	return testTokenModel
}

func InitMySQL(isUnitTest bool) {
	if isUnitTest {
		log.Info("init db in unittest mode")
		_, err := docker_db.TryInitCentralDB(true)
		panicIf.Error(err)
	} else {
		mysqlConfig := config.Global().MysqlConfig
		log.Info("Initialize MySQL connection", zap.String("user", mysqlConfig.User))
		_, err := dbinit.Initialize(mysqlConfig, false)
		panicIf.Error(err)
	}
}

func InitAdminModel() error {
	var err error

	serverConfig := config.Global().ServerConfig
	aesCrypt, err := encrypt.NewAESCrypt([]byte(serverConfig.SaltSecret))
	if err != nil {
		return errors.Trace(err)
	}

	auth0Config := config.Global().Auth0Config
	grafanaConfig := config.Global().GrafanaConfig
	grafanaClient := grafana.NewClient(grafanaConfig.Server, grafanaConfig.APIKey, grafana.DefaultHTTPClient)

	admin := adminmodel.NewModel(log.L(), grafanaClient)
	adminModel = &admin
	t := testtoken.NewModel(log.L(), auth0Config.Auth0Domain, auth0Config.Auth0ManagementClientID, auth0Config.Auth0ManagementClientSecret, aesCrypt, nil, nil)
	testTokenModel = &t
	return nil
}

func InitFakeAdminModel(log *zap.Logger, grafanaClient adminmodel.GrafanaCollector) error {
	m := adminmodel.NewModel(log, grafanaClient)

	adminModel = &m
	return nil
}
