package app

import (
	"github.com/pingcap/log"
	"github.com/spf13/cobra"
	"github.com/tidbcloud/serverless-service/internal/config"
	"github.com/tidbcloud/serverless-service/internal/jobs"
	"go.uber.org/zap"
)

func registerJobFunc(cmd *cobra.Command) {
	syncClusterRUModeCmd := &cobra.Command{
		Use:   "sync-cluster-rumode",
		Short: "sync ru modes of existing serverless clusters into cluster repo",
		Run: func(cmd *cobra.Command, args []string) {
			config.SetWorkMode(config.WorkModeOnetimeJob)
			s := NewServer()
			if err := s.Setup(); err != nil {
				log.Fatal("failed to setup", zap.Error(err))
			}

			if err := jobs.SyncClusterRUMode(cmd.Context()); err != nil {
				log.Fatal("failed to sync cluster ru mode", zap.Error(err))
			}
			log.Info("run sync-cluster-rumode succeed")
		},
	}

	sendEmailCmd := &cobra.Command{
		Use:   "send-email",
		Short: "send expensive sql email to customer",
		Run: func(cmd *cobra.Command, args []string) {
			config.SetWorkMode(config.WorkModeOnetimeJob)
			orgs, _ := cmd.Flags().GetString("orgs")
			excludeOrgs, _ := cmd.Flags().GetString("excludeOrgs")
			preview, _ := cmd.Flags().GetBool("preview")

			s := NewServer()
			if err := s.Setup(); err != nil {
				log.Fatal("failed to setup", zap.Error(err))
			}

			if err := jobs.SendEmail(cmd.Context(), orgs, excludeOrgs, preview); err != nil {
				log.Fatal("failed to send email", zap.Error(err))
			}
			log.Info("run send email succeed")
		},
	}
	sendEmailCmd.Flags().String("orgs", "", "comma separated org ids to send email")
	sendEmailCmd.Flags().String("excludeOrgs", "", "comma separated org ids excluded to not send email")
	sendEmailCmd.Flags().Bool("preview", false, "preview email will be sent to a specific preview org")

	cmd.AddCommand(syncClusterRUModeCmd)
	cmd.AddCommand(sendEmailCmd)
}

func init() {
	jobsCmd := &cobra.Command{
		Use:   "exec",
		Short: "execute customized jobs",
	}
	registerJobFunc(jobsCmd)
	rootCmd.AddCommand(jobsCmd)
}
