-- AI Agent configurations: user-editable agent profiles.
-- Seed rows have source='system' and are re-inserted on migration only if
-- missing, so user edits (source='user') are never overwritten.

CREATE TABLE IF NOT EXISTS ai_agents (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100) NOT NULL UNIQUE,
    slug VARCHAR(100) NOT NULL UNIQUE,
    purpose TEXT NOT NULL DEFAULT '',
    model_provider VARCHAR(50) NOT NULL DEFAULT 'ollama',
    model_name VARCHAR(200) NOT NULL DEFAULT 'qwen3.5:9b-fast',
    system_prompt TEXT NOT NULL DEFAULT '',
    user_prompt_template TEXT NOT NULL DEFAULT '',
    prompt_version VARCHAR(100) NOT NULL DEFAULT '',
    schema_version VARCHAR(50) NOT NULL DEFAULT '1.0.0',
    temperature FLOAT DEFAULT 0.0,
    max_tokens INTEGER DEFAULT 32768,
    timeout_seconds INTEGER DEFAULT 120,
    max_retries INTEGER DEFAULT 2,
    active BOOLEAN NOT NULL DEFAULT TRUE,
    source VARCHAR(20) NOT NULL DEFAULT 'system',  -- 'system' or 'user'
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_ai_agents_slug ON ai_agents(slug);
CREATE INDEX IF NOT EXISTS idx_ai_agents_active ON ai_agents(active);

-- Seed the three built-in agents (only if they don't already exist).
-- These prompts MUST match the code defaults in:
--   services/extractor/prompts.py          (SYSTEM_PROMPT)
--   services/extractor/event_classifier.py (_SYSTEM_PROMPT)
--   services/recommendation/thesis_llm.py  (THESIS_SYSTEM_PROMPT)
INSERT INTO ai_agents (name, slug, purpose, model_provider, model_name, system_prompt, prompt_version, schema_version, source)
SELECT * FROM (VALUES
    (
        'Document Intelligence Extractor',
        'document-extractor',
        'Extracts structured intelligence (sentiment, catalysts, impact scores, key facts, risks) from company news, SEC filings, earnings transcripts, and press releases.',
        'ollama',
        'qwen3.5:9b-fast',
        E'You are a financial document analyst. Extract structured data as JSON. Return ONLY a single JSON object. No markdown fences, no explanation, no text before or after the JSON. Every field in the schema is required. Use "other" for catalyst_type if unsure. Keep evidence_spans short (under 20 words each). Keep key_facts to 3-5 items max.',
        'document-intel-v2',
        '2.0.0',
        'system'
    ),
    (
        'Global Event Classifier',
        'event-classifier',
        'Classifies global/geopolitical news into structured macro events with impact type, severity, affected regions/sectors/commodities, and estimated duration.',
        'ollama',
        'qwen3.5:9b-fast',
        E'You classify MACRO-LEVEL global news into structured event JSON. Return ONLY a single JSON object. No markdown, no explanation. Every field is required. Keep key_facts to 3-5 items. Keep summary under 3 sentences.\n\nCRITICAL: Only classify articles about MACRO events that affect entire markets, sectors, or economies. Examples: trade wars, interest rate changes, commodity supply disruptions, regulatory changes, geopolitical conflicts, natural disasters.\n\nDO NOT classify as macro events: individual company earnings, lawsuits against a single company, single-company management changes, individual stock analysis, company-specific debt or bankruptcy, product launches by one company. For these, set severity to "low", confidence below 0.3, and leave affected_regions, affected_sectors, and affected_commodities as empty arrays.',
        'event-classification-v1',
        '1.0.0',
        'system'
    ),
    (
        'Thesis Rewriter',
        'thesis-rewriter',
        'Rewrites deterministic trade thesis summaries into clear, professional analyst prose. Optional layer — system falls back to deterministic thesis if this fails.',
        'ollama',
        'qwen3.5:9b-fast',
        E'You are a concise financial analyst. You rewrite structured trade thesis summaries into clear, professional prose suitable for an internal research note.\n\nSTRICT RULES:\n1. Do NOT add any information that is not present in the input.\n2. Do NOT fabricate numbers, dates, company names, or analyst opinions.\n3. Keep the rewrite under 150 words.\n4. Preserve all factual claims, risk notes, and evidence counts from the input.\n5. Use a neutral, professional tone. Avoid hype or marketing language.\n6. Return ONLY the rewritten thesis text. No JSON, no markdown, no commentary.',
        'thesis-rewrite-v1',
        '1.0.0',
        'system'
    )
) AS v(name, slug, purpose, model_provider, model_name, system_prompt, prompt_version, schema_version, source)
WHERE NOT EXISTS (SELECT 1 FROM ai_agents WHERE ai_agents.slug = v.slug);

-- Agent performance log: per-invocation metrics linked to agent config.
-- This supplements model_performance_metrics with agent-level attribution.
CREATE TABLE IF NOT EXISTS agent_performance_log (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    agent_id UUID NOT NULL REFERENCES ai_agents(id) ON DELETE CASCADE,
    document_id UUID REFERENCES documents(id) ON DELETE SET NULL,
    ticker VARCHAR(20),
    success BOOLEAN NOT NULL,
    duration_ms INTEGER NOT NULL DEFAULT 0,
    confidence FLOAT DEFAULT 0.0,
    retry_count INTEGER DEFAULT 0,
    input_tokens INTEGER DEFAULT 0,
    output_tokens INTEGER DEFAULT 0,
    error_message TEXT,
    recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_agent_perf_agent ON agent_performance_log(agent_id, recorded_at DESC);
CREATE INDEX IF NOT EXISTS idx_agent_perf_time ON agent_performance_log(recorded_at DESC);
