package operation

import (
	"github.com/tidbcloud/devops/api"
	clusterapi "github.com/tidbcloud/devops/api/cluster"
	opent "github.com/tidbcloud/devops/entity/operation"
)

type ListInstanceReq struct {
	api.PaginationReq

	Type         *string              `form:"type"`
	TargetID     *string              `form:"target_id"`
	Phase        *opent.InstancePhase `form:"phase"`
	Applicant    *string              `form:"applicant"`
	Operation    *string              `form:"operation"`
	CreateAfter  *int64               `form:"create_after"`
	CreateBefore *int64               `form:"create_before"`
}

type ListInstanceResp struct {
	api.BaseResp `json:",inline"`

	Total     int64             `json:"total"`
	Instances []*opent.Instance `json:"items"`
}

type GetInstanceReq struct {
}

type GetInstanceResp struct {
	api.BaseResp `json:",inline"`

	Instance *opent.Instance `json:"instance"`
}

type CreateInstanceAction struct {
	Name            string                  `json:"name"`
	StartPolicy     opent.ActionStartPolicy `json:"start_policy"`
	StartScheduleAt *int64                  `json:"start_schedule_at"`
}

type CreateInstanceReq struct {
	Type      opent.OperationTarget  `json:"type"`
	Operation string                 `json:"operation"`
	Reason    string                 `json:"reason"`
	Params    map[string]string      `json:"params"`
	Actions   []CreateInstanceAction `json:"actions"`
	IsDraft   bool                   `json:"is_draft"`

	ExecutionWindow *clusterapi.CreateOpsExecutionWindowReq `json:"execution_window"`
}

type CreateInstanceResp struct {
	api.BaseResp

	InstanceID *uint64 `json:"instance_id"`
}

type PreviewInstanceResp struct {
	api.BaseResp

	Advisories []Advisory `json:"advisories"`
}

type Advisory struct {
	Level   string `json:"level"`
	Message string `json:"message"`
}

type UpdateInstanceReq struct {
	Reason  *string                     `json:"reason,omitempty"`
	Params  *map[opent.ParamName]string `json:"params,omitempty"`
	Actions *[]CreateInstanceAction     `json:"actions,omitempty"` // actions to update, if empty
}

type FinishInstanceActionReq struct {
	Result opent.ActionStatus `json:"result"`
	Output string             `json:"output"`
}
