package main

import (
	"flag"
	"net/http"
	"path/filepath"

	"github.com/pingcap/log"
	"github.com/pingcap/tidb-operator/pkg/client/clientset/versioned"
	"go.uber.org/zap"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

const (
	tlsDir = `/run/secrets/tls`
)

var (
	kubeConfig  string
	kubeCli     kubernetes.Interface
	operatorCli versioned.Interface
)

func init() {
	flag.StringVar(&kubeConfig, "kubeconfig", "", "the kubeconfig file path")
	flag.Parse()
}

func main() {
	var cfg *rest.Config
	var err error
	if kubeConfig == "" {
		cfg, err = rest.InClusterConfig()
	} else {
		cfg, err = clientcmd.BuildConfigFromFlags("", kubeConfig)
	}
	if err != nil {
		log.Fatal("failed to get rest config", zap.Error(err))
	}
	kubeCli, err = kubernetes.NewForConfig(cfg)
	if err != nil {
		log.Fatal("failed to create kubernetes Clientset", zap.Error(err))
	}
	operatorCli, err = versioned.NewForConfig(cfg)
	if err != nil {
		log.Fatal("failed to create operator Clientset", zap.Error(err))
	}

	certPath := filepath.Join(tlsDir, corev1.TLSCertKey)
	keyPath := filepath.Join(tlsDir, corev1.TLSPrivateKeyKey)

	mux := http.NewServeMux()
	mux.Handle("/validate", admitFuncHandler(admitDeleteTiDBPods))
	server := &http.Server{
		Addr:    ":8443",
		Handler: mux,
	}
	err = server.ListenAndServeTLS(certPath, keyPath)
	if err != nil {
		log.Fatal("failed to listen and serve TLS", zap.Error(err))
	}
}
