-- 0041_provider_model_refactor
-- Move client_type to llm_providers, add icon, replace model columns with config JSONB.

-- 1. Add client_type and icon to llm_providers (IF EXISTS for fresh-schema compat)
ALTER TABLE IF EXISTS llm_providers
  ADD COLUMN IF NOT EXISTS client_type TEXT NOT NULL DEFAULT 'openai-completions',
  ADD COLUMN IF NOT EXISTS icon TEXT;

-- 2–6. Backfill and migrate only when old columns exist (idempotent for fresh DBs).
DO $$ BEGIN
  -- Back-fill provider client_type from models.client_type (old column)
  IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'models' AND column_name = 'client_type') THEN
    UPDATE llm_providers p
    SET client_type = sub.client_type
    FROM (
      SELECT DISTINCT ON (llm_provider_id) llm_provider_id, client_type
      FROM models
      WHERE client_type IS NOT NULL AND client_type != ''
      ORDER BY llm_provider_id, created_at ASC
    ) sub
    WHERE p.id = sub.llm_provider_id;
  END IF;

  -- Add CHECK constraint (skip if already present)
  IF NOT EXISTS (SELECT 1 FROM information_schema.table_constraints WHERE constraint_name = 'llm_providers_client_type_check') THEN
    ALTER TABLE llm_providers
      ADD CONSTRAINT llm_providers_client_type_check
      CHECK (client_type IN ('openai-responses', 'openai-completions', 'anthropic-messages', 'google-generative-ai'));
  END IF;

  -- Add config JSONB to models
  IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'models' AND column_name = 'config') THEN
    ALTER TABLE models ADD COLUMN config JSONB NOT NULL DEFAULT '{}'::jsonb;
  END IF;

  -- Migrate existing columns into config (only when old columns exist)
  IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'models' AND column_name = 'dimensions') THEN
    UPDATE models SET config = jsonb_strip_nulls(jsonb_build_object(
      'dimensions', dimensions,
      'compatibilities', (
        SELECT coalesce(jsonb_agg(c), '[]'::jsonb) FROM (
          SELECT 'tool-call' AS c
          UNION ALL
          SELECT 'vision' WHERE 'image' = ANY(input_modalities)
          UNION ALL
          SELECT 'reasoning' WHERE supports_reasoning = true
        ) AS caps
      ),
      'context_window', NULL
    ));
  END IF;
END $$;

-- Drop old columns and constraints (IF EXISTS makes these safe on fresh DBs)
ALTER TABLE models DROP CONSTRAINT IF EXISTS models_client_type_check;
ALTER TABLE models DROP CONSTRAINT IF EXISTS models_chat_client_type_check;
ALTER TABLE models DROP CONSTRAINT IF EXISTS models_dimensions_check;

ALTER TABLE models DROP COLUMN IF EXISTS client_type;
ALTER TABLE models DROP COLUMN IF EXISTS dimensions;
ALTER TABLE models DROP COLUMN IF EXISTS input_modalities;
ALTER TABLE models DROP COLUMN IF EXISTS supports_reasoning;
