package main

import (
	"flag"
	"log"
	"os"
	"path"
	"path/filepath"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"github.com/tidbcloud/api-gateway/ui/internal/api"
	"github.com/tidbcloud/api-gateway/ui/internal/controller"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

var (
	masterURL  string
	kubeconfig string
)

func main() {
	flag.StringVar(&kubeconfig, "kubeconfig", defaultKubeconfig(), "Path to a kubeconfig. Only required if out-of-cluster.")
	flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
	flag.Parse()

	cfg, err := rest.InClusterConfig()
	if err != nil {
		cfg, err = clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
		if err != nil {
			logrus.Fatalf("Error building kubeconfig: %s", err.Error())
		}
	}
	controller.Init(cfg)

	r := gin.Default()
	r.NoRoute(func(c *gin.Context) { c.File(path.Join("frontend", c.Request.URL.Path)) })
	r.POST("/api/v1/route", api.CreateRoute)
	r.GET("/api/v1/routes", api.ListRoutes)
	r.GET("/api/v1/route/:routeID", api.GetRoute)
	r.POST("/api/v1/route/:routeID", api.UpdateRoute)
	r.DELETE("/api/v1/route/:routeID", api.DeleteRoute)
	r.GET("/api/v1/namespaces", api.ListNamespaces)
	r.GET("/api/v1/namespace/:namespace/services", api.ListServices)
	r.GET("/api/v1/namespace/:namespace/service/:service/ports", api.ListServicePorts)
	r.GET("/api/v1/versions", api.ListVersions)

	log.Fatal(r.Run(":10000"))
}

func defaultKubeconfig() string {
	fname := os.Getenv("KUBECONFIG")
	if fname != "" {
		return fname
	}
	home, err := os.UserHomeDir()
	if err != nil {
		logrus.Warningf("failed to get home directory: %v", err)
		return ""
	}
	return filepath.Join(home, ".kube", "config")
}
