CREATE TABLE ias_mail_messages (
    id BIGSERIAL PRIMARY KEY,
    source_key VARCHAR(512) NOT NULL,
    mailbox VARCHAR(255) NOT NULL,
    uid VARCHAR(255) NOT NULL,
    message_id TEXT,
    from_label TEXT NOT NULL DEFAULT '',
    subject TEXT NOT NULL DEFAULT '',
    summary TEXT NOT NULL DEFAULT '',
    content_preview TEXT NOT NULL DEFAULT '',
    preview_page_id BIGINT REFERENCES ias_web_pages(id) ON DELETE SET NULL,
    preview_url TEXT,
    received_at TIMESTAMPTZ,
    raw_size BIGINT NOT NULL DEFAULT 0,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE (source_key, mailbox, uid)
);

CREATE INDEX idx_ias_mail_messages_created
    ON ias_mail_messages(created_at DESC);

CREATE INDEX idx_ias_mail_messages_received
    ON ias_mail_messages(received_at DESC);

INSERT INTO ias_upgrade_logs (
    version,
    released_at,
    title,
    description,
    changes
) VALUES (
    '0.1.4',
    '2026-07-06T00:00:00+08:00',
    'Mail polling and standalone HTTP module',
    'Added a standalone mail module for IMAP polling and notifications, moved HTTP serving and web preview pages into a standalone Rust module, and added mail persistence tables.',
    '[
        "Added the standalone Rust mail module for IMAP mailbox polling, message parsing, database deduplication, preview-page creation, and user notifications.",
        "Added the standalone Rust ias-http module for HTTP serving, health checks, and reusable web preview pages.",
        "Moved the existing web preview routes out of service and into ias-http.",
        "Added /mail-api/messages and /mail-api/messages/{id} for inspecting stored mail records.",
        "Added the ias_mail_messages database table and persisted the 0.1.4 upgrade record.",
        "Added mail polling configuration through IA_MAIL_* environment variables; polling stays disabled when mailbox settings are absent."
    ]'::jsonb
) ON CONFLICT (version) DO UPDATE SET
    released_at = EXCLUDED.released_at,
    title = EXCLUDED.title,
    description = EXCLUDED.description,
    changes = EXCLUDED.changes;
