package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"time"
)

// 定义 User 模型
type User struct {
	gorm.Model
	Name  string
	Email string
	Test  Test
}

type Test struct {
	gorm.Model
	Name   string
	UserID *uint
}

func main() {

	user := User{
		Name:  "John Doe",
		Email: "john.doe@example.com",
		Test: Test{
			Name: "test",
		},
	}
	Created(&user)
	// 打印成功创建的消息
	fmt.Printf("User created with ID: %d\n", user.ID)

}

func Created(u *User) {
	dsn := "root:lxz664278@tcp(106.54.33.152:33369)/hstack?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		panic("failed to connect database")
	}
	info, _ := GetNodePartInfo(&Node{Model: Model{ID: 2}}, *db)
	fmt.Println(info)
}

func GetNodePartInfo(node *Node, DBConn gorm.DB) (*Node, error) {
	var result = new(Node)

	tx := DBConn.Model(Node{}).Select([]string{
		"id", "node_tag",
		"max_v_cpu", "use_v_cpu",
		"max_mem", "use_mem",
		"max_gpu", "use_gpu",
		"max_vpc", "use_vpc",
		"stat"}).Where("id=?", node.ID).Find(result)
	if tx.Error != nil {
		return nil, tx.Error
	}
	if result.ID <= 0 {
		result = nil
	}
	return result, nil
}

// Node 节点信息
type Node struct {
	Model
	NodeName               string `json:"node_name" gorm:"node_name" `                     // 节点名称
	ZoneId                 int    `json:"zone_id" gorm:"zone_id" `                         // 所属资源区ID
	ZoneName               string `json:"zone_name" gorm:"zone_name" `                     // 所属资源区名
	BmcIP                  string `json:"bmc_ip" gorm:"bmc_ip" `                           // BMC IP
	BmcUser                string `json:"bmc_user" gorm:"bmc_user" `                       // BMC 用户名
	BmcPass                string `json:"bmc_pass" gorm:"bmc_pass" `                       // BMC 密码
	MgrIp                  string `json:"mgr_ip" gorm:"mgr_ip" `                           // 管理IP
	NodeIp                 string `json:"node_ip" gorm:"node_ip" `                         // 节点IP
	ListenPort             int    `json:"listen_port" gorm:"listen_port" `                 // 监听端口
	SSHPort                int    `json:"ssh_port" gorm:"ssh_port" `                       // SSH端口号
	RootUser               string `json:"root_user" gorm:"root_user" `                     // root用户
	RootPass               string `json:"root_pass" gorm:"root_pass" `                     // root密码
	RootSecretKey          string `json:"root_secret_key" gorm:"root_secret_key" `         // Root账号密钥
	SecretKeyPass          string `json:"secret_key_pass" gorm:"secret_key_pass" `         // 密钥密码
	NodeMode               int    `json:"node_mode" gorm:"node_mode" `                     // 节点模式
	NodeTag                string `json:"node_tag" gorm:"node_tag" `                       // 节点标记
	MaxVCpu                int    `json:"max_v_cpu" gorm:"max_v_cpu" `                     // 最大可虚拟化CPU数量
	UseVCpu                int    `json:"use_v_cpu" gorm:"use_v_cpu" `                     // 已使用虚拟化CPU数量
	Cpu                    int    `json:"cpu" gorm:"cpu" `                                 // CPU数量
	CpuType                int    `json:"cpu_type" gorm:"cpu_type" `                       // CPU类型 (x86_64:1;amd64:2;arm:3;other:4)
	MaxMem                 int64  `json:"max_mem" gorm:"max_mem" `                         // 最大内存
	UseMem                 int64  `json:"use_mem" gorm:"use_mem" `                         // 已使用内存
	MaxGpu                 int    `json:"max_gpu" gorm:"max_gpu" `                         // 最大GPU数
	UseGpu                 int    `json:"use_gpu" gorm:"use_gpu" `                         // 已使用GPU数
	NodeWidget             int    `json:"node_widget" gorm:"node_widget" `                 // 节点权重
	NodeLoadStat           int    `json:"node_load_stat" gorm:"node_load_stat" `           // 节点负载状态
	MaxVPC                 int    `json:"max_vpc" gorm:"column:max_vpc;default:5" `        // 节点创建的最大VPC数量
	UseVPC                 int    `json:"use_vpc" gorm:"column:use_vpc;default:0" `        // 节点已创建的VPC
	RunStat                int    `json:"run_stat" gorm:"run_stat" `                       // 节点运行状态
	AutoSyncNodeStat       int    `json:"auto_sync_node_stat" gorm:"auto_sync_node_stat" ` // 自动同步节点状态
	PcieIdList             []int  `json:"pcie_id_list" gorm:"-" `                          // PCIE设备ID列表
	HPCInitCommandIdList   []int  `json:"hpc_init_command_id_list" gorm:"-" `              // hpc命令ID数组
	CloudInitCommandIdList []int  `json:"cloud_init_command_id_list" gorm:"-" `            // 云命令ID数组
}
type Model struct {
	ID           int            `json:"id" gorm:"column:id;primarykey" `                                               // 主键ID
	CreatedAt    *time.Time     `json:"created_at" gorm:"column:created_at;autoCreateTime:nano" swaggerignore:"true" ` // 创建时间
	UpdatedAt    *time.Time     `json:"updated_at" gorm:"column:updated_at;autoUpdateTime:nano" swaggerignore:"true"`  // 更新时间
	DeletedAt    gorm.DeletedAt `json:"deleted_at" gorm:"column:deleted_at;index" swaggerignore:"true"`                // 删除时间
	CreateUser   string         `json:"create_user" gorm:"create_user" swaggerignore:"true"`                           // 创建用户
	CreateUserId int            `json:"create_user_id" gorm:"create_user_id" swaggerignore:"true"`                     // 创建用户ID
	UpdateUser   string         `json:"update_user" gorm:"update_user" swaggerignore:"true"`                           // 更新用户
	UpdateUserId int            `json:"update_user_id" gorm:"update_user_id" swaggerignore:"true"`                     // 更新用户ID
	DeleteUser   string         `json:"delete_user" gorm:"delete_user" swaggerignore:"true" `                          // 删除用户
	DeleteUserId int            `json:"delete_user_id" gorm:"delete_user_id" swaggerignore:"true"`                     // 删除用户ID
	Remark       string         `json:"remark" gorm:"remark" swaggerignore:"true"`                                     // 备注
	Stat         int            `json:"stat" gorm:"stat" swaggerignore:"true"`                                         // 状态
	ExpireAt     *time.Time     `json:"expire_at" gorm:"expire_at" swaggerignore:"true"`                               // 过期时间
}

func (Node) TableName() string {
	return "node"
}
