package client

import (
	"database/sql"
	"time"
)

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"`
	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
	ClusterId   int64        `json:"cluster_id"`   // 执行任务的集群id
	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"`
	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 {
	Participant int64  `json:"participant,omitempty"`
	Id          int64  `json:"id,omitempty"`
	TaskId      int64  `json:"taskId,omitempty"`
	ApiVersion  string `json:"apiVersion,omitempty"`
	Kind        string `json:"kind,omitempty"`
	Namespace   string `json:"namespace,omitempty"`
	Name        string `json:"name,omitempty"`
	Status      string `json:"status,omitempty"`
	StartTime   string `json:"startTime,omitempty"`
	RunningTime int64  `json:"runningTime,omitempty"`
	Result      string `json:"result,omitempty"`
	YamlString  string `json:"yamlString,omitempty"`
}

type AiInfo struct {
	ParticipantId  int64  `json:"participantId,omitempty"`
	TaskId         int64  `json:"taskId,omitempty"`
	ProjectId      string `json:"project_id,omitempty"`
	Name           string `json:"name,omitempty"`
	Status         string `json:"status,omitempty"`
	StartTime      string `json:"startTime,omitempty"`
	RunningTime    int64  `json:"runningTime,omitempty"`
	Result         string `json:"result,omitempty"`
	JobId          string `json:"jobId,omitempty"`
	CreateTime     string `json:"createTime,omitempty"`
	ImageUrl       string `json:"imageUrl,omitempty"`
	Command        string `json:"command,omitempty"`
	FlavorId       string `json:"flavorId,omitempty"`
	SubscriptionId string `json:"subscriptionId,omitempty"`
	ItemVersionId  string `json:"itemVersionId,omitempty"`
}

type VmInfo struct {
	ParticipantId       int64  `json:"participantId,omitempty"`
	TaskId              int64  `json:"taskId,omitempty"`
	Name                string `json:"name,omitempty"`
	FlavorRef           string `json:"flavor_ref,omitempty"`
	ImageRef            string `json:"image_ref,omitempty"`
	NetworkUuid         string `json:"network_uuid,omitempty"`
	BlockUuid           string `json:"block_uuid,omitempty"`
	SourceType          string `json:"source_type,omitempty"`
	DeleteOnTermination bool   `json:"delete_on_termination,omitempty"`
	Status              string `json:"Status,omitempty"`
	StartTime           string `json:"startTime,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"`
}
