package main

import (
	"flag"
	"path/filepath"

	log "github.com/sirupsen/logrus"
	"github.com/tidbcloud/observability/o11ymetering/pkg/common/config"
	"github.com/tidbcloud/observability/o11ymetering/pkg/httpapi"
	"github.com/tidbcloud/observability/o11ymetering/pkg/schedule"
	"github.com/tidbcloud/observability/pkg/common/configs"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/structs"
	"github.com/tidbcloud/observability/pkg/common/utils"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
)

var (
	port     int
	vendor   string
	logLevel string
	logDir   string

	accountInfoPath    string
	meteringConfigPath string
	clientMode         bool
	kubeConfigPath     string
	//summary            bool
)

func main() {
	ctx := utils.SetupSignalHandler()

	flag.IntVar(&port, "port", constants.DefaultObservabilityRegionalServerPort, "listening port")
	flag.StringVar(&vendor, "vendor", string(constants.AWS), "vendor")
	flag.BoolVar(&clientMode, "client-mode", true, "client mode (true: in-cluster, false: out-of-cluster)")
	// specify the kube config absolute path, required if the clientMode value is false.
	flag.StringVar(&kubeConfigPath, "kube-config-path", filepath.Join(homedir.HomeDir(), ".kube", "config"), "(optional) absolute path to the kube config file")
	flag.StringVar(&logLevel, "log-level", "info", "log level. default: info")
	flag.StringVar(&logDir, "log-dir", "./logs", "log dir. default: ./logs")
	flag.StringVar(&accountInfoPath, "accountInfo", "./config/accountinfo.yaml", "account info config path. default: ./config/accountinfo.yaml")
	flag.StringVar(&meteringConfigPath, "meteringConfig", "./config/meteringconfig.yaml", "metering config path. default: ./config/meteringconfig.yaml")

	flag.Parse()
	// init log
	utils.InitLog(logLevel)
	log.Printf("o11y metering server running in vendor %s", vendor)
	// If clientMode is false (out-of-cluster) and the kubeConfigPath file does not exist, then exit
	if !clientMode && !utils.IsFile(kubeConfigPath) {
		log.Panic("please check if parameter `client-mode` or `kube-config-path` is correct.")
	}

	// build kube config
	var kubeConfig *rest.Config
	var err error
	if clientMode {
		// creates the in-cluster config
		kubeConfig, err = rest.InClusterConfig()
	} else {
		// creates the out-of-cluster config
		kubeConfig, err = clientcmd.BuildConfigFromFlags("", kubeConfigPath)
	}
	if err != nil {
		log.Panicf("init kubeconfig failed. %s", err.Error())
	}
	//Load AZconfig from file
	accountInfo := configs.LoadAccountInfo(accountInfoPath)

	config.LoadMeteringConfig(meteringConfigPath)
	config.UpdateMeteringConfigSecret()

	region := accountInfo.Region
	env := accountInfo.Env
	serviceInfo := structs.ServiceInfo{
		ServerName:        constants.ObservabilityRegionalDataServer,
		Port:              port,
		Vendor:            vendor,
		Region:            region,
		LogicalRegionName: accountInfo.LogicalRegionName,
		Env:               env,
		LogDir:            logDir,
		LogLevel:          logLevel,
		EnableHttps:       false,
		AccountInfo:       accountInfo,
	}
	configs.Init(serviceInfo)
	//
	//err = providers.InitClient(serviceInfo)
	//if err != nil {
	//	log.Panicf("init provider client failed. %s", err.Error())
	//}
	//
	//metrics.SetupMetrics(controller_metrics.Registry)

	//worker.InitDataServerManager(ctx, serviceInfo)
	////Start Manager must before GetManager
	//go worker.StartWorker(ctx)
	kubeConfig.QPS = 50
	kubeConfig.Burst = 100

	schedule.StatisticTask().AsyncTicker()
	schedule.StatisticMergeTask().AsyncTicker()
	schedule.ReportTask().AsyncTicker()

	schedule.MonthlyProportionSumGlobally()
	httpapi.StartService(ctx, serviceInfo)
}
