-- 0002_create_devices.up.sql
--
-- DB 接入塊 2：建立 devices 表（裝置綁定身分長期保存）。
-- 對齊 docs/autoflow/04-architecture/database.md §2.2、§4、§5.1。
--
-- 接續 0001（users + models）；owner_user_id 是 REFERENCES users(id) 的 FK，users 表已於 0001 建立。
--
-- 環境事實（已驗證，與 0001 相同）：PostgreSQL 14.23，gen_random_uuid() PG14 內建可直接用。

-- devices（雙狀態模型：remote_status[tunnel-level] + status[USB-level]，見 §2.2 Minor-3）
CREATE TABLE devices (
    id                UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    owner_user_id     UUID NOT NULL REFERENCES users(id),
    name              TEXT NOT NULL,
    device_type       TEXT,
    serial_number     TEXT,

    -- tunnel-level 狀態（雲端 remote-proxy 觀察 tunnel 連線）
    remote_status     TEXT NOT NULL DEFAULT 'offline',   -- online | offline | reconnecting | error
    last_seen_at      TIMESTAMPTZ,                        -- 最後一次 tunnel heartbeat 時間
    last_connected_at TIMESTAMPTZ,                        -- tunnel 最近一次建立時間

    -- USB-level 狀態（local agent 上報）
    status            TEXT NOT NULL DEFAULT 'unknown',    -- online | offline | unknown

    created_at        TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at        TIMESTAMPTZ NOT NULL DEFAULT now(),
    paired_at         TIMESTAMPTZ,                        -- 配對完成時間（nullable）
    deleted_at        TIMESTAMPTZ
);

-- partial unique index（取代 table-level UNIQUE(owner_user_id, serial_number)）。
-- 決策：已 soft-delete 的 device serial「能」重新註冊（見 §4 / §0.4 決策 2）。
-- 語意：唯一性只對「未刪除」（deleted_at IS NULL）紀錄成立；
--       刪掉一筆後，同 (owner, serial) 可再 INSERT 一筆新的（新 id），不違反 unique。
-- 這讓使用者把裝置刪了之後仍能用同一個實體 serial 重新註冊。
CREATE UNIQUE INDEX uq_devices_owner_serial_active
    ON devices (owner_user_id, serial_number)
    WHERE deleted_at IS NULL;

-- owner-scoped index（List by owner；只索引未刪除紀錄）。
CREATE INDEX idx_devices_owner_active  ON devices (owner_user_id) WHERE deleted_at IS NULL;
-- remote_status filter（前端優先顯示雲端連線狀態；只索引未刪除紀錄）。
CREATE INDEX idx_devices_remote_status ON devices (remote_status) WHERE deleted_at IS NULL;
