package cmd

import (
	"context"
	"fmt"
	"os"
	"time"

	"github.com/pingcap/test-infra/common/client/tcms"
	tcmsClient "github.com/pingcap/test-infra/common/client/tcms/client"
	"github.com/pingcap/test-infra/common/client/tcms/taskruns"
	"github.com/pingcap/test-infra/tools/tcctl/pkg/config"
	"github.com/pingcap/test-infra/tools/tcctl/pkg/svc_task"
	"github.com/spf13/cobra"
)

var svcCmd = &cobra.Command{Use: "svc"}

var svcTaskRunCmd = &cobra.Command{
	Use:   "run <taskname>",
	Short: "Run test-infra exported service",
	Long:  "runsvc <taskname> -a arg=val,arg2=val2",
	RunE: func(cmd *cobra.Command, args []string) error {
		if len(args) != 1 {
			return fmt.Errorf("invalid task name")
		}
		var cfg svc_task.RunnerCfg
		var spec svc_task.TaskSpec
		var err error
		spec.TaskName = args[0]
		spec.Args = arguments
		spec.OutputFile = outputFile
		cfg.Client = clientFromConfig(serverConfig)
		cfg.PollInterval, err = time.ParseDuration(pollInterval)
		if err != nil {
			return err
		}
		cfg.Timeout, err = time.ParseDuration(timeoutStr)
		if err != nil {
			return err
		}
		out := svc_task.Run(context.TODO(), cfg, spec)
		os.Exit(out.ExitCode)
		return nil
	},
	SilenceErrors: true,
}

func clientFromConfig(cfg config.ApiServerConfig) taskruns.SvcTaskRunClient {
	return tcms.NewTcmsClientSet(tcmsClient.TcmsClientCfg{BaseUrl: cfg.TcmsHost, Token: cfg.Token}).SvcTaskRunClient()
}

var (
	outputFile   string
	arguments    map[string]string
	timeoutStr   string
	pollInterval string
)

func init() {
	rootCmd.AddCommand(svcCmd)
	svcCmd.AddCommand(svcTaskRunCmd)
	svcTaskRunCmd.Flags().StringToStringVarP(&arguments, "arg", "a", nil, "arguments to pass")
	svcTaskRunCmd.Flags().StringVarP(&outputFile, "output", "o", "", "output file name, - means stdout")
	svcTaskRunCmd.Flags().StringVar(&timeoutStr, "timeout", "1h", "wait timeout")
	svcTaskRunCmd.Flags().StringVar(&pollInterval, "interval", "15s", "poll interval")
}
