-- 0001_create_users_models.up.sql
--
-- DB 接入塊 0/塊 1：建立模型庫持久化的最小集合（users + models）。
-- 對齊 docs/autoflow/04-architecture/database.md §0.3、§4、§5.1。
--
-- 為何第一份 migration 含 users：models.owner_user_id 是 REFERENCES users(id) 的 FK，
-- 必須先有 users 表。雛形 users 為 stub（固定 demo-user），但 schema 與 FK 約束第一份就要到位。
--
-- 環境事實（已驗證）：PostgreSQL 14.23，已裝 extension 只有 plpgsql。
--   - gen_random_uuid()：PG14 內建（pgcrypto 已併入核心），可直接用，不需 CREATE EXTENSION。
--   - CITEXT：未裝。users.email 改用 TEXT，大小寫不敏感唯一改用 functional unique index
--     ON lower(email)（塊 1 真正寫 user 落盤前，users 僅為 stub，影響極小）。

-- users（Phase 1 stub；雛形固定 demo-user）
CREATE TABLE users (
    id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email         TEXT NOT NULL,
    name          TEXT,
    password_hash TEXT,
    org_id        UUID,
    roles         TEXT[] NOT NULL DEFAULT '{}',
    created_at    TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at    TIMESTAMPTZ NOT NULL DEFAULT now(),
    deleted_at    TIMESTAMPTZ
);
-- email 大小寫不敏感唯一（取代 CITEXT，因 PG14.23 未裝 citext extension）。
CREATE UNIQUE INDEX uq_users_email_lower ON users (lower(email));

-- models（塊 1 主體；使用者最關心，重啟後模型庫資料還在）
CREATE TABLE models (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    owner_user_id   UUID NOT NULL REFERENCES users(id),
    name            TEXT NOT NULL,
    description     TEXT,
    storage_key     TEXT NOT NULL,
    file_size       BIGINT NOT NULL,
    file_checksum   TEXT,
    faa_object_key  TEXT,                        -- ADR-017 (a) B1，nullable（上傳類留 NULL）
    target_chip     TEXT,
    input_shape     INT[],
    classes         TEXT[],
    framework       TEXT,
    source          TEXT NOT NULL,
    source_job_id   UUID,
    created_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT now(),
    uploaded_at     TIMESTAMPTZ,
    deleted_at      TIMESTAMPTZ
);
-- owner-scoped index（List by owner / chip / source；只索引未刪除紀錄）。
CREATE INDEX idx_models_owner_active        ON models (owner_user_id)              WHERE deleted_at IS NULL;
CREATE INDEX idx_models_owner_chip_active   ON models (owner_user_id, target_chip) WHERE deleted_at IS NULL;
CREATE INDEX idx_models_owner_source_active ON models (owner_user_id, source)      WHERE deleted_at IS NULL;
