import type { BaseResponse, BaseQuery } from '@/types/base';

// ==================== 枚举类型 ====================

/**
 * 服务器状态枚举
 */
export enum ServerStatus {
    /** 在线 */
    ONLINE = 'ONLINE',
    /** 离线 */
    OFFLINE = 'OFFLINE',
    /** 未知 */
    UNKNOWN = 'UNKNOWN',
}

/**
 * 操作系统类型枚举
 */
export enum OsType {
    /** Linux */
    LINUX = 'LINUX',
    /** Windows */
    WINDOWS = 'WINDOWS',
    /** MacOS */
    MACOS = 'MACOS',
    /** Unix */
    UNIX = 'UNIX',
    /** 其他 */
    OTHER = 'OTHER',
}

/**
 * 认证方式枚举
 */
export enum AuthType {
    /** 密码认证 */
    PASSWORD = 'PASSWORD',
    /** 密钥认证 */
    KEY = 'KEY',
}

// ==================== 服务器分类 ====================

/**
 * 服务器分类响应类型
 */
export interface ServerCategoryResponse extends BaseResponse {
    /** 分类名称 */
    name: string;
    /** 分类编码 */
    code: string;
    /** 图标 */
    icon?: string;
    /** 描述 */
    description?: string;
    /** 排序 */
    sort: number;
    /** 是否启用 */
    enabled: boolean;
    /** 服务器数量 */
    serverCount?: number;
}

/**
 * 服务器分类查询参数
 */
export interface ServerCategoryQuery extends BaseQuery {
    /** 分类名称 */
    name?: string;
    /** 是否启用 */
    enabled?: boolean;
}

/**
 * 服务器分类请求类型
 */
export interface ServerCategoryRequest {
    /** 分类名称 */
    name: string;
    /** 分类编码 */
    code: string;
    /** 图标 */
    icon?: string;
    /** 描述 */
    description?: string;
    /** 排序 */
    sort: number;
    /** 是否启用 */
    enabled: boolean;
}

// ==================== 服务器 ====================

/**
 * 磁盘信息
 */
export interface DiskInfo {
    /** 挂载点 */
    mountPoint: string;
    /** 文件系统类型 */
    fileSystem: string;
    /** 总大小(GB) */
    totalSize: number;
}

/**
 * 服务器响应类型
 */
export interface ServerResponse extends BaseResponse {
    /** 服务器名称 */
    serverName: string;
    /** IP地址 */
    hostIp: string;
    /** SSH端口 */
    sshPort: number;
    /** SSH用户名 */
    sshUser?: string;
    /** 认证方式 */
    authType?: AuthType;
    /** SSH密码（加密存储） */
    sshPassword?: string;
    /** SSH私钥（加密存储） */
    sshPrivateKey?: string;
    /** 私钥密码（可选，用于加密的私钥） */
    sshPassphrase?: string;
    /** 服务器分类ID */
    categoryId?: number;
    /** 操作系统类型 */
    osType?: OsType;
    /** 操作系统版本 */
    osVersion?: string;
    /** 主机名 */
    hostname?: string;
    /** 连接状态 */
    status: ServerStatus;
    /** 描述 */
    description?: string;
    /** CPU核心数 */
    cpuCores?: number;
    /** 内存大小(GB) */
    memorySize?: number;
    /** 磁盘大小(GB) */
    diskSize?: number;
    /** 磁盘详细信息 */
    diskInfo?: DiskInfo[];
    /** 标签（JSON字符串） */
    tags?: string;
    /** 最后连接时间 */
    lastConnectTime?: string;
    /** 分类名称 */
    categoryName?: string;
}

/**
 * 服务器查询参数
 */
export interface ServerQuery extends BaseQuery {
    /** 服务器名称 */
    serverName?: string;
    /** IP地址 */
    hostIp?: string;
    /** 分类ID */
    categoryId?: number;
    /** 操作系统类型 */
    osType?: OsType;
    /** 连接状态 */
    status?: ServerStatus;
}

/**
 * 服务器请求类型
 */
