package k8supgrade

import (
	"github.com/tidbcloud/devops/api"
	entity "github.com/tidbcloud/devops/entity/k8supgrade"
)

type ListTasksFilter struct {
	Status        []string `form:"status" json:"status" enums:"pending,reviewing,running,cancelled,completed" binding:"dive,oneof=pending reviewing running cancelled completed"`
	EOSVersion    []string `form:"eos_version" json:"eos_version"`
	CloudProvider []string `form:"cloud_provider" json:"cloud_provider" binding:"dive,oneof=aws gcp" enums:"aws,gcp"`
}

type ListTasksReq struct {
	api.PaginationReq
	ListTasksFilter

	Search string         `form:"search" json:"search"`
	SortBy api.SortByType `form:"sort_by" json:"sort_by" binding:"omitempty,oneof=timezone created_at"`
	Order  api.OrderType  `form:"order" json:"order" binding:"omitempty,oneof=asc desc"`
}

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

	Total int64          `json:"total"`
	Tasks []*entity.Task `json:"items"`
}

type GetTaskResp struct {
	entity.Task `json:",inline"`
}

type CreateTaskReq struct {
	Name            string `json:"name" binding:"required"`
	CloudProvider   string `json:"cloud_provider" binding:"required"`
	EOSVersion      string `json:"eos_version" binding:"required"`
	MaxRestartTimes uint32 `json:"max_restart_times"`
	Deadline        int64  `json:"deadline" binding:"required"`
	// SelectorType indicates the mutually exclusive selector type.
	// - internal: internal tenants only
	// - non_prod: non-production clusters only
	// - by_region: match business region
	// - by_tenant_ids: match tenant IDs
	// - by_project_ids: match project IDs
	// - by_tidb_cluster_ids: match TiDB cluster IDs
	// - by_k8s_names: match k8s names
	SelectorType string `json:"selector_type"`
	// SelectorValue stores selector-specific conditions in JSON.
	// It can be empty for some selector types.
	SelectorValue string `json:"selector_value"`
}

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

	ID *uint64 `json:"id"`
}

type UpdateTaskReq struct {
	Name            *string `json:"name,omitempty"`
	MaxRestartTimes *uint32 `json:"max_restart_times,omitempty"`
	Deadline        *int64  `json:"deadline,omitempty"`
}

type CloseTaskReq struct {
	Reason string `json:"reason" binding:"required"`
} // @name k8supgrade.CloseTaskReq

type GetTaskK8sClusterResp struct {
	K8sCluster entity.K8sCluster `json:"k8s_cluster,inline"`
}

type UpdateTaskK8sClusterReq struct {
	ID                     uint64 `json:"id"`
	Name                   string `json:"name"`
	TaskID                 uint64 `json:"task_id"`
	CloudProvider          string `json:"cloud_provider"`
	UpgradeOperationStatus string `json:"upgrade_operation_status"`
	UpgradeOperationCR     string `json:"upgrade_operation_cr"`
	IsExcluded             bool   `json:"is_excluded"`
	Version                uint64 `json:"version"`
}

type UpdateTaskK8sClusterResp struct {
}

type UpdateK8sUpgradeTaskClusterAutoGenerationReq struct {
	DisableAutoGeneration bool `json:"disable_auto_generation"`
}

type UpdateK8sUpgradeTaskClusterAutoGenerationResp struct {
}

type ExcludeK8sUpgradeTaskClusterResp struct{}

type CancelUpgradeK8sClusterResp struct{}

func (req UpdateTaskK8sClusterReq) ToK8sClusterEntity() *entity.K8sCluster {
	return &entity.K8sCluster{
		ID:                     req.ID,
		Name:                   req.Name,
		CloudProvider:          req.CloudProvider,
		TaskID:                 req.TaskID,
		UpgradeOperationStatus: req.UpgradeOperationStatus,
		IsExcluded:             req.IsExcluded,
		UpgradeOperationCR:     req.UpgradeOperationCR,
		Version:                req.Version,
	}
}
