package instance

import (
	"github.com/tidbcloud/devops/entity/event"
	opent "github.com/tidbcloud/devops/entity/operation"
)

type actorWhenDraft struct {
	*baseActor
}

func (a *actorWhenDraft) Submit() error {
	ctx := a.Context

	// transition status to 'created'
	err := a.PatchInstance(ctx,
		func(current *opent.Instance) error {
			current.Phase = opent.InstancePhaseCreated
			return nil
		},
	)
	return err
}

func (a *actorWhenDraft) Update(param UpdateInstanceParam) error {
	ctx := a.Context

	err := a.PatchInstance(ctx,
		func(current *opent.Instance) error {
			if param.Reason != nil {
				current.Reason = *param.Reason
			}
			if param.Params != nil {
				current.Params = *param.Params
			}
			if param.Actions != nil {
				for _, actInParam := range *param.Actions {
					for i, actInIns := range current.Actions {
						if actInIns.Name == actInParam.Name {
							actInIns.StartPolicy = actInParam.StartPolicy
							actInIns.StartScheduleAt = actInParam.StartScheduleAt
							current.Actions[i] = actInIns
							break
						}
					}
				}
			}
			return nil
		},
	)

	a.EventDetail.UpdateInstance = &event.OperationEventUpdateInstance{
		Request: param,
	}

	return err
}

func (a *actorWhenDraft) Cancel() error {
	return a.cancel()
}