export interface ServerRequest {
    /** 服务器名称 */
    serverName: string;
    /** IP地址 */
    hostIp: string;
    /** SSH端口 */
    sshPort: number;
    /** SSH用户名 */
    sshUser?: string;
    /** 认证方式 */
    authType?: AuthType;
    /** SSH密码（加密存储） */
    sshPassword?: string;
    /** SSH私钥（加密存储） */
    sshPrivateKey?: string;
    /** 私钥密码（可选，用于加密的私钥） */
    sshPassphrase?: string;
    /** 服务器分类ID */
    categoryId?: number;
    /** 操作系统类型 */
    osType?: OsType;
    /** 操作系统版本 */
    osVersion?: string;
    /** 主机名 */
    hostname?: string;
    /** 连接状态（更新时保留原状态） */
    status?: ServerStatus;
    /** 描述 */
    description?: string;
    /** CPU核心数 */
    cpuCores?: number;
    /** 内存大小(GB) */
    memorySize?: number;
    /** 磁盘大小(GB) */
    diskSize?: number;
    /** 标签（JSON字符串） */
    tags?: string;
}

/**
 * 服务器状态标签映射
 */
export const ServerStatusLabels: Record<ServerStatus, { label: string; description: string }> = {
    [ServerStatus.ONLINE]: { label: '在线', description: '服务器在线可用' },
    [ServerStatus.OFFLINE]: { label: '离线', description: '服务器离线或不可达' },
    [ServerStatus.UNKNOWN]: { label: '未知', description: '服务器状态未知' },
};

/**
 * 操作系统类型标签映射
 */
export const OsTypeLabels: Record<OsType, { label: string; description: string }> = {
    [OsType.LINUX]: { label: 'Linux', description: 'Linux系列操作系统' },
    [OsType.WINDOWS]: { label: 'Windows', description: 'Windows系列操作系统' },
    [OsType.MACOS]: { label: 'MacOS', description: 'MacOS系列操作系统' },
    [OsType.UNIX]: { label: 'Unix', description: 'Unix系列操作系统' },
    [OsType.OTHER]: { label: 'Other', description: '其他操作系统' },
};

/**
 * 认证方式标签映射
 */
export const AuthTypeLabels: Record<AuthType, { label: string; description: string }> = {
    [AuthType.PASSWORD]: { label: '密码认证', description: '使用用户名和密码进行SSH认证' },
    [AuthType.KEY]: { label: '密钥认证', description: '使用SSH私钥进行认证' },
};

/**
 * 服务器连接测试结果（轻量级，仅测试连通性）
 */
export interface ServerConnectionTestResult {
    /** 是否连接成功 */
    connected: boolean;
    /** 错误信息（连接失败时返回） */
    errorMessage: string | null;
    /** 连接时间 */
    connectTime: string;
    /** 响应时间(ms) */
    responseTime: number;
}

/**
 * 服务器硬件信息采集结果
 */
export interface ServerHardwareCollectionResult {
    /** 是否连接成功 */
    connected: boolean;
    /** 错误信息（连接失败时返回） */
    errorMessage: string | null;
    /** 连接时间 */
    connectTime: string;
    /** 响应时间(ms) */
    responseTime: number;
    /** 主机名 */
    hostname: string;
    /** 操作系统版本 */
    osVersion: string;
    /** CPU核心数 */
    cpuCores: number;
    /** 内存大小(GB) */
    memorySize: number;
    /** 磁盘大小(GB) */
    diskSize: number;
    /** 磁盘详细信息 */
    diskInfo?: DiskInfo[];
}

// ==================== 告警规则 ====================

/**
 * 告警类型枚举
 */
export enum AlertType {
    /** CPU使用率 */
    CPU = 'CPU',
    /** 内存使用率 */
    MEMORY = 'MEMORY',
    /** 磁盘使用率 */
    DISK = 'DISK',
    /** 网络流量 */
    NETWORK = 'NETWORK',
    /** 服务器状态 */
    SERVER_STATUS = 'SERVER_STATUS',
}

/**
 * 告警规则响应类型
 */
