package steps

import (
	"context"
	"fmt"

	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/caselib/pkg/model/ticdc"
	"go.uber.org/zap"
)

type redo struct {
	flag ticdc.RedoParams
}

func NewRedo(flag ticdc.RedoParams) Step {
	return &redo{
		flag: flag,
	}
}

func (s *redo) Execute(ctx context.Context) error {
	cdcHost, err := GetCDCHost(ctx)
	if err != nil {
		return err
	}

	result, err := cdcHost.Redo(s.flag)
	log.Info("run redo cmd finished", zap.Any("result", result), zap.Error(err))
	if err != nil {
		return err
	}

	if _, ok := s.flag.(*ticdc.RedoMetaFlags); ok {
		GetInner(ctx).Board().value = result.(*ticdc.RedoMeta)
	}
	return nil
}

func (s *redo) String() string {
	return fmt.Sprintf("redo: flag=%+v", s.flag)
}
