package event

import (
	apprent "github.com/tidbcloud/devops/entity/approval"
	"github.com/tidbcloud/devops/entity/operation"
)

var (
	OperationEventTypeCreate         EventType = "create"
	OperationEventTypeSubmit         EventType = "submit"
	OperationEventTypeUpdate         EventType = "update"
	OperationEventTypeSendApproval   EventType = "send_approval"
	OperationEventTypeFinishApproval EventType = "finish_approval"
	OperationEventTypeStartAction    EventType = "start_action"
	OperationEventTypeFinishAction   EventType = "finish_action"
	OperationEventTypeCancel         EventType = "cancel"
)

type OperationEventAction struct {
	Order operation.ActionOrder `json:"order"`
	Name  operation.ActionName  `json:"name"`
}

type OperationEventStartAction struct {
	OperationEventAction `json:",inline"`

	Manual bool `json:"manual"`
}

type OperationEventFinishAction struct {
	OperationEventAction `json:",inline"`

	Result operation.ActionStatus `json:"result"`
}

type OperationEventApprovalTask struct {
	User   string                     `json:"user"`
	Status apprent.ApprovalTaskStatus `json:"status"`
	At     string                     `json:"at"`
}

type OperationEventFinishApproval struct {
	Result apprent.ApprovalStatus       `json:"result"`
	Tasks  []OperationEventApprovalTask `json:"tasks,omitempty"`
}

type OperationEventUpdateInstance struct {
	Request any `json:"request,omitempty"` // the request to update the instance, can be nil
}

type OperationEventDetail struct {
	FinshApproval  *OperationEventFinishApproval `json:"finish_approval,omitempty"`
	StartAction    *OperationEventStartAction    `json:"start_action,omitempty"`
	FinishAction   *OperationEventFinishAction   `json:"finish_action,omitempty"`
	UpdateInstance *OperationEventUpdateInstance `json:"update_instance,omitempty"`
}

type OperationEvent struct {
	BaseEvent `json:",inline"`

	Operation string               `json:"operation,omitempty"`
	Details   OperationEventDetail `json:"details"`
}
