package auto

import (
	"github.com/shiningrush/fastflow/pkg/entity/run"
	crrfModel "github.com/tidbcloud/dataflow-service/app/models/crrf"
	backupRepo "github.com/tidbcloud/dataflow-service/app/repo/backup"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
	"github.com/tidbcloud/dataflow-service/app/workflow"
)

// ── Disable from PiTR DAG ─────────────────────────────────────────────────

type AutoCRRFDisablePitParams struct {
	PitBackupSwitchID uint64 `json:"pit_backup_switch_id"`
}

type autoCRRFDisableFromPitAction struct {
	autoCRRFDisableBase
	pitSwitchRepo backupRepo.PitBackupSwitchRepo
}

func NewAutoCRRFDisableFromPitAction(
	pitSwitchRepo backupRepo.PitBackupSwitchRepo,
	crrfModel crrfModel.CRRFModel,
) *autoCRRFDisableFromPitAction {
	return &autoCRRFDisableFromPitAction{
		autoCRRFDisableBase: autoCRRFDisableBase{crrfModel: crrfModel},
		pitSwitchRepo:       pitSwitchRepo,
	}
}

func (a *autoCRRFDisableFromPitAction) Name() string {
	return workflow.ActionAutoCRRFDisableFromPit
}

func (a *autoCRRFDisableFromPitAction) ParameterNew() interface{} {
	return &AutoCRRFDisablePitParams{}
}

func (a *autoCRRFDisableFromPitAction) Run(eCtx run.ExecuteContext, params interface{}) error {
	p := params.(*AutoCRRFDisablePitParams)
	pitSwitch, bizErr := a.pitSwitchRepo.Load(eCtx.Context(), p.PitBackupSwitchID)
	if bizErr != nil {
		return bizErr
	}
	return a.run(eCtx, uint64(pitSwitch.ClusterID))
}

// RunAfter polls QueryCRRF until disabled.
func (a *autoCRRFDisableFromPitAction) RunAfter(eCtx run.ExecuteContext, params interface{}) error {
	p := params.(*AutoCRRFDisablePitParams)
	pitSwitch, bizErr := a.pitSwitchRepo.Load(eCtx.Context(), p.PitBackupSwitchID)
	if bizErr != nil {
		return bizErr
	}
	return a.poll(eCtx, uint64(pitSwitch.ClusterID))
}

// ── Disable from dual-region DAG ──────────────────────────────────────────

type AutoCRRFDisableDualRegionParams struct {
	BackupSettingID uint64 `json:"backup_setting_id"`
}

type autoCRRFDisableFromDualRegionAction struct {
	autoCRRFDisableBase
	backupSettingRepo backupRepo.BackupSettingRepo
}

func NewAutoCRRFDisableFromDualRegionAction(
	backupSettingRepo backupRepo.BackupSettingRepo,
	crrfModel crrfModel.CRRFModel,
) *autoCRRFDisableFromDualRegionAction {
	return &autoCRRFDisableFromDualRegionAction{
		autoCRRFDisableBase: autoCRRFDisableBase{crrfModel: crrfModel},
		backupSettingRepo:   backupSettingRepo,
	}
}

func (a *autoCRRFDisableFromDualRegionAction) Name() string {
	return workflow.ActionAutoCRRFDisableFromDualRegion
}

func (a *autoCRRFDisableFromDualRegionAction) ParameterNew() interface{} {
	return &AutoCRRFDisableDualRegionParams{}
}

func (a *autoCRRFDisableFromDualRegionAction) Run(eCtx run.ExecuteContext, params interface{}) error {
	p := params.(*AutoCRRFDisableDualRegionParams)
	bs, bizErr := a.backupSettingRepo.Load(eCtx.Context(), entity.ID(p.BackupSettingID))
	if bizErr != nil {
		return bizErr
	}
	return a.run(eCtx, uint64(bs.ClusterID))
}

// RunAfter polls QueryCRRF until disabled.
func (a *autoCRRFDisableFromDualRegionAction) RunAfter(eCtx run.ExecuteContext, params interface{}) error {
	p := params.(*AutoCRRFDisableDualRegionParams)
	bs, bizErr := a.backupSettingRepo.Load(eCtx.Context(), entity.ID(p.BackupSettingID))
	if bizErr != nil {
		return bizErr
	}
	return a.poll(eCtx, uint64(bs.ClusterID))
}
