package client

import (
	"database/sql"
	"time"
)

var StatusMapping = map[string][]string{
	"Running":   {"RUNNING", "RUNNING", "CONFIGURING", "COMPLETING", "BUILD"},
	"Succeeded": {"COMPLETED", "ACTIVE"},
	"Failed":    {"FAILED", "TIMEOUT", "DEADLINE", "OUT_OF_MEMORY", "BOOT_FAIL", "CANCELLED"},
}

type PullTaskInfoReq struct {
	AdapterId int64 `form:"adapterId"`
}

type PullTaskInfoResp struct {
	HpcInfoList   []*HpcInfo   `json:"HpcInfoList,omitempty"`
	CloudInfoList []*CloudInfo `json:"CloudInfoList,omitempty"`
	AiInfoList    []*AiInfo    `json:"AiInfoList,omitempty"`
	VmInfoList    []*VmInfo    `json:"VmInfoList,omitempty"`
}

type PushTaskInfoReq struct {
	AdapterId     int64        `json:"adapterId"`
	HpcInfoList   []*HpcInfo   `json:"HpcInfoList,omitempty,optional"`
	CloudInfoList []*CloudInfo `json:"CloudInfoList,omitempty,optional"`
	AiInfoList    []*AiInfo    `json:"AiInfoList,omitempty,optional"`
	VmInfoList    []*VmInfo    `json:"VmInfoList,omitempty,optional"`
}

type PushTaskInfoResp struct {
	Code int64  `json:"code"`
	Msg  string `json:"msg"`
}

type PushResourceInfoReq struct {
	AdapterId     int64           `json:"adapterId"`
	ResourceStats []ResourceStats `json:"resourceStats"`
}

type PushResourceInfoResp struct {
	Code int64  `json:"code"`
	Msg  string `json:"msg"`
}
type NoticeInfo struct {
	AdapterId   int64     `json:"adapterId"`
	AdapterName string    `json:"adapterName"`
	ClusterId   int64     `json:"clusterId"`
	ClusterName string    `json:"clusterName"`
	NoticeType  string    `json:"noticeType"`
	TaskId      int64     `json:"taskId"`
	TaskName    string    `json:"taskName"`
	Incident    string    `json:"incident"`
	CreatedTime time.Time `json:"createdTime"`
}

type ListNoticeReq struct {
}

type ListNoticeResp struct {
	Code int64        `json:"code"`
	Msg  string       `json:"msg"`
	Data []NoticeInfo `json:"data"`
}

type PushNoticeReq struct {
	NoticeInfo NoticeInfo `json:"noticeInfo"`
}

type PushNoticeResp struct {
	Code int64  `json:"code"`
	Msg  string `json:"msg"`
}

