-- Migration RLS pour la table documents
-- Permet aux clients d'accéder uniquement à leurs documents
-- et au staff d'accéder à tous les documents

-- Activer RLS sur la table documents
ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY;

-- Supprimer les politiques existantes si elles existent
DROP POLICY IF EXISTS "documents_staff_read" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_insert" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_update" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_delete" ON public.documents;
DROP POLICY IF EXISTS "documents_client_read" ON public.documents;
DROP POLICY IF EXISTS "documents_system_insert" ON public.documents;
DROP POLICY IF EXISTS "documents_system_update" ON public.documents;
DROP POLICY IF EXISTS "documents_system_delete" ON public.documents;

-- Politique de lecture pour le staff : accès à tous les documents
CREATE POLICY "documents_staff_read" ON public.documents
  FOR SELECT
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.staff_users s
      WHERE s.user_id = auth.uid() 
      AND COALESCE(s.is_staff, false) = true
    )
  );

-- Politique d'insertion pour le staff
CREATE POLICY "documents_staff_insert" ON public.documents
  FOR INSERT
  TO authenticated
  WITH CHECK (
    EXISTS (
      SELECT 1 FROM public.staff_users s
      WHERE s.user_id = auth.uid() 
      AND COALESCE(s.is_staff, false) = true
    )
  );

-- Politique de mise à jour pour le staff
CREATE POLICY "documents_staff_update" ON public.documents
  FOR UPDATE
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.staff_users s
      WHERE s.user_id = auth.uid() 
      AND COALESCE(s.is_staff, false) = true
    )
  )
  WITH CHECK (
    EXISTS (
      SELECT 1 FROM public.staff_users s
      WHERE s.user_id = auth.uid() 
      AND COALESCE(s.is_staff, false) = true
    )
  );

-- Politique de suppression pour le staff
CREATE POLICY "documents_staff_delete" ON public.documents
  FOR DELETE
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.staff_users s
      WHERE s.user_id = auth.uid() 
      AND COALESCE(s.is_staff, false) = true
    )
  );

-- Politique de lecture pour les clients : accès uniquement aux documents de leur organisation
CREATE POLICY "documents_client_read" ON public.documents
  FOR SELECT
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.organization_members m
      WHERE m.user_id = auth.uid()
      AND m.revoked = false
      AND m.org_id = documents.org_id
    )
  );

-- Politique d'insertion pour le système (service role)
CREATE POLICY "documents_system_insert" ON public.documents
  FOR INSERT
  WITH CHECK (true);

-- Politique de mise à jour pour le système (service role)
CREATE POLICY "documents_system_update" ON public.documents
  FOR UPDATE
  USING (true)
  WITH CHECK (true);

-- Politique de suppression pour le système (service role)
CREATE POLICY "documents_system_delete" ON public.documents
  FOR DELETE
  USING (true);

-- Créer un index sur org_id pour optimiser les requêtes RLS
CREATE INDEX IF NOT EXISTS idx_documents_org_id ON public.documents(org_id);

-- Créer un index sur category pour optimiser le filtrage par catégorie
CREATE INDEX IF NOT EXISTS idx_documents_category ON public.documents(category);

-- Créer un index composite pour les requêtes fréquentes (org + category)
CREATE INDEX IF NOT EXISTS idx_documents_org_category ON public.documents(org_id, category);

-- Créer un index sur date_added pour le tri chronologique
CREATE INDEX IF NOT EXISTS idx_documents_date_added ON public.documents(date_added DESC);

-- Test de vérification : cette requête devrait retourner TRUE si vous êtes staff
SELECT EXISTS (
  SELECT 1 FROM public.staff_users 
  WHERE staff_users.user_id = auth.uid() 
  AND COALESCE(staff_users.is_staff, false) = true
) as is_current_user_staff;

-- Test de vérification : liste des organisations auxquelles l'utilisateur a accès
SELECT DISTINCT org_id 
FROM public.organization_members 
WHERE user_id = auth.uid() 
AND revoked = false;

-- Commentaire sur la table pour documentation
COMMENT ON TABLE public.documents IS 'Documents migré depuis Airtable vers S3/Supabase. RLS activé pour sécuriser l''accès par organisation.';
