package dispatch

import "time"

type (
	DispatchTriggerStatus string
)

const (
	DispatchTriggerStatusPending    DispatchTriggerStatus = "pending"
	DispatchTriggerStatusProcessing DispatchTriggerStatus = "processing"
	DispatchTriggerStatusCompleted  DispatchTriggerStatus = "completed"
	DispatchTriggerStatusFailed     DispatchTriggerStatus = "failed"

	DispatchTriggerSourceTicketIngest = "ticket_ingest"

	DispatchTriggerSourceJiraAssignmentAssignee   = "jira_assignment_assignee"
	DispatchTriggerSourceJiraAssignmentL2Assignee = "jira_assignment_l2_assignee"
)

func IsJiraAssignmentTriggerSource(source string) bool {
	return source == DispatchTriggerSourceJiraAssignmentAssignee ||
		source == DispatchTriggerSourceJiraAssignmentL2Assignee
}

type DispatchTriggerInput struct {
	IssueKey string               `json:"issue_key"`
	PolicyID *uint64              `json:"policy_id,omitempty"`
	Dryrun   *DispatchDryrunInput `json:"dryrun,omitempty"`
}

type DispatchDryrunInput struct {
	OverwriteData ExecutionOverwriteData `json:"overwrite_data,omitempty"`
}

type DispatchTriggerOutput struct {
	ExecutionIDs     []uint64                         `json:"execution_ids"`
	PolicyRejections []DispatchTriggerPolicyRejection `json:"policy_rejections,omitempty"`
}

type DispatchTriggerPolicyRejection struct {
	PolicyID uint64 `json:"policy_id"`
	Reason   string `json:"reason"`
}

type DispatchTrigger struct {
	ID     uint64                `json:"id"`
	Source string                `json:"source"`
	Status DispatchTriggerStatus `json:"status"`

	CreatedAt     time.Time `json:"created_at"`
	AvailableAt   time.Time `json:"available_at"`
	FailureReason string    `json:"failure_reason"`

	Input  DispatchTriggerInput   `json:"input"`
	Output *DispatchTriggerOutput `json:"output,omitempty"`
}
