package clusteraction

import (
	"context"
	"fmt"

	rpproto "github.com/tidbcloud/dataflow-service/idl/pbgen/proto/replay"
	opent "github.com/tidbcloud/devops/entity/operation"
	"github.com/tidbcloud/devops/pkg/service/operation/actions"
	"google.golang.org/protobuf/encoding/protojson"
)

var (
	ActionUpdateTrafficReplay opent.ActionMetadata = opent.ActionMetadata{
		Name: "UpdateTrafficReplay",
		Type: opent.ActionTypeAuto,
	}
)

type UpdateTrafficReplay struct {
	actions.BaseAction
	comps *actions.Components
}

func NewUpdateTrafficReplay(comps *actions.Components) actions.AutoAction {
	return &UpdateTrafficReplay{comps: comps}
}

func (a *UpdateTrafficReplay) Metadata() opent.ActionMetadata {
	return ActionUpdateTrafficReplay
}

func (a *UpdateTrafficReplay) PreCheck(ctx context.Context, instance *opent.Instance) error {
	_, err := a.getParam(ctx, instance)
	if err != nil {
		return err
	}

	return nil
}

func (a *UpdateTrafficReplay) Start(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	req, err := a.getParam(ctx, instance)
	if err != nil {
		return actions.FailedActionResult(err), nil
	}

	resp, err := a.comps.DataflowCli.Replay.UpdateReplay(ctx, req)
	if err != nil {
		return actions.FailedActionResult(err), nil
	}

	return actions.SucceededActionResult(map[opent.OutputName]string{
		opent.OutputTrafficReplayID: resp.Replay.ReplayId,
	}), nil
}

func (a *UpdateTrafficReplay) Result(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	return actions.SucceededActionResult(nil), nil

}

func (a *UpdateTrafficReplay) OnCancel(ctx context.Context, instance *opent.Instance) (bool, error) {
	return false, nil
}

func (a *UpdateTrafficReplay) getParam(ctx context.Context, instance *opent.Instance) (*rpproto.UpdateReplayRequest, error) {
	data := instance.Params[opent.ParamUpdateTrafficReplayRequest]
	if data == "" {
		return nil, fmt.Errorf("missing required param")
	}

	req := &rpproto.UpdateReplayRequest{}
	err := protojson.Unmarshal([]byte(data), req)
	if err != nil {
		return nil, fmt.Errorf("unmarshal param failed: %w", err)
	}

	return req, nil
}
