package main

import (
	"flag"
	"fmt"

	"github.com/pingcap/log"
	"github.com/tidbcloud/aws-shared-provider/pkg/opsservice/pkg/config"
	"github.com/tidbcloud/aws-shared-provider/pkg/opsservice/pkg/server"
	"github.com/tidbcloud/aws-shared-provider/pkg/opsservice/pkg/service/elastic/image"
	"go.uber.org/zap"
	restclient "k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	ctrl "sigs.k8s.io/controller-runtime"
)

var (
	serverAddr string
	tlsCert    string
	tlsKey     string

	enableLarkMsg  bool
	larkWebhookURL string

	scheduleCron string

	clusterCertDir   string
	managerServerURL string
)

const (
	defaultLarkWebhookURL = "https://open.feishu.cn/open-apis/bot/v2/hook/fc127340-462c-4f7b-aa7d-2fa87d1bff3e"
)

func init() {
	flag.StringVar(&serverAddr, "server-addr", ":9088", "the address of meta server")
	flag.StringVar(&tlsCert, "tls-cert", "/server-cert/tls.crt", "the tls cert file path")
	flag.StringVar(&tlsKey, "tls-key", "/server-cert/tls.key", "the tls key file path")
	flag.BoolVar(&enableLarkMsg, "enable-lark-msg", true, "enable lark message notification")
	flag.StringVar(&larkWebhookURL, "lark-webhook-url", defaultLarkWebhookURL, "lark webhook URL")
	flag.StringVar(&scheduleCron, "schedule-cron", image.DefaultScheduleCron, "cron expression for daily image report")
	flag.StringVar(&clusterCertDir, "cluster-cert-dir", "/cluster-cert", "directory containing mTLS certs for manager-server")
	flag.StringVar(&managerServerURL, "manager-server-url", "https://manager-server.tidb-admin.svc:8000", "manager-server base URL")
}

func main() {
	flag.Parse()
	log.Info("[config] config loaded",
		zap.String("server-addr", serverAddr),
	)

	kubeConfig, err := getKubeConfig()
	if err != nil {
		log.Fatal("[server] failed to get kube config", zap.Error(err))
	}

	cfg := &config.Config{
		ServerAddr: serverAddr,
		KubeConfig: kubeConfig,
		TlsCert:    tlsCert,
		TlsKey:     tlsKey,

		EnableLarkMsg:  enableLarkMsg,
		LarkWebhookURL: larkWebhookURL,
		ScheduleCron:   scheduleCron,

		ClusterCertDir:   clusterCertDir,
		ManagerServerURL: managerServerURL,
	}

	svr, err := server.New(cfg)
	if err != nil {
		log.Fatal("[server] failed to create ops service", zap.Error(err))
	}

	if err := svr.Start(ctrl.SetupSignalHandler()); err != nil {
		log.Fatal("[server] failed to start ops service", zap.Error(err))
	}
}

func getKubeConfig() (*restclient.Config, error) {
	kubeConfigPath := flag.Lookup("kubeconfig").Value.String()
	kubeConfig, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
	if err != nil {
		return nil, fmt.Errorf("can't parse kubeconfig: %w", err)
	}
	kubeConfig.QPS = 30
	kubeConfig.Burst = 70
	return kubeConfig, nil
}
