package main

import (
	"context"
	"flag"
	"strings"

	"github.com/pingcap/log"
	"github.com/pingcap/tidb/pkg/util"
	"github.com/tidbcloud/aws-shared-provider/pkg/metaserver/config"
	"github.com/tidbcloud/aws-shared-provider/pkg/metaserver/server"
	"go.uber.org/zap"
)

var (
	endpoints  string
	key        string
	cert       string
	cacert     string
	serverAddr string

	cloudProviderType string
	rdsSecretArn      string
	kubeClusterName   string
	region            string
)

func init() {
	flag.StringVar(&endpoints, "endpoints", "serverless-cluster-pd.tidb-serverless.svc:2379",
		"the etcd addresses, separated by commas")
	flag.StringVar(&key, "key", "", "path of file that contains X509 key in PEM format")
	flag.StringVar(&cert, "cert", "", "path of file that contains X509 certificate in PEM format")
	flag.StringVar(&cacert, "cacert", "", "path of file that contains list of trusted CAs")
	flag.StringVar(&serverAddr, "server-addr", ":9088", "the address of meta server")

	flag.StringVar(&cloudProviderType, "cloud-provider-type", "", "the cloud provider type")
	flag.StringVar(&rdsSecretArn, "rds-secret-arn", "", "the ARN of the RDS secret")
	flag.StringVar(&kubeClusterName, "kube-cluster-name", "", "the name of the k8s cluster")
	flag.StringVar(&region, "region", "", "the region of the cluster")
}

func main() {
	flag.Parse()
	splitEndpoints := strings.Split(endpoints, ",")
	if len(splitEndpoints) == 0 {
		log.Fatal("[config] no valid endpoints provided")
	}
	tlsConfig, err := util.NewTLSConfig(
		util.WithCAPath(cacert),
		util.WithCertAndKeyPath(
			cert,
			key,
		),
	)
	if err != nil {
		log.Fatal("[config] failed to load tls config", zap.Error(err))
	}

	log.Info("[config] config loaded",
		zap.Strings("endpoints", splitEndpoints),
		zap.Bool("tls", tlsConfig != nil),
		zap.String("server-addr", serverAddr),
	)
	svr, err := server.New(&config.Config{
		Endpoints:  splitEndpoints,
		TLSConfig:  tlsConfig,
		ServerAddr: serverAddr,

		CloudProviderType: cloudProviderType,
		RdsSecretArn:      rdsSecretArn,
		Region:            region,
		KubeClusterName:   kubeClusterName,
	})
	if err != nil {
		log.Fatal("[server] failed to create meta server", zap.Error(err))
	}
	if err := svr.Start(context.Background()); err != nil {
		log.Fatal("[server] failed to start meta server", zap.Error(err))
	}
}
