package com.qqchen.deploy.backend.deploy.entity;

import com.qqchen.deploy.backend.framework.dto.DiskInfo;
import com.qqchen.deploy.backend.framework.converter.DiskInfoListConverter;
import com.qqchen.deploy.backend.framework.enums.AuthTypeEnum;
import com.qqchen.deploy.backend.framework.enums.OsTypeEnum;
import com.qqchen.deploy.backend.deploy.enums.ServerStatusEnum;
import com.qqchen.deploy.backend.framework.domain.Entity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 服务器实体
 */
@Data
@EqualsAndHashCode(callSuper = true)
@jakarta.persistence.Entity
@Table(name = "deploy_server")
public class Server extends Entity<Long> {

    /**
     * 服务器名称
     */
    @Column(name = "server_name", nullable = false, length = 100)
    private String serverName;

    /**
     * IP地址
     */
    @Column(name = "host_ip", nullable = false, unique = true, length = 50)
    private String hostIp;

    /**
     * SSH端口
     */
    @Column(name = "ssh_port")
    private Integer sshPort;

    /**
     * SSH用户名
     */
    @Column(name = "ssh_user", length = 50)
    private String sshUser;

    /**
     * 认证方式
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "auth_type", length = 20)
    private AuthTypeEnum authType;

    /**
     * SSH密码（加密存储）
     * TODO: 【安全改进】需要实现加密存储，建议使用 AES-256 加密
     */
    @Column(name = "ssh_password", length = 500)
    private String sshPassword;

    /**
     * SSH私钥（加密存储）
     * TODO: 【安全改进】需要实现加密存储，建议使用 AES-256 加密
     */
    @Column(name = "ssh_private_key", columnDefinition = "TEXT")
    private String sshPrivateKey;

    /**
     * 私钥密码（加密存储）
     * TODO: 【安全改进】需要实现加密存储，建议使用 AES-256 加密
     */
    @Column(name = "ssh_passphrase", length = 500)
    private String sshPassphrase;

    /**
     * 服务器分类ID
     */
    @Column(name = "category_id")
    private Long categoryId;

    /**
     * 操作系统类型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "os_type", length = 20)
    private OsTypeEnum osType;

    /**
     * 操作系统版本
     */
    @Column(name = "os_version", length = 100)
    private String osVersion;

    /**
     * 主机名
     */
    @Column(name = "hostname", length = 100)
    private String hostname;

    /**
     * 连接状态
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", length = 20)
    private ServerStatusEnum status;

    /**
     * 服务器描述
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * CPU核心数
     */
    @Column(name = "cpu_cores")
    private Integer cpuCores;

    /**
     * 内存大小(GB)
     */
    @Column(name = "memory_size")
    private Integer memorySize;

    /**
     * 磁盘总容量(GB)
     * 所有磁盘分区容量的总和，方便排序和统计
     */
    @Column(name = "disk_size")
    private Integer diskSize;

    /**
     * 磁盘详细信息列表
     * 存储多个磁盘的详细信息，包括挂载点、容量
     */
    @Convert(converter = DiskInfoListConverter.class)
    @Column(name = "disk_info", columnDefinition = "JSON")
    private List<DiskInfo> diskInfo;

    /**
     * 标签（JSON格式）
     */
    @Column(name = "tags", columnDefinition = "JSON")
    private String tags;

    /**
     * 最后连接时间
     */
    @Column(name = "last_connect_time")
    private LocalDateTime lastConnectTime;
}

