import { NextResponse, NextRequest } from 'next/server';
import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
import { cookies } from 'next/headers';
import { detectDemoModeFromHeaders } from '@/lib/demo-detector';

/**
 * GET /api/signatures-electroniques/pending-count
 * 
 * Endpoint ultra-léger pour compter les signatures employeur en attente
 * Optimisé pour le polling fréquent (30s) sans surcharger Supabase
 * 
 * Retourne : { count: number, org_id: string | null }
 */
export async function GET(req: NextRequest) {
  // 🎭 Mode démo : retourner 0 signatures
  if (detectDemoModeFromHeaders(req.headers)) {
    return NextResponse.json(
      { count: 0, org_id: null, demo: true },
      { 
        status: 200,
        headers: { 
          'Cache-Control': 'public, max-age=30',
          'CDN-Cache-Control': 'public, max-age=30'
        } 
      }
    );
  }

  const reqUrl = new URL(req.url);
  const orgIdParam = reqUrl.searchParams.get('org_id'); // Pour les staff

  // Authentification
  const sb = createRouteHandlerClient({ cookies });
  const { data: { user } } = await sb.auth.getUser();
  
  if (!user) {
    return NextResponse.json({ error: 'unauthorized' }, { status: 401 });
  }

  // Vérifier si l'utilisateur est staff
  let isStaff = false;
  try {
    const { data } = await sb
      .from('staff_users')
      .select('is_staff')
      .eq('user_id', user.id)
      .maybeSingle();
    isStaff = !!data?.is_staff;
  } catch (err) {
    console.warn('⚠️ [pending-count] Erreur vérification staff:', err);
  }

  // Déterminer l'organisation cible
  let orgId: string | null = null;
  
  if (isStaff) {
    // Staff : utiliser le paramètre org_id ou le cookie active_org_id
    if (orgIdParam) {
      orgId = orgIdParam;
    } else {
      try {
        const c = cookies();
        orgId = c.get('active_org_id')?.value || null;
      } catch {}
    }
  } else {
    // Client normal : récupérer son organisation
    try {
      const { data, error } = await sb
        .from('organization_members')
        .select('org_id')
        .eq('user_id', user.id)
        .single();
      
      if (error || !data?.org_id) {
        return NextResponse.json(
          { count: 0, org_id: null, error: 'no_org' },
          { status: 200 }
        );
      }
      
      orgId = data.org_id;
    } catch (err) {
      console.error('❌ [pending-count] Erreur récupération org:', err);
      return NextResponse.json(
        { count: 0, org_id: null, error: 'org_fetch_failed' },
        { status: 200 }
      );
    }
  }

  // Si pas d'organisation, retourner 0 pour les staff (accès global) ou erreur pour les clients
  if (!orgId) {
    if (isStaff) {
      // Staff sans org sélectionnée : retourner 0
      return NextResponse.json(
        { count: 0, org_id: null },
        { 
          status: 200,
          headers: { 
            'Cache-Control': 'public, max-age=30',
            'CDN-Cache-Control': 'public, max-age=30'
          }
        }
      );
    } else {
      // Client sans org : erreur
      return NextResponse.json(
        { count: 0, org_id: null, error: 'no_org' },
        { status: 200 }
      );
    }
  }

  // Requête COUNT() optimisée sur Supabase
  try {
    const { count, error } = await sb
      .from('cddu_contracts')
      .select('*', { count: 'exact', head: true })
      .eq('org_id', orgId)
      .in('etat_de_la_demande', ['traitee', 'Traitée', 'Traitee', 'TRAITEE'])
      .in('contrat_signe_par_employeur', ['non', 'Non', 'NON', 'false', false, null]);

    if (error) {
      console.error('❌ [pending-count] Erreur Supabase:', error);
      return NextResponse.json(
        { count: 0, org_id: orgId, error: 'db_error' },
        { status: 200 }
      );
    }

    console.log(`✅ [pending-count] org_id: ${orgId}, count: ${count || 0}`);

    return NextResponse.json(
      { count: count || 0, org_id: orgId },
      { 
        status: 200,
        headers: { 
          'Cache-Control': 'public, max-age=30',
          'CDN-Cache-Control': 'public, max-age=30'
        }
      }
    );
  } catch (err) {
    console.error('❌ [pending-count] Exception:', err);
    return NextResponse.json(
      { count: 0, org_id: orgId, error: 'exception' },
      { status: 200 }
    );
  }
}
