package configs

import (
	"context"
	"sync"

	"github.com/jinzhu/configor"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

var (
	initConfigOnce sync.Once
	config         *Config
	configPath     = "/etc/dbaas/config.yaml"
)

func SetConfigPath(path string) {
	if path != "" {
		configPath = path
	}
}

type Config struct {
	DBDSN          string `yaml:"db_dsn" required:"true"`
	AccountSvcAddr string `yaml:"account_svc_addr" required:"true"`
	ChatGPTToken   string `yaml:"chat_gpt_token" required:"true"`
	DataAPIAddr    string `yaml:"data_api_addr" required:"true"`
	AIPowerAddr    string `yaml:"ai_power_addr" required:"true"`
	ProjectID      uint64 `yaml:"project_id" required:"true"`
	ClusterID      uint64 `yaml:"cluster_id" required:"true"`
	DataAPIURL     string `yaml:"dataapi_url" required:"true"`
}

func GetConfig() *Config {
	ctx := context.TODO()

	initConfigOnce.Do(func() {
		config = &Config{}

		if err := configor.Load(config, configPath); err != nil {
			tilog.Error(ctx, "failed to load config from file", zap.Error(err), zap.String("path", configPath))
		}
		tilog.Info(ctx, "init config", zap.Any("config", config))
	})

	return config
}
