package main

import (
	"context"
	"flag"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/pingcap/test-infra/services/sdkserver/config"
	"github.com/pingcap/test-infra/services/sdkserver/diag"
)

var (
	ListenAddr string
)

const (
	RootSourceTypeTestbed      = "testbed"
	RootSourceTypeTestResource = "test-resource"
)

type RootSource struct {
	RootSourceType        string
	RootSourceTestbedName string
	RootSourceHandle      string
	RootSourceHandleFile  string
}

var defaultRootSource = RootSource{}

func init() {
	flag.StringVar(&ListenAddr, "l", ":8000", "listen addr")
	flag.StringVar(&defaultRootSource.RootSourceType, "root-type", RootSourceTypeTestbed, fmt.Sprintf("root source type, optional are %s, %s", RootSourceTypeTestbed, RootSourceTypeTestResource))
	flag.StringVar(&defaultRootSource.RootSourceTestbedName, "handle-testbed-name", "", "testbed name")
	flag.StringVar(&defaultRootSource.RootSourceHandle, "handle", "", "root source handle")
	flag.StringVar(&defaultRootSource.RootSourceHandleFile, "handle-file", "output", "root source handle file")
	flag.StringVar(&config.DefaultConfig.RMSURL, "rms-url", "", "url of rms service")
	flag.StringVar(&config.DefaultConfig.DiagServerURL, "diag-server-url", "", "url of diagserver service")
	flag.StringVar(&config.DefaultConfig.DiagCollectStartTime, "diag-collect-start", time.Now().Add(-24*time.Hour).Format(time.RFC3339), "start timepoint when diag collecting timeseries data")
}

func main() {
	flag.Parse()
	rootrsc, err := NewRootResource(defaultRootSource)
	if err != nil {
		println(err.Error())
		os.Exit(1)
	}

	diagURL, err := url.Parse(config.DefaultConfig.DiagServerURL)
	if err != nil {
		println(err.Error())
		os.Exit(1)
	}
	diag.InitDefaultClient(diagURL)

	var svr = NewServer(Handler{rootSource: rootrsc})
	go func() {
		if err := svr.Start(ListenAddr); err != nil && err != http.ErrServerClosed {
			svr.Logger.Fatal("shutting down the server")
		}
	}()
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
	<-quit
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	if err := svr.Shutdown(ctx); err != nil {
		svr.Logger.Fatal(err)
	}
}
