// app/api/staff/facturation/bulk-notify/route.ts
import { NextResponse } from "next/server";
import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { cookies } from "next/headers";
import { sendInvoiceEmail as sendUniversalInvoiceEmail } from "@/lib/emailMigrationHelpers";

export const dynamic = 'force-dynamic';
export const revalidate = 0;
export const runtime = 'nodejs';

async function isStaffUser(supabase: any, userId: string): Promise<boolean> {
  try {
    const { data: staffRow } = await supabase
      .from('staff_users')
      .select('is_staff')
      .eq('user_id', userId)
      .maybeSingle();
    return !!staffRow?.is_staff;
  } catch {
    return false;
  }
}

// Construit un message personnalisé selon le type de facture
function buildInvoiceCustomMessage(invoice: any): string {
  switch (invoice.invoice_type) {
    case 'paie_mensuelle':
      const periodText = invoice.period_label || 'du mois';
      // Cas spécial pour les paiements par virement
      if (invoice.payment_method === 'virement') {
        return `Votre facture pour la période ${periodText} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour le virement.`;
      }
      // Cas normal (SEPA)
      return `Votre facture pour la période ${periodText} est disponible et sera prélevée à la date indiquée ci-dessous.`;
    case 'paie_ouverture':
      return `Votre facture d'ouverture de compte est disponible et sera prélevée à la date indiquée ci-dessous`;
    case 'studio_site_web':
      const siteNameCreation = invoice.site_name || '';
      if (invoice.payment_method === 'virement') {
        return `Votre facture pour la création de votre site web ${siteNameCreation} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour effectuer le virement.<br><br>Toute l'équipe Odentas vous remercie pour votre confiance et reste à votre disposition pour toute question, en réponse de cet e-mail ou sur WhatsApp au <a href="https://wa.me/33780978000" style="color:#0B5FFF; text-decoration:none;">07 80 978 000</a>.`.trim();
      }
      return `Votre facture pour la création du site web ${siteNameCreation} est disponible et sera prélevée à la date indiquée ci-dessous.`.trim();
    case 'studio_renouvellement':
      const siteNameRenewal = invoice.site_name || '';
      if (invoice.payment_method === 'virement') {
        return `Votre facture pour le renouvellement de l'hébergement de votre site web ${siteNameRenewal} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour effectuer le virement.<br><br>Toute l'équipe Odentas vous remercie pour votre confiance et reste à votre disposition pour toute question, en réponse de cet e-mail ou sur WhatsApp au <a href="https://wa.me/33780978000" style="color:#0B5FFF; text-decoration:none;">07 80 978 000</a>.`.trim();
      }
      return `Votre facture pour le renouvellement du site web ${siteNameRenewal} est disponible et sera prélevée à la date indiquée ci-dessous.`.trim();
    default:
      const defaultPeriodText = invoice.period_label || 'du mois';
      console.warn('[buildInvoiceCustomMessage] Unknown invoice_type:', invoice.invoice_type, 'for invoice:', invoice.id);
      return `Votre facture pour la période ${defaultPeriodText} est disponible et sera prélevée à la date indiquée ci-dessous.`;
  }
}