type HpcInfo struct {
	Id          int64        `json:"id"`         // id
	TaskId      int64        `json:"task_id"`    // 任务id
	JobId       string       `json:"job_id"`     // 作业id(在第三方系统中的作业id)
	AdapterId   int64        `json:"adapter_id"` // 执行任务的适配器id
	AdapterName string       `json:"adapterName,omitempty,optional"`
	ClusterId   int64        `json:"cluster_id"` // 执行任务的集群id
	ClusterName string       `json:"clusterName,omitempty,optional"`
	ClusterType string       `json:"cluster_type"` // 执行任务的集群类型
	Name        string       `json:"name"`         // 名称
	Status      string       `json:"status"`       // 状态
	CmdScript   string       `json:"cmd_script"`
	StartTime   string       `json:"start_time"`   // 开始时间
	RunningTime int64        `json:"running_time"` // 运行时间
	DerivedEs   string       `json:"derived_es"`
	Cluster     string       `json:"cluster"`
	BlockId     int64        `json:"block_id"`
	AllocNodes  int64        `json:"alloc_nodes"`
	AllocCpu    int64        `json:"alloc_cpu"`
	CardCount   int64        `json:"card_count"` // 卡数
	Version     string       `json:"version"`
	Account     string       `json:"account"`
	WorkDir     string       `json:"work_dir"` // 工作路径
	AssocId     int64        `json:"assoc_id"`
	Partition   string       `json:"partition,omitempty,optional"`
	ExitCode    int64        `json:"exit_code"`
	WallTime    string       `json:"wall_time"`  // 最大运行时间
	Result      string       `json:"result"`     // 运行结果
	DeletedAt   sql.NullTime `json:"deleted_at"` // 删除时间
	YamlString  string       `json:"yaml_string"`
	AppType     string       `json:"app_type"`     // 	应用类型
	AppName     string       `json:"app_name"`     // 	应用名称
	Queue       string       `json:"queue"`        // 队列名称
	SubmitType  string       `json:"submit_type"`  // cmd（命令行模式）
	NNode       string       `json:"n_node"`       // 节点个数（当指定该参数时，GAP_NODE_STRING必须为""）
	StdOutFile  string       `json:"std_out_file"` // 工作路径/std.err.%j
	StdErrFile  string       `json:"std_err_file"` // 工作路径/std.err.%j
	StdInput    string       `json:"std_input"`
	Environment string       `json:"environment"`
	DeletedFlag int64        `json:"deleted_flag"` // 是否删除（0-否，1-是）
	CreatedBy   int64        `json:"created_by"`   // 创建人
	CreatedTime time.Time    `json:"created_time"` // 创建时间
	UpdatedBy   int64        `json:"updated_by"`   // 更新人
	UpdatedTime time.Time    `json:"updated_time"` // 更新时间
}

type CloudInfo struct {
	Id          uint       `json:"id,omitempty,optional"`
	TaskId      int64      `json:"taskId,omitempty,optional"`
	AdapterId   int64      `json:"adapterId,omitempty,optional"`
	AdapterName string     `json:"adapterName,omitempty,optional"`
	ClusterId   int64      `json:"clusterId,omitempty,optional"`
	ClusterName string     `json:"clusterName,omitempty,optional"`
	Kind        string     `json:"kind,omitempty,optional"`
	Status      string     `json:"status,omitempty,optional"`
	StartTime   *time.Time `json:"startTime,omitempty,optional,string"`
	YamlString  string     `json:"yamlString,omitempty,optional"`
	Result      string     `json:"result,omitempty,optional"`
	Namespace   string     `json:"namespace,omitempty,optional"`
}

