package main

import (
	"flag"

	gardencoreclientset "github.com/gardener/gardener/pkg/client/core/clientset/versioned"
	"github.com/pingcap/dbaas/central/runtime/deployer/gardener"
	runtimeutil "github.com/pingcap/dbaas/central/runtime/util"
	logutil "github.com/pingcap/dbaas/pkg/log"
	panicIf "github.com/pingcap/dbaas/pkg/panicif"
	"github.com/pingcap/infra/observability/config"
	"github.com/pingcap/infra/observability/controllers"
	zaplog "github.com/pingcap/log"
	"go.uber.org/zap"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

var (
	configPath = flag.String("config", "/etc/observability/config.yaml", "observability configuration file path")
)

func main() {
	flag.Parse()
	conf, err := config.InitConfig(*configPath)
	panicIf.Error(err)

	err = conf.Validate()
	panicIf.Error(err)

	var cfg *rest.Config

	if conf.BaseKubeConfig == "" {
		cfg, err = rest.InClusterConfig()
	} else {
		cfg, err = clientcmd.BuildConfigFromFlags("", conf.BaseKubeConfig)
	}
	panicIf.Error(err)

	baseKubeCli, err := kubernetes.NewForConfig(cfg)
	panicIf.Error(err)

	config, err := runtimeutil.GetGardenerKubeConfigFromBase(baseKubeCli)
	panicIf.Error(err)

	gardenCli, err := gardencoreclientset.NewForConfig(config)
	panicIf.Error(err)

	gardenKubeCli, err := kubernetes.NewForConfig(config)
	panicIf.Error(err)

	loggerCfg := &zaplog.Config{
		Level: conf.LogLevel,
	}

	logutil.InitZapLogger(loggerCfg)

	log := logutil.Logger()
	log.Info("observability startup configuration", zap.String("logLevel", conf.LogLevel), zap.String("project", *conf.GardenerProjectName))
	log.Info("starting observability controller", zap.String("logLevel", conf.LogLevel))

	slc := &controllers.ShootLoggingController{
		GardenCli:           gardenCli,
		Clientset:           baseKubeCli,
		Log:                 log,
		LokiIngressHostName: conf.LokiIngressHostName,
		LokiStackChartPath:  *conf.LokiStackChartPath,
		GardenerClient:      gardenKubeCli,
		GardenerProjectName: conf.GardenerProjectName,

		DashboardChartPath: *conf.DashboardChartPath,
		PortalAuth0Issuer:  *conf.PortalAuth0Issuer,
		PortalClientID:     *conf.PortalClientID,

		AwsESHost:            *conf.AwsESHost,
		AwsESPwd:             *conf.AwsESPwd,
		EventrouterChartPath: *conf.EventrouterChartPath,

		SlowQueryTiDBHost:     *conf.SlowQueryTiDBHost,
		SlowQueryTiDBUser:     *conf.SlowQueryTiDBUser,
		SlowQueryTiDBPassword: *conf.SlowQueryTiDBPassword,
		SlowQueryTiDBDatabase: *conf.SlowQueryTiDBDatabase,
		SlowQueryTiDBCA:       *conf.SlowQueryTiDBCA,
		SlowQueryTiDBCert:     *conf.SlowQueryTiDBCert,
		SlowQueryTiDBKey:      *conf.SlowQueryTiDBKey,
	}

	stop := make(chan struct{})
	gardener.StartGardenerController(log, runtimeutil.ShootNamespace(*conf.GardenerProjectName), gardenCli, slc.Delete, slc.Update, stop)

	<-stop
}
