package cmd

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

func registerCRRFJobFunc(cmd *cobra.Command) {
	{
		var (
			clusterID       uint64
			tenantID        uint64
			projectID       uint64
			secondaryRegion string
		)
		suBcmd := &cobra.Command{
			Use:   "enable-crrf",
			Short: "enable CRRF (Cross-Region Replication based Failover) for a cluster",
			RunE: func(cmd *cobra.Command, args []string) error {
				if _, err := server.NewServer(cmd.Context(), server.ServerOption{
					EnableEventBusConsumer: false,
				}); err != nil {
					return err
				}
				ctx := log.WithTraceID(cmd.Context())
				app := container.Global()
				req := &domain.EnableCRRFReq{
					ClusterID:       clusterID,
					TenantID:        tenantID,
					ProjectID:       projectID,
					SecondaryRegion: secondaryRegion,
				}
				if err := app.CRRFModel.EnableCRRF(ctx, req); err != nil {
					log.GetLogger(ctx).Error("enable crrf failed", zap.Error(err))
					return err
				}
				log.GetLogger(ctx).Info("enable crrf success", zap.Uint64("clusterID", clusterID))
				return nil
			},
		}
		suBcmd.Flags().Uint64VarP(&clusterID, "cluster_id", "", 0, "cluster ID")
		suBcmd.Flags().Uint64VarP(&tenantID, "tenant_id", "", 0, "tenant ID")
		suBcmd.Flags().Uint64VarP(&projectID, "project_id", "", 0, "project ID")
		suBcmd.Flags().StringVarP(&secondaryRegion, "secondary_region", "", "", "secondary (DR) region for CRR bucket")
		cmd.AddCommand(suBcmd)
	}

	{
		var clusterID uint64
		suBcmd := &cobra.Command{
			Use:   "query-crrf",
			Short: "query CRRF status for a cluster",
			RunE: func(cmd *cobra.Command, args []string) error {
				if _, err := server.NewServer(cmd.Context(), server.ServerOption{
					EnableEventBusConsumer: false,
				}); err != nil {
					return err
				}
				ctx := log.WithTraceID(cmd.Context())
				app := container.Global()
				info, err := app.CRRFModel.QueryCRRF(ctx, clusterID)
				if err != nil {
					log.GetLogger(ctx).Error("query crrf failed", zap.Error(err))
					return err
				}
				log.GetLogger(ctx).Info("query crrf success",
					zap.Uint64("clusterID", clusterID),
					zap.String("status", string(info.Status)),
					zap.String("secondaryRegion", info.SecondaryRegion))
				return nil
			},
		}
		suBcmd.Flags().Uint64VarP(&clusterID, "cluster_id", "", 0, "cluster ID")
		cmd.AddCommand(suBcmd)
	}

	{
		var (
			clusterID uint64
			tenantID  uint64
			projectID uint64
		)
		suBcmd := &cobra.Command{
			Use:   "disable-crrf",
			Short: "disable CRRF for a cluster",
			RunE: func(cmd *cobra.Command, args []string) error {
				if _, err := server.NewServer(cmd.Context(), server.ServerOption{
					EnableEventBusConsumer: false,
				}); err != nil {
					return err
				}
				ctx := log.WithTraceID(cmd.Context())
				app := container.Global()
				req := &domain.DisableCRRFReq{
					ClusterID: clusterID,
					TenantID:  tenantID,
					ProjectID: projectID,
				}
				if err := app.CRRFModel.DisableCRRF(ctx, req); err != nil {
					log.GetLogger(ctx).Error("disable crrf failed", zap.Error(err))
					return err
				}
				log.GetLogger(ctx).Info("disable crrf success", zap.Uint64("clusterID", clusterID))
				return nil
			},
		}
		suBcmd.Flags().Uint64VarP(&clusterID, "cluster_id", "", 0, "cluster ID")
		suBcmd.Flags().Uint64VarP(&tenantID, "tenant_id", "", 0, "tenant ID")
		suBcmd.Flags().Uint64VarP(&projectID, "project_id", "", 0, "project ID")
		cmd.AddCommand(suBcmd)
	}
}

func init() {
	crrfCmd := &cobra.Command{Use: "crrf", Short: "CRRF (Cross-Region Replication based Failover) commands"}
	registerCRRFJobFunc(crrfCmd)
	jobCmd.AddCommand(crrfCmd)
}