type AiInfo struct {
	Id          int64  `json:"id"` // id
	AdapterId   int64  `json:"adapterId,omitempty,optional"`
	AdapterName string `json:"adapterName,omitempty,optional"`
	ClusterId   int64  `json:"clusterId,omitempty,optional"`
	//ClusterIds  []int64 `json:"clusterIds,omitempty,optional"`
	TaskId      int64  `json:"taskId,omitempty"`
	ClusterName string `json:"clusterName,omitempty,optional"`
	ImageId     string `json:"imageId,omitempty"`
	//ResourceId   string  `json:"resourceId,omitempty"`
	//AlgorithmId string `json:"algorithmId,omitempty"`
	//MetadataName string `json:"metadataName,omitempty"`
	Command string `json:"command,omitempty"`
	//Environments string `json:"environments,omitempty"`
	//Parameters   string `json:"parameters,omitempty"`

	Name      string `json:"name,omitempty"`
	Status    string `json:"status,omitempty"`
	StartTime string `json:"startTime,omitempty"`
	//RunningTime int64  `json:"runningTime,omitempty"`
	JobId    string `json:"jobId,omitempty"`
	FlavorId string `json:"flavorId,omitempty"`
	//TaskName              string           `json:"taskName,omitempty"`
	//Replica               int32            `json:"replica,omitempty"`
	//ResourceType          string           `json:"resourceType,omitempty"`
	//CpuCoreNum            int32            `json:"cpuCoreNum,omitempty"`
	//TaskType              string           `json:"taskType,omitempty"`
	//DatasetsName          string           `json:"datasetsName,omitempty"`
	//ProjectId             string           `json:"project_id,omitempty"`
	//StrategyName          string           `json:"strategyName,omitempty"`
	//ClusterToStaticWeight map[string]int32 `json:"clusterToStaticWeight,omitempty"`
	//Tops                  float64          `json:"tops,omitempty"`
	//ComputeCard           string           `json:"computeCard,omitempty,optional"`
	//CodeType              string           `json:"codeType,omitempty,optional"`

	//ModelName             string           `json:"ModelName,omitempty,optional"`
	//AlgorithmName         string           `json:"algorithmName,omitempty,optional"`
	//Strategy              string           `json:"strategy,omitempty"`
	//Envs         []string `json:"envs,omitempty"`
	//Params       []string `json:"params,omitempty"`

	//SpecId       string `json:"specId,omitempty"`
	//DatasetsId   string `json:"datasetsId,omitempty"`
	//CodeId       string `json:"codeId,omitempty"`
	//Result      string `json:"result,omitempty"`

	//Datasets      string `json:"datasets,omitempty"`
	//AlgorithmCode string `json:"algorithmCode,omitempty"`
	//Image         string `json:"image,omitempty"`

	//CreateTime     string `json:"createTime,omitempty"`
	//ImageUrl       string `json:"imageUrl,omitempty"`

	//SubscriptionId string `json:"subscriptionId,omitempty"`
	//ItemVersionId  string `json:"itemVersionId,omitempty"`
	//ObsUrl         string `json:"obsUrl,omitempty"`
}

type VmInfo struct {
	Id          int64  `json:"id,omitempty"`
	TaskId      int64  `json:"taskId,omitempty"`
	Name        string `json:"name,omitempty"`
	AdapterId   int64  `json:"adapterId,omitempty,optional"`
	AdapterName string `json:"adapterName,omitempty,optional"`
	ClusterId   int64  `json:"clusterId,omitempty,optional"`
	ClusterName string `json:"clusterName,omitempty,optional"`
	FlavorRef   string `json:"flavorRef,omitempty"`
	ImageRef    string `json:"imageRef,omitempty"`
	Status      string `json:"status,omitempty"`
	Platform    string `json:"platform,omitempty"`
	MinCount    int64  `json:"minCount,omitempty"`
	Uuid        string `json:"uuid,omitempty"`
	StartTime   string `json:"startTime,omitempty"`
	//RunningTime      string `json:"runningTime,omitempty"`
	//Result           string `json:"result,omitempty"`
	//DeletedAt        string `json:"deletedAt,omitempty"`
	VmName   string `json:"vmName,omitempty"`
	Replicas int64  `json:"replicas,omitempty"`
	ServerId string `json:"serverId,omitempty"`
}

type ResourceStats struct {
	ClusterId    int64   `json:"clusterId"`
	Name         string  `json:"name"`
	CpuCoreAvail int64   `json:"cpuCoreAvail"`
	CpuCoreTotal int64   `json:"cpuCoreTotal"`
	MemAvail     float64 `json:"memAvail"`
	MemTotal     float64 `json:"memTotal"`
	DiskAvail    float64 `json:"diskAvail"`
	DiskTotal    float64 `json:"diskTotal"`
	GpuAvail     int64   `json:"gpuAvail"`
	CardsAvail   []*Card `json:"cardsAvail"`
	CpuCoreHours float64 `json:"cpuCoreHours"`
	Balance      float64 `json:"balance"`
}

type Card struct {
	Platform   string  `json:"platform"`
	Type       string  `json:"type"`
	Name       string  `json:"name"`
	TOpsAtFp16 float64 `json:"TOpsAtFp16"`
	CardHours  float64 `json:"cardHours"`
	CardNum    int32   `json:"cardNum"`
}