export interface AlertRuleResponse extends BaseResponse {
    /** 服务器ID（null表示全局规则） */
    serverId: number | null;
    /** 规则名称 */
    ruleName: string;
    /** 告警类型 */
    alertType: AlertType;
    /** 警告阈值 */
    warningThreshold: number;
    /** 严重阈值 */
    criticalThreshold: number;
    /** 持续时长(分钟) */
    durationMinutes: number;
    /** 描述 */
    description?: string;
    /** 服务器名称（关联数据） */
    serverName?: string;
}

/**
 * 告警规则查询参数
 */
export interface AlertRuleQuery {
    /** 服务器ID */
    serverId?: number | null;
    /** 规则名称 */
    ruleName?: string;
    /** 告警类型 */
    alertType?: AlertType;
    /** 是否启用 */
    enabled?: boolean;
    /** 页码（从0开始） */
    page?: number;
    /** 每页数量 */
    size?: number;
    /** 排序（例如：id,desc） */
    sort?: string;
}

/**
 * 告警规则请求类型
 */
export interface AlertRuleRequest {
    /** 服务器ID（null表示全局规则） */
    serverId: number | null;
    /** 规则名称 */
    ruleName: string;
    /** 告警类型 */
    alertType: AlertType;
    /** 警告阈值 */
    warningThreshold: number;
    /** 严重阈值 */
    criticalThreshold: number;
    /** 持续时长(分钟) */
    durationMinutes: number;
    /** 是否启用 */
    enabled: boolean;
    /** 描述 */
    description?: string;
}

/**
 * 告警类型标签映射
 */
export const AlertTypeLabels: Record<AlertType, { label: string; unit: string; description: string }> = {
    [AlertType.CPU]: { label: 'CPU使用率', unit: '%', description: 'CPU使用率告警' },
    [AlertType.MEMORY]: { label: '内存使用率', unit: '%', description: '内存使用率告警' },
    [AlertType.DISK]: { label: '磁盘使用率', unit: '%', description: '磁盘使用率告警' },
    [AlertType.NETWORK]: { label: '网络流量', unit: 'MB/s', description: '网络流量告警' },
    [AlertType.SERVER_STATUS]: { label: '服务器状态', unit: '次', description: '服务器连接状态告警' },
};

// ==================== 服务器监控 ====================

/**
 * 时间范围枚举
 */
export enum TimeRange {
    /** 最近1小时 */
    LAST_1_HOUR = 'LAST_1_HOUR',
    /** 最近6小时 */
    LAST_6_HOURS = 'LAST_6_HOURS',
    /** 最近24小时 */
    LAST_24_HOURS = 'LAST_24_HOURS',
    /** 最近7天 */
    LAST_7_DAYS = 'LAST_7_DAYS',
    /** 最近30天 */
    LAST_30_DAYS = 'LAST_30_DAYS',
}

/**
 * 监控指标类型枚举
 */
export enum MetricType {
    /** CPU */
    CPU = 'CPU',
    /** 内存 */
    MEMORY = 'MEMORY',
    /** 磁盘 */
    DISK = 'DISK',
    /** 网络 */
    NETWORK = 'NETWORK',
}

/**
 * 时间范围标签映射
 */
export const TimeRangeLabels: Record<TimeRange, { label: string; interval: string; description: string }> = {
    [TimeRange.LAST_1_HOUR]: { label: '最近1小时', interval: '5分钟', description: '最近1小时的监控数据' },
    [TimeRange.LAST_6_HOURS]: { label: '最近6小时', interval: '5分钟', description: '最近6小时的监控数据' },
    [TimeRange.LAST_24_HOURS]: { label: '最近24小时', interval: '15分钟', description: '最近24小时的监控数据' },
    [TimeRange.LAST_7_DAYS]: { label: '最近7天', interval: '1小时', description: '最近7天的监控数据' },
    [TimeRange.LAST_30_DAYS]: { label: '最近30天', interval: '4小时', description: '最近30天的监控数据' },
};

/**
 * 指标类型标签映射
 */
export const MetricTypeLabels: Record<MetricType, { label: string; unit: string; color: string }> = {
    [MetricType.CPU]: { label: 'CPU使用率', unit: '%', color: '#3b82f6' },
    [MetricType.MEMORY]: { label: '内存使用率', unit: '%', color: '#10b981' },
    [MetricType.DISK]: { label: '磁盘使用率', unit: '%', color: '#f59e0b' },
    [MetricType.NETWORK]: { label: '网络流量', unit: 'MB/s', color: '#8b5cf6' },
};

