-- ═══════════════════════════════════════════════════════════════════════════
-- PETRI TECNOLOGIA — Schema Supabase
-- Cole e execute este script inteiro no SQL Editor do seu projeto Supabase
-- supabase.com → Seu Projeto → SQL Editor → New Query → Cole → Run
-- ═══════════════════════════════════════════════════════════════════════════

-- ── EXTENSÕES ───────────────────────────────────────────────────────────────
CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- ── TABELA PRINCIPAL ────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS briefings (
  id           UUID        PRIMARY KEY DEFAULT gen_random_uuid(),
  created_at   TIMESTAMPTZ NOT NULL    DEFAULT NOW(),
  updated_at   TIMESTAMPTZ NOT NULL    DEFAULT NOW(),
  client_name  TEXT        NOT NULL,
  type         TEXT        NOT NULL    CHECK (type IN ('onepage', 'multipaginas', 'vendas')),
  status       TEXT        NOT NULL    DEFAULT 'pending'
                                       CHECK (status IN ('pending', 'completed')),
  -- Token único de 64 chars hex — viaja na URL, não o ID nem o nome do cliente
  token        TEXT        NOT NULL    UNIQUE DEFAULT encode(gen_random_bytes(32), 'hex'),
  completed_at TIMESTAMPTZ,
  sections     JSONB,
  notes        TEXT,
  agency_id    UUID        NOT NULL    REFERENCES auth.users(id) ON DELETE CASCADE
);

-- Índices para performance
CREATE INDEX IF NOT EXISTS briefings_agency_id_idx    ON briefings(agency_id);
CREATE INDEX IF NOT EXISTS briefings_status_idx       ON briefings(status);
CREATE INDEX IF NOT EXISTS briefings_token_idx        ON briefings(token);
CREATE INDEX IF NOT EXISTS briefings_created_at_idx   ON briefings(created_at DESC);

-- Realtime: precisa de REPLICA IDENTITY FULL para o canal escutar mudanças
ALTER TABLE briefings REPLICA IDENTITY FULL;

-- ── TRIGGER: updated_at automático ──────────────────────────────────────────
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
  NEW.updated_at = NOW();
  RETURN NEW;
END;
$$;

DROP TRIGGER IF EXISTS trg_briefings_updated_at ON briefings;
CREATE TRIGGER trg_briefings_updated_at
  BEFORE UPDATE ON briefings
  FOR EACH ROW EXECUTE FUNCTION update_updated_at();

-- ── ROW LEVEL SECURITY ───────────────────────────────────────────────────────
-- Usuários autenticados (a agência) só veem e alteram os próprios briefings
ALTER TABLE briefings ENABLE ROW LEVEL SECURITY;

DROP POLICY IF EXISTS "agency_manage_own" ON briefings;
CREATE POLICY "agency_manage_own" ON briefings
  FOR ALL TO authenticated
  USING     (auth.uid() = agency_id)
  WITH CHECK(auth.uid() = agency_id);

-- ── FUNÇÃO PÚBLICA: ler briefing pelo token (client-facing) ─────────────────
-- Retorna somente id, client_name e type — nunca expõe agency_id, sections etc.
-- SECURITY DEFINER = roda com privilégios do dono, bypassando RLS de forma controlada
DROP FUNCTION IF EXISTS public.get_briefing_by_token(TEXT);
CREATE OR REPLACE FUNCTION public.get_briefing_by_token(p_token TEXT)
RETURNS TABLE(id UUID, client_name TEXT, type TEXT, status TEXT)
LANGUAGE sql
SECURITY DEFINER
SET search_path = public
AS $$
  SELECT id, client_name, type, status
  FROM   briefings
  WHERE  token = p_token
  LIMIT  1;
$$;

-- ── FUNÇÃO PÚBLICA: submeter respostas pelo token (client-facing) ────────────
-- Só atualiza status/sections — não pode ler, inserir ou deletar outros dados
-- Falha silenciosamente se o token for inválido ou o briefing já respondido
DROP FUNCTION IF EXISTS public.submit_briefing(TEXT, JSONB);
CREATE OR REPLACE FUNCTION public.submit_briefing(p_token TEXT, p_sections JSONB)
RETURNS BOOLEAN
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
  v_rows INTEGER;
BEGIN
  UPDATE briefings
  SET    status       = 'completed',
         completed_at = NOW(),
         sections     = p_sections
  WHERE  token  = p_token
    AND  status = 'pending';      -- idempotente: não sobrescreve briefing já respondido

  GET DIAGNOSTICS v_rows = ROW_COUNT;
  RETURN v_rows > 0;
END;
$$;

-- Conceder execução das funções públicas para usuários anônimos (os clientes)
GRANT EXECUTE ON FUNCTION public.get_briefing_by_token TO anon;
GRANT EXECUTE ON FUNCTION public.submit_briefing       TO anon;

-- ═══════════════════════════════════════════════════════════════════════════
-- APÓS EXECUTAR ESTE SQL:
-- 1. Vá em Authentication → Users → Add User → crie seu e-mail e senha
-- 2. Vá em Project Settings → API → copie:
--      • Project URL  → cole em SUPABASE_URL nos arquivos HTML
--      • anon public  → cole em SUPABASE_ANON_KEY nos arquivos HTML
-- ═══════════════════════════════════════════════════════════════════════════
