package cmd

import (
	"fmt"
	"time"

	"github.com/spf13/cobra"
	"github.com/tidbcloud/dataflow-service/app/container"
	bootstarpSerer "github.com/tidbcloud/dataflow-service/internal/cmd/bootstrap/server"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
)

func registerQueryMetricsJobFun(cmd *cobra.Command) {
	{
		var clusterID uint64
		var metric string
		subCmd := &cobra.Command{
			Use:   "query",
			Short: "query metrics",
			RunE: func(cmd *cobra.Command, args []string) error {
				if _, err := bootstarpSerer.NewServer(cmd.Context(), bootstarpSerer.ServerOption{
					EnableEventBusConsumer: false,
				}); err != nil {
					return err
				}
				ctx := log.WithTraceID(cmd.Context())
				logger := log.GetLogger(ctx)
				app := container.Global()
				cluster, err := app.CoreGrpcClient.GetAvailableClusterByID(ctx, clusterID)
				if err != nil {
					logger.Error("get cluster error", zap.Error(err))
					return err
				}
				metricExpr := fmt.Sprintf("%s", metric)
				resp, err := app.InfraMetrics.QueryClusterMetrics(ctx, cluster, metricExpr, time.Now())
				if err != nil {
					logger.Error("query metrics error", zap.Error(err))
					return err
				}
				logger.Info("query metrics successfully",
					zap.Uint64("cluster_id", clusterID),
					zap.String("metric", metric),
					zap.ByteString("value", resp))
				return nil
			},
		}
		subCmd.Flags().StringVarP(&metric, "metric", "", "", "")
		subCmd.Flags().Uint64VarP(&clusterID, "clusterID", "", 0, "")
		cmd.AddCommand(subCmd)
	}
	{
		var clusterID uint64
		var metric string
		subCmd := &cobra.Command{
			Use:   "query_range",
			Short: "query range metrics",
			RunE: func(cmd *cobra.Command, args []string) error {
				if _, err := bootstarpSerer.NewServer(cmd.Context(), bootstarpSerer.ServerOption{
					EnableEventBusConsumer: false,
				}); err != nil {
					return err
				}
				ctx := log.WithTraceID(cmd.Context())
				logger := log.GetLogger(ctx)
				app := container.Global()
				cluster, err := app.CoreGrpcClient.GetAvailableClusterByID(ctx, clusterID)
				if err != nil {
					logger.Error("get cluster error", zap.Error(err))
					return err
				}
				metricExpr := fmt.Sprintf("%s", metric)
				resp, err := app.InfraMetrics.QueryRangeClusterMetrics(ctx, cluster, metricExpr)
				if err != nil {
					logger.Error("query range metrics error", zap.Error(err))
					return err
				}
				logger.Info("query range metrics successfully",
					zap.Uint64("cluster_id", clusterID),
					zap.String("metric", metric),
					zap.ByteString("value", resp))
				return nil
			},
		}
		subCmd.Flags().StringVarP(&metric, "metric", "", "", "")
		subCmd.Flags().Uint64VarP(&clusterID, "clusterID", "", 0, "")
		cmd.AddCommand(subCmd)
	}
}

func init() {
	queryMetricsCmd := &cobra.Command{
		Use:   "query_metrics",
		Short: "query metrics cmd",
		PreRunE: func(cmd *cobra.Command, args []string) error {
			return nil
		},
	}

	registerQueryMetricsJobFun(queryMetricsCmd)
	jobCmd.AddCommand(queryMetricsCmd)
}
