-- MeshRay 数据库迁移脚本
-- 功能：为 devices 表添加增强模式支持字段
-- 创建时间：2026-03-25
-- 关联任务：P0-2 - SwitchMode 功能实现

-- ============================================================
-- 1. 添加 Endpoint 字段（用于保存原始公网地址）
-- ============================================================
-- 说明：
--   - 原生模式：Endpoint 保存设备的真实公网地址（host:port）
--   - 增强模式：当需要回退到原生模式时，从 Endpoint 恢复原始地址
--   - 格式："192.168.1.100:51820" 或 "[::1]:51820"
--   - 最大长度：255 (IPv6) + 1 (冒号) + 5 (端口) = 261
ALTER TABLE devices ADD COLUMN endpoint VARCHAR(261) DEFAULT '';

-- ============================================================
-- 2. 添加 IsRelayCapable 字段（是否可作为 Mesh 中继节点）
-- ============================================================
-- 说明：
--   - true: 该设备可以作为中继节点，帮助其他设备转发数据
--   - false: 该设备仅作为普通终端设备
--   - 默认值：false（所有新设备默认为普通设备）
ALTER TABLE devices ADD COLUMN is_relay_capable BOOLEAN DEFAULT FALSE;

-- ============================================================
-- 3. 验证迁移结果
-- ============================================================
-- 检查新增字段是否存在
SELECT 
    COLUMN_NAME, 
    DATA_TYPE, 
    IS_NULLABLE, 
    COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'devices' 
  AND COLUMN_NAME IN ('endpoint', 'is_relay_capable');

-- 统计现有设备数量
SELECT 
    COUNT(*) AS total_devices,
    SUM(CASE WHEN endpoint != '' THEN 1 ELSE 0 END) AS devices_with_endpoint,
    SUM(CASE WHEN is_relay_capable = TRUE THEN 1 ELSE 0 END) AS relay_capable_devices
FROM devices;

-- ============================================================
-- 4. 回滚脚本（如果需要撤销迁移）
-- ============================================================
/*
-- ⚠️ 警告：执行回滚将删除新增字段，请谨慎操作！
BEGIN TRANSACTION;

ALTER TABLE devices DROP COLUMN endpoint;
ALTER TABLE devices DROP COLUMN is_relay_capable;

COMMIT;
*/

-- ============================================================
-- 5. 备注
-- ============================================================
/*
设计决策：
1. endpoint 使用 VARCHAR(261) 而不是 TEXT
   - 理由：固定最大长度，查询性能更好
   - 261 = 255 (IPv6 最大长度) + 1 (冒号) + 5 (端口号最大值 65535)

2. is_relay_capable 使用 BOOLEAN 而不是 INT
   - 理由：语义更清晰，GORM 自动映射为 bool 类型

3. 默认值设置：
   - endpoint: '' (空字符串) - 避免 NULL 判断
   - is_relay_capable: FALSE - 默认不作为中继节点

4. 索引策略：
   - 暂时不为 endpoint 添加索引
   - 理由：主要用于配置存储，不用于频繁查询
*/