/**
 * CPU监控数据点
 */
export interface CpuMetricData {
    /** 时间点 */
    time: string;
    /** CPU使用率(%) */
    value: number;
    /** 采集状态 */
    status: 'SUCCESS' | 'FAILURE';
}

/**
 * 内存监控数据点
 */
export interface MemoryMetricData {
    /** 时间点 */
    time: string;
    /** 内存使用率(%) */
    usagePercent: number;
    /** 已用内存(GB) */
    usedGB: number;
    /** 采集状态 */
    status: 'SUCCESS' | 'FAILURE';
}

/**
 * 网络监控数据点
 */
export interface NetworkMetricData {
    /** 时间点 */
    time: string;
    /** 接收字节数（累计） */
    rxBytes: number;
    /** 发送字节数（累计） */
    txBytes: number;
    /** 接收速率(MB/s) */
    rxMBps: number;
    /** 发送速率(MB/s) */
    txMBps: number;
}

/**
 * 磁盘分区信息
 */
export interface DiskPartitionData {
    /** 挂载点 */
    mountPoint: string;
    /** 文件系统 */
    fileSystem: string;
    /** 总容量(GB) */
    totalSizeGB: number;
    /** 已用容量(GB) */
    usedSizeGB: number;
    /** 使用率(%) */
    usagePercent: number;
}

/**
 * 磁盘监控数据
 */
export interface DiskMetricData {
    /** 最新采集时间 */
    latestTime: string;
    /** 分区信息列表 */
    partitions: DiskPartitionData[];
    /** 时间范围内最大使用率(%) */
    maxUsagePercent: number;
    /** 最大使用率的分区 */
    maxUsagePartition: string;
}

/**
 * CPU统计信息
 */
export interface CpuStatistics {
    /** 平均值(%) */
    avg: number;
    /** 最大值(%) */
    max: number;
    /** 最小值(%) */
    min: number;
    /** 峰值时间 */
    maxTime: string;
}

/**
 * 内存统计信息
 */
export interface MemoryStatistics {
    /** 平均使用率(%) */
    avgPercent: number;
    /** 最大使用率(%) */
    maxPercent: number;
    /** 最小使用率(%) */
    minPercent: number;
    /** 峰值时间 */
    maxTime: string;
}

/**
 * 网络统计信息
 */
export interface NetworkStatistics {
    /** 总接收字节数 */
    totalRxBytes: number;
    /** 总发送字节数 */
    totalTxBytes: number;
}

/**
 * 服务器信息
 */
export interface MonitorServerInfo {
    /** 服务器ID */
    serverId: number;
    /** 服务器名称 */
    serverName: string;
    /** 主机IP */
    hostIp: string;
    /** 服务器状态 */
    status: string;
}

/**
 * 时间范围信息
 */
export interface MonitorTimeRangeInfo {
    /** 开始时间 */
    startTime: string;
    /** 结束时间 */
    endTime: string;
    /** 数据聚合间隔 */
    interval: string;
    /** 实际返回的数据点数量 */
    dataPoints: number;
}

/**
 * 监控指标数据
 */
export interface MonitorMetrics {
    /** CPU数据 */
    cpu: CpuMetricData[] | null;
    /** 内存数据 */
    memory: MemoryMetricData[] | null;
    /** 网络数据 */
    network: NetworkMetricData[] | null;
    /** 磁盘数据 */
    disk: DiskMetricData | null;
}

/**
 * 监控统计信息
 */
export interface MonitorStatistics {
    /** CPU统计 */
    cpu: CpuStatistics | null;
    /** 内存统计 */
    memory: MemoryStatistics | null;
    /** 网络统计 */
    network: NetworkStatistics | null;
}

/**
 * 服务器监控数据响应
 */
export interface ServerMonitorResponse {
    /** 服务器信息 */
    server: MonitorServerInfo;
    /** 时间范围信息 */
    timeRange: MonitorTimeRangeInfo;
    /** 指标数据 */
    metrics: MonitorMetrics;
    /** 统计信息 */
    statistics: MonitorStatistics;
}
