-- Migration 012: Client enrollment and compute entity provisioning
-- Adds provisioning tracking and client-specific lookup indexes.

-- Provisioning step tracker for LXC/VM/container creation.
-- Tracks individual steps within a provisioning execution so the client
-- can poll GET /provision/status for progress.
CREATE TABLE IF NOT EXISTS provisioning_steps (
    id UUID PRIMARY KEY,
    entity_id UUID NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
    execution_id UUID NOT NULL REFERENCES executions(id) ON DELETE CASCADE,
    step_order INTEGER NOT NULL,
    step_name TEXT NOT NULL,
    status TEXT NOT NULL DEFAULT 'pending'
        CHECK (status IN ('pending', 'running', 'ok', 'failed', 'skipped')),
    started_at TIMESTAMPTZ,
    finished_at TIMESTAMPTZ,
    error_message TEXT,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE(entity_id, step_name)
);

CREATE INDEX IF NOT EXISTS idx_provisioning_steps_entity
    ON provisioning_steps (entity_id, step_order);
CREATE INDEX IF NOT EXISTS idx_provisioning_steps_execution
    ON provisioning_steps (execution_id);

-- Fast lookup for client entities by slug prefix + type.
-- Supports whoami(hostname) and GET /clients/{slug} lookups.
CREATE INDEX IF NOT EXISTS idx_entities_slug_type_machine
    ON entities (slug, type)
    WHERE type IN ('workstation', 'standalone-server', 'proxmox-host');

-- Track client enrollment state separately from entity state.
-- An entity may be in provisioning for infrastructure reasons while
-- enrollment (age key, Infisical identity) is complete.
ALTER TABLE entities ADD COLUMN IF NOT EXISTS enrolled_at TIMESTAMPTZ;
ALTER TABLE entities ADD COLUMN IF NOT EXISTS enrolled_by UUID;

-- Context version tracking — incremented when agent files change,
-- so clients can poll GET /context?since= efficiently.
CREATE TABLE IF NOT EXISTS context_version (
    singleton BOOLEAN PRIMARY KEY DEFAULT true
        CHECK (singleton = true),
    version BIGINT NOT NULL DEFAULT 0,
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

INSERT INTO context_version (version) VALUES (0)
    ON CONFLICT (singleton) DO NOTHING;

-- List of files included in the agent context bundle.
CREATE TABLE IF NOT EXISTS context_files (
    path TEXT PRIMARY KEY,
    hash TEXT NOT NULL,
    last_changed TIMESTAMPTZ NOT NULL DEFAULT now()
);