-- Phase 11: Alert Operation Log — 告警操作完整溯源表
-- 建立時間: 2026-04-08 (台北時區)
-- 建立者: Claude Code — 統帥指令「所有操作都必須被記錄，寫入資料庫」
--
-- 設計理念: Event Sourcing
--   每個告警的生命週期，每個事件都寫一筆
--   不可變 (Immutable) — 只 INSERT，不 UPDATE/DELETE
--
-- 事件類型 (event_type):
--   ALERT_RECEIVED       — Alertmanager/外部告警進來
--   TELEGRAM_SENT        — 推送 Telegram 審核卡片
--   USER_ACTION          — 使用者在 Telegram 按按鈕 (approve/reject/silence)
--   AUTO_REPAIR_TRIGGERED — 自動修復評估通過，準備執行
--   EXECUTION_STARTED    — 開始執行 K8s/SSH 指令
--   EXECUTION_COMPLETED  — 執行完成 (success/failure)
--   TELEGRAM_RESULT_SENT — 自動修復結果推送到 Telegram
--   RESOLVED             — 告警解除
--   SILENCED             — 靜默中
--   ESCALATED            — 升級 (P3→P2 等)

CREATE TYPE alert_event_type AS ENUM (
    'ALERT_RECEIVED',
    'TELEGRAM_SENT',
    'USER_ACTION',
    'AUTO_REPAIR_TRIGGERED',
    'EXECUTION_STARTED',
    'EXECUTION_COMPLETED',
    'TELEGRAM_RESULT_SENT',
    'RESOLVED',
    'SILENCED',
    'ESCALATED'
);

CREATE TABLE IF NOT EXISTS alert_operation_log (
    -- 主鍵 (不可變)
    id              VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::text,

    -- 關聯 (所有欄位允許 NULL，避免不同事件強制關聯)
    incident_id     VARCHAR(30),        -- incidents.incident_id
    approval_id     VARCHAR(36),        -- approval_records.id
    audit_log_id    VARCHAR(36),        -- audit_logs.id
    auto_repair_id  VARCHAR(36),        -- auto_repair_executions.id

    -- 事件核心
    event_type      alert_event_type NOT NULL,
    actor           VARCHAR(100),       -- 誰觸發: 'alertmanager' / 'telegram:user_id' / 'auto_repair' / 'system'
    action_detail   VARCHAR(200),       -- 具體動作: 'approve' / 'reject' / 'silence' / kubectl 指令摘要

    -- 執行結果
    success         BOOLEAN,            -- NULL=不適用 (如 ALERT_RECEIVED), TRUE/FALSE=有執行結果
    error_message   TEXT,

    -- 上下文 (結構化存儲)
    context         JSONB NOT NULL DEFAULT '{}',
    -- 範例:
    --   ALERT_RECEIVED: {"alert_name": "KubePodCrashLooping", "severity": "P2", "namespace": "awoooi-prod"}
    --   USER_ACTION:    {"button": "approve", "telegram_user_id": "12345", "message_id": "67890"}
    --   EXECUTION:      {"playbook": "restart-deployment", "steps": 3, "duration_ms": 2340}

    -- 時間戳 (台北時區，不可變)
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- 索引 (查詢模式: 按 incident / 按時間 / 按事件類型)
CREATE INDEX IF NOT EXISTS ix_aol_incident_id  ON alert_operation_log (incident_id);
CREATE INDEX IF NOT EXISTS ix_aol_approval_id  ON alert_operation_log (approval_id);
CREATE INDEX IF NOT EXISTS ix_aol_event_type   ON alert_operation_log (event_type);
CREATE INDEX IF NOT EXISTS ix_aol_created_at   ON alert_operation_log (created_at DESC);
CREATE INDEX IF NOT EXISTS ix_aol_actor        ON alert_operation_log (actor);

COMMENT ON TABLE alert_operation_log IS
'告警操作完整溯源 — Event Sourcing，不可變，每個告警生命週期的每個事件一筆記錄';
