package app

import (
	"context"
	"time"

	"github.com/pingcap/log"
	"github.com/spf13/cobra"
	"github.com/tidbcloud/serverless-metering/pkg/query"
	"github.com/tidbcloud/serverless-metering/pkg/report"
	"github.com/tidbcloud/serverless-metering/pkg/repository"
	"go.uber.org/zap"
)

func registerJobFunc(cmd *cobra.Command) {
	debugQueryEngineCmd := &cobra.Command{
		Use:   "debug-query-engine",
		Short: "used for debug query engine",
		Run: func(cmd *cobra.Command, args []string) {
			offset, _ := cmd.Flags().GetInt("offset")
			runDebugQueryEngine(offset)
		},
	}
	debugQueryEngineCmd.Flags().Int("offset", 0, "offset hour to debug the query engine")

	debugMeteringManagerCmd := &cobra.Command{
		Use:   "debug-metering-manager",
		Short: "used for debug metering manager",
		Run: func(cmd *cobra.Command, args []string) {
			runDebugMeteringManager()
		},
	}

	cmd.AddCommand(debugQueryEngineCmd)
	cmd.AddCommand(debugMeteringManagerCmd)
}

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

func runDebugQueryEngine(offset int) {
	storage := initStorage(true)
	t := time.Now().Add(-time.Duration(offset) * time.Hour)
	ctx := context.TODO()
	_, err := query.NewDuckDBQueryEngine(ctx, storage, t.Unix(), 1)
	if err != nil {
		log.Fatal("failed to init query engine", zap.Error(err))
	}

	log.Info("please check duckdb temp directory for data")
}

func runDebugMeteringManager() {
	storage := initStorage(true)
	repo := repository.NewMetaClientClusterBranchRepo()
	manager, err := report.NewMeteringManager(storage, repo)
	if err != nil {
		log.Fatal("failed to init metering manager", zap.Error(err))
	}
	manager.Debug()
}
