package maintenance

import "time"

type (
	ClusterMaintenanceTaskStatus      string // @name maintenance.ClusterMaintenanceTaskStatus
	ClusterMaintenanceExecutionStatus string // @name maintenance.ClusterMaintenanceExecutionStatus
)

const (
	ClusterMaintenanceTaskStatusPending ClusterMaintenanceTaskStatus = "Pending"
	ClusterMaintenanceTaskStatusRunning ClusterMaintenanceTaskStatus = "Running"
	ClusterMaintenanceTaskStatusClosed  ClusterMaintenanceTaskStatus = "Closed"

	ClusterMaintenanceExecutionStatusPending  ClusterMaintenanceExecutionStatus = "Pending"
	ClusterMaintenanceExecutionStatusRunning  ClusterMaintenanceExecutionStatus = "Running"
	ClusterMaintenanceExecutionStatusDone     ClusterMaintenanceExecutionStatus = "Done"
	ClusterMaintenanceExecutionStatusCanceled ClusterMaintenanceExecutionStatus = "Canceled"
)

type ClusterMaintenanceInRepo struct {
	ID uint64 `json:"id"`

	LarkNotifiedAt           *time.Time `json:"lark_notified_at"`
	InstanceID               uint64     `json:"instance_id"` // the id of MaintenanceTask in the core svc
	ScheduledApplyTime       *time.Time `json:"scheduled_apply_time"`
	LastNotifiedCustomerDate *time.Time `json:"last_notified_customer_date"`
} // @name maintenance.ClusterMaintenanceInRepo

type ClusterMaintenanceTask struct {
	ID           uint64                       `json:"id"`
	ProjectID    uint64                       `json:"project_id,string"`
	CreateAt     time.Time                    `json:"create_at"`
	Description  string                       `json:"description"`
	ScheduleTime time.Time                    `json:"schedule_time"`
	Deadline     *time.Time                   `json:"deadline"`
	Status       ClusterMaintenanceTaskStatus `json:"status"`

	Executions []ClusterMaintenanceExecution `json:"executions"`
} // @name maintenance.ClusterMaintenanceTask

type ClusterMaintenanceExecution struct {
	ID           uint64                            `json:"id"`
	TaskID       uint64                            `json:"task_id"` // the id of MaintenanceTaskExecution in the core svc
	ClusterID    uint64                            `json:"cluster_id,string"`
	CancelReason string                            `json:"cancel_reason"`
	Status       ClusterMaintenanceExecutionStatus `json:"status"`
} // @name maintenance.ClusterMaintenanceExecution

type ClusterMaintenance struct {
	ClusterMaintenanceInRepo `json:",inline"`

	Task ClusterMaintenanceTask `json:"task"`
} // @name maintenance.ClusterMaintenance
