package main

// @Time    : 2024/8/21 14:31
// @Author  : lvhongmeng

import (
	"context"
	"flag"
	"fmt"
	"tcidm/api"
	"tcidm/commons/client"
	"tcidm/commons/config"
	"tcidm/metrics"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"github.com/tidbcloud/tiinf/monitor/titracing"
	"github.com/tidbcloud/tiinf/transport/http/tigin"
	"go.uber.org/zap"
)

const (
	componentName     = "regional_tcidm_service"
	defaultConfigPath = "/etc/dbaas/config.yaml"
)

// @title Regional Control Import Service API
// @version 1.0
// @description This is regional import server

// @host 127.0.0.1:8080
// @BasePath /api/v1/tcidm
func main() {
	// init jaeger
	_, err := titracing.InitJaeger("regional_tcidm_service")
	if err != nil {
		tilog.Panic(context.TODO(), "failed to init jaeger", zap.Error(err))
	}

	var configPath string
	flag.StringVar(&configPath, "config-path", defaultConfigPath, "DBaaS configuration file path")
	flag.Parse()
	ctx := context.Background()
	tilog.Info(ctx, "Start")

	// Load config
	err = config.InitConfig(configPath)
	if err != nil {
		// TODO: unexpected error like this, should we throw a alert/page, just log seems not enough ?
		tilog.Fatal(ctx, "Initialize configuration failed", zap.Error(err))
	}

	// k8s client
	centralConfig := config.Global()
	tilog.Info(ctx, "Config", zap.String("http-port", centralConfig.ServerConfig.HttpListenAddr), zap.String("metrics-port", centralConfig.ServerConfig.MetricsPort), zap.String("env", centralConfig.ServerConfig.Env))
	err = client.InitK8sClient(ctx, centralConfig.ServerConfig.KubeConfigPath)
	if err != nil {
		tilog.Fatal(ctx, "Initialize k8s client failed", zap.Error(err))
	}

	metrics.RegisterMetrics()

	startup(ctx, centralConfig)
}

func startup(ctx context.Context, centralConfig *config.CentralConfig) {
	serverConfig := centralConfig.ServerConfig

	/* metrics */
	mEng := tigin.Default()
	mEng.Any("/metrics", prometheusHandler())
	go mEng.Run("0.0.0.0:" + config.Global().ServerConfig.MetricsPort) //nolint:errcheck // no need check error

	ginEng := tigin.Default()
	api.Routers(ginEng)
	addr := serverConfig.HttpListenAddr
	tilog.Info(ctx, "serving HTTP Service", zap.String("address", addr))
	panic(fmt.Sprintf("HTTP Service died %+v", ginEng.Run(addr)))
}

func prometheusHandler() gin.HandlerFunc {
	h := promhttp.Handler()

	return func(c *gin.Context) {
		h.ServeHTTP(c.Writer, c.Request)
	}
}
