-- 弹性节点基建（task #14 / tsk_6u0FxmbC7Yeq）
-- 厂商 API 适配层与一键更换编排所需的最小附加结构。全部为附加式变更，
-- 不触碰现网生产 EC2（deploy/ 的 marzban 机器）。

-- nodes 增补：厂商实例标识与弹性 IP 标识（销毁 / 换 IP 不换机所需）。
-- 凭证仍不入库；这里只存厂商侧的资源 ID，便于幂等地销毁与换绑。
ALTER TABLE nodes
  ADD COLUMN provider_instance_id VARCHAR(128) NULL AFTER provider_id,
  ADD COLUMN elastic_ip_id        VARCHAR(128) NULL AFTER provider_instance_id;

-- node_events 增补 ip_rotated（换 IP 不换机的审计事件）。
ALTER TABLE node_events
  MODIFY COLUMN event ENUM('provisioned','probe_pass','probe_fail','marked_up','draining',
               'blocked_suspect','blocked_confirmed','replaced','destroyed','ip_rotated') NOT NULL;

-- 开退机幂等表：幂等键 → 已开机节点 uuid。重放同一幂等键不重复开机。
CREATE TABLE provision_idempotency (
  idempotency_key VARCHAR(128) NOT NULL PRIMARY KEY,
  node_uuid       CHAR(36) NOT NULL,
  created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 一键更换编排记录：make-before-break 的可恢复状态机。
-- 进程崩溃后可凭 uuid 续跑，step 标记进度，不重复开机 / 不重复销毁。
CREATE TABLE replacements (
  uuid        CHAR(36) NOT NULL PRIMARY KEY,
  old_node_id BIGINT UNSIGNED NOT NULL,
  new_node_id BIGINT UNSIGNED NULL,
  pool        ENUM('consumable','premium') NOT NULL,
  status      ENUM('running','done','failed') NOT NULL DEFAULT 'running',
  step        VARCHAR(32) NOT NULL DEFAULT 'open_new',
  detail      JSON NULL,
  created_at  DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  updated_at  DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  INDEX idx_status (status),
  INDEX idx_old_node (old_node_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
