-- Migración 017: tabla areas + area_id en processes + RLS + bulk-assign org
-- Completamente aditiva — no elimina columnas, tablas ni políticas existentes.

-- ── Paso 1: Crear tabla areas ─────────────────────────────────────────────────
-- Nueva tabla areas: reemplazará process_groups como agrupador normalizado por org

CREATE TABLE IF NOT EXISTS public.areas (
  id          uuid        PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id      uuid        NOT NULL REFERENCES public.organizations(id) ON DELETE CASCADE,
  name        text        NOT NULL,
  description text,
  created_at  timestamptz NOT NULL DEFAULT now(),
  updated_at  timestamptz NOT NULL DEFAULT now()
);

ALTER TABLE public.areas ENABLE ROW LEVEL SECURITY;

-- ── Paso 2: Agregar area_id a processes ───────────────────────────────────────
-- area_id reemplazará group_id como agrupador normalizado dentro de una org.
-- Nullable: procesos sin área asignada son válidos ("Sin área").

ALTER TABLE public.processes
  ADD COLUMN IF NOT EXISTS area_id uuid REFERENCES public.areas(id) ON DELETE SET NULL;

-- ── Paso 3: RLS para areas ────────────────────────────────────────────────────
-- SELECT: InQuality ve todas las áreas; cliente ve solo las de su org

CREATE POLICY "areas_select" ON public.areas
  FOR SELECT USING (
    public.is_inquality()
    OR org_id = public.current_org()
  );

-- INSERT / UPDATE / DELETE: solo platform_admin

CREATE POLICY "areas_insert" ON public.areas
  FOR INSERT WITH CHECK (
    public.current_platform_role() = 'platform_admin'
  );

CREATE POLICY "areas_update" ON public.areas
  FOR UPDATE USING (
    public.current_platform_role() = 'platform_admin'
  );

CREATE POLICY "areas_delete" ON public.areas
  FOR DELETE USING (
    public.current_platform_role() = 'platform_admin'
  );

-- ── Paso 4: Migración de datos — asignar procesos sin org a InQuality ─────────
-- Procesos sin org_id son datos de prueba de InQuality.
-- Asignarlos a la org de InQuality (is_provider = true) para limpiar los NULLs.

UPDATE public.processes
SET org_id = (
  SELECT id FROM public.organizations WHERE is_provider = true LIMIT 1
)
WHERE org_id IS NULL;