// POST - Envoyer les notifications pour plusieurs factures
export async function POST(req: Request) {
  try {
    console.log('[api/staff/facturation/bulk-notify] POST request');
    
    const supabase = createRouteHandlerClient({ cookies });
    const { data: { session } } = await supabase.auth.getSession();
    if (!session) return NextResponse.json({ error: 'unauthorized' }, { status: 401 });

    // Vérifier que l'utilisateur est staff
    const isStaff = await isStaffUser(supabase, session.user.id);
    if (!isStaff) {
      return NextResponse.json({ error: 'forbidden', message: 'Staff access required' }, { status: 403 });
    }

    const body = await req.json();
    const { invoiceIds } = body;

    if (!invoiceIds || !Array.isArray(invoiceIds) || invoiceIds.length === 0) {
      return NextResponse.json({ error: 'invalid_input', message: 'invoiceIds requis' }, { status: 400 });
    }

    console.log(`[api/staff/facturation/bulk-notify] Processing ${invoiceIds.length} invoices`);

    // Récupérer toutes les factures avec les informations des organisations
    const { data: invoices, error: invoicesError } = await supabase
      .from('invoices')
      .select(`
        *,
        organizations!inner(
          id,
          structure_api,
          organization_details!inner(
            email_notifs,
            email_notifs_cc,
            prenom_contact,
            code_employeur
          )
        )
      `)
      .in('id', invoiceIds);

    if (invoicesError) {
      console.error('[api/staff/facturation/bulk-notify] Invoices error:', invoicesError);
      return NextResponse.json({ error: 'fetch_failed', message: invoicesError.message }, { status: 500 });
    }

    if (!invoices || invoices.length === 0) {
      return NextResponse.json({ error: 'no_invoices_found' }, { status: 404 });
    }

    const results = [];
    let successCount = 0;
    let errorCount = 0;

    // Traiter chaque facture
    for (const invoice of invoices) {
      try {
        const organization = invoice.organizations;
        const organizationDetails = organization.organization_details;
        
        if (!organizationDetails.email_notifs) {
          results.push({
            invoiceId: invoice.id,
            success: false,
            error: 'no_notification_email'
          });
          errorCount++;
          continue;
        }

        // Utiliser le prénom du contact directement
        const firstName = organizationDetails.prenom_contact || "";
        const organizationName: string | undefined = organization?.structure_api || undefined;
        
        const amountFormatted = new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR" }).format(invoice.amount_ttc || 0);
        const customMessage = buildInvoiceCustomMessage(invoice);
        
        // Pour les factures studio, utiliser le lien de téléchargement direct
        // Pour les factures paie, utiliser l'Espace Paie
        const isStudioInvoice = invoice.invoice_type === 'studio_renouvellement' || invoice.invoice_type === 'studio_site_web';
        const ctaUrl = isStudioInvoice 
          ? `${process.env.NEXT_PUBLIC_SITE_URL}/api/public/invoices/${invoice.id}/download`
          : `${process.env.NEXT_PUBLIC_SITE_URL}/facturation`;
        
        // Envoyer l'email
        await sendUniversalInvoiceEmail(
          organizationDetails.email_notifs,
          organizationDetails.email_notifs_cc,
          {
            firstName,
            organizationName,
            employerCode: organizationDetails.code_employeur || undefined,
            invoiceNumber: invoice.invoice_number || invoice.id.slice(0, 8),
            amount: amountFormatted,
            customMessage,
            invoiceDate: invoice.invoice_date ? new Date(invoice.invoice_date).toLocaleDateString('fr-FR') : undefined,
            sepaDate: invoice.sepa_day ? new Date(invoice.sepa_day).toLocaleDateString('fr-FR') : undefined,
            ctaUrl,
            paymentMethod: invoice.payment_method,
            invoiceType: invoice.invoice_type,
            siteName: invoice.site_name || undefined,
          }
        );

        // Marquer la facture comme notifiée
        const { error: updateError } = await supabase
          .from('invoices')
          .update({
            notified: true,
            updated_at: new Date().toISOString()
          })
          .eq('id', invoice.id);

        if (updateError) {
          console.error('[api/staff/facturation/bulk-notify] Update error for invoice:', invoice.id, updateError);
          results.push({
            invoiceId: invoice.id,
            success: false,
            error: 'update_failed'
          });
          errorCount++;
        } else {
          results.push({
            invoiceId: invoice.id,
            success: true
          });
          successCount++;
        }

      } catch (error) {
        console.error('[api/staff/facturation/bulk-notify] Error processing invoice:', invoice.id, error);
        results.push({
          invoiceId: invoice.id,
          success: false,
          error: error instanceof Error ? error.message : 'unknown_error'
        });
        errorCount++;
      }
    }

    console.log(`[api/staff/facturation/bulk-notify] Completed: ${successCount} success, ${errorCount} errors`);

    return NextResponse.json({
      success: true,
      summary: {
        total: invoices.length,
        success: successCount,
        failed: errorCount
      },
      results
    });

  } catch (error) {
    console.error('[api/staff/facturation/bulk-notify] Error:', error);
    const message = error instanceof Error ? error.message : String(error);
    return NextResponse.json({ 
      error: 'internal_server_error', 
      message 
    }, { status: 500 });
  }
}
