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:"taskId"`    // 任务id
	JobId       string       `json:"jobId"`     // 作业id(在第三方系统中的作业id)
	AdapterId   int64        `json:"adapterId"` // 执行任务的适配器id
	AdapterName string       `json:"adapterName,omitempty,optional"`
	ClusterId   int64        `json:"clusterId"` // 执行任务的集群id
	ClusterName string       `json:"clusterName,omitempty,optional"`
	ClusterType string       `json:"clusterType"` // 执行任务的集群类型
	Name        string       `json:"name"`        // 名称
	Status      string       `json:"status"`      // 状态
	CmdScript   string       `json:"cmdScript"`
	StartTime   string       `json:"startTime"`   // 开始时间
	RunningTime int64        `json:"runningTime"` // 运行时间
	DerivedEs   string       `json:"derivedEs"`
	Cluster     string       `json:"cluster"`
	BlockId     int64        `json:"blockId"`
	AllocNodes  int64        `json:"allocNodes"`
	AllocCpu    int64        `json:"allocCpu"`
	CardCount   int64        `json:"cardCount"` // 卡数
	Version     string       `json:"version"`
	Account     string       `json:"account"`
	WorkDir     string       `json:"workDir"` // 工作路径
	AssocId     int64        `json:"assocId"`
	Partition   string       `json:"partition,omitempty,optional"`
	ExitCode    int64        `json:"exitCode"`
	WallTime    string       `json:"wallTime"`  // 最大运行时间
	Result      string       `json:"result"`    // 运行结果
	DeletedAt   sql.NullTime `json:"deletedAt"` // 删除时间
	YamlString  string       `json:"yamlString"`
	AppType     string       `json:"appType"`    // 	应用类型
	AppName     string       `json:"appName"`    // 	应用名称
	Queue       string       `json:"queue"`      // 队列名称
	SubmitType  string       `json:"submitType"` // cmd（命令行模式）
	NNode       string       `json:"nNode"`      // 节点个数（当指定该参数时，GAP_NODE_STRING必须为""）
	StdOutFile  string       `json:"stdOutFile"` // 工作路径/std.err.%j
	StdErrFile  string       `json:"stdErrFile"` // 工作路径/std.err.%j
	StdInput    string       `json:"stdInput"`
	EnvPath     string       `json:"envPath"`
	EnvLdPath   string       `json:"envLdPath"`
	DeletedFlag int64        `json:"deletedFlag"` // 是否删除（0-否，1-是）
	CreatedBy   int64        `json:"createdBy"`   // 创建人
	CreatedTime time.Time    `json:"createdTime"` // 创建时间
	UpdatedBy   int64        `json:"updatedBy"`   // 更新人
	UpdatedTime time.Time    `json:"updatedTime"` // 更新时间
}

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"`
	TaskId      int64  `json:"taskId,omitempty"`
	ClusterName string `json:"clusterName,omitempty,optional"`
	ImageId     string `json:"imageId,omitempty"`

	Command string `json:"command,omitempty"`

	Name      string `json:"name,omitempty"`
	Status    string `json:"status,omitempty"`
	StartTime string `json:"startTime,omitempty"`
	JobId     string `json:"jobId,omitempty"`
	FlavorId  string `json:"flavorId,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"`
}

type AdapterCreateReq struct {
	Id           string `json:"id,optional" db:"id"`
	Name         string `json:"name"`
	Type         string `json:"type"`
	ResourceType string `json:"resourceType"`
	Nickname     string `json:"nickname"`
	Version      string `json:"version"`
	Server       string `json:"server"`
}
type AdapterCreateResp struct {
	Id           string `json:"id,omitempty" db:"id"`
	Name         string `json:"name,omitempty" db:"name"`
	Type         string `json:"type,omitempty" db:"type"`
	ResourceType string `json:"resourceType,omitempty" db:"resource_type"`
	Nickname     string `json:"nickname,omitempty" db:"nickname"`
	Version      string `json:"version,omitempty" db:"version"`
	Server       string `json:"server,omitempty" db:"server"`
	CreateTime   string `json:"createTime,omitempty" db:"create_time" gorm:"autoCreateTime"`
	InfoName     string `json:"info_name,omitempty"`
}
