import { NextRequest, NextResponse } from "next/server";
import { createSbServiceRole } from "@/lib/supabaseServer";

export const dynamic = "force-dynamic";

// GET - Récupérer les données d'un salarié par token sécurisé
export async function GET(request: NextRequest) {
  try {
    const { searchParams } = new URL(request.url);
    const token = searchParams.get('token');

    if (!token) {
      return NextResponse.json(
        { error: 'Token d\'accès manquant' },
        { status: 400 }
      );
    }

    const sb = createSbServiceRole();

    // Vérifier le token et récupérer les données du salarié
    const { data: tokenData, error: tokenError } = await sb
      .from('auto_declaration_tokens')
      .select(`
        id,
        salarie_id,
        expires_at,
        used,
        salaries (
          id,
          code_salarie,
          num_salarie,
          salarie,
          nom,
          nom_de_naissance,
          prenom,
          civilite,
          pseudonyme,
          adresse_mail,
          tel,
          adresse,
          date_naissance,
          lieu_de_naissance,
          nir,
          iban,
          bic,
          conges_spectacles,
          derniere_profession,
          employer_id,
          justificatifs_personnels,
          organizations(name)
        )
      `)
      .eq('token', token)
      .single();

    if (tokenError || !tokenData) {
      return NextResponse.json(
        { error: 'Token d\'accès invalide' },
        { status: 403 }
      );
    }

    // Vérifier l'expiration du token
    if (new Date() > new Date(tokenData.expires_at)) {
      return NextResponse.json(
        { error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
        { status: 403 }
      );
    }

    const salarie = tokenData.salaries;

    if (!salarie) {
      return NextResponse.json(
        { error: 'Salarié non trouvé' },
        { status: 404 }
      );
    }

    return NextResponse.json(salarie);

  } catch (error) {
    console.error('Erreur API:', error);
    return NextResponse.json(
      { error: 'Erreur interne du serveur' },
      { status: 500 }
    );
  }
}

// PATCH - Mettre à jour les données d'un salarié
export async function PATCH(request: NextRequest) {
  try {
    const body = await request.json();
    const { token, ...updateData } = body;

    if (!token) {
      return NextResponse.json(
        { error: 'Token d\'accès manquant' },
        { status: 400 }
      );
    }

    const sb = createSbServiceRole();

    // Vérifier le token et récupérer l'ID du salarié
    const { data: tokenData, error: tokenError } = await sb
      .from('auto_declaration_tokens')
      .select('salarie_id, expires_at, used')
      .eq('token', token)
      .single();

    if (tokenError || !tokenData) {
      return NextResponse.json(
        { error: 'Token d\'accès invalide' },
        { status: 403 }
      );
    }

    // Vérifier l'expiration du token
    if (new Date() > new Date(tokenData.expires_at)) {
      return NextResponse.json(
        { error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
        { status: 403 }
      );
    }

    // Préparer les données de mise à jour
    const dataToUpdate: any = {
      updated_at: new Date().toISOString()
    };

    // Mapper les champs autorisés à mettre à jour
    if (updateData.civilite) dataToUpdate.civilite = updateData.civilite;
    if (updateData.nom) dataToUpdate.nom = updateData.nom;
    if (updateData.prenom) dataToUpdate.prenom = updateData.prenom;
    if (updateData.nom_de_naissance !== undefined) dataToUpdate.nom_de_naissance = updateData.nom_de_naissance;
    if (updateData.pseudonyme !== undefined) dataToUpdate.pseudonyme = updateData.pseudonyme;
    if (updateData.adresse_mail) dataToUpdate.adresse_mail = updateData.adresse_mail;
    if (updateData.tel !== undefined) dataToUpdate.tel = updateData.tel;
    if (updateData.adresse !== undefined) dataToUpdate.adresse = updateData.adresse;
    if (updateData.date_naissance !== undefined) dataToUpdate.date_naissance = updateData.date_naissance;
    if (updateData.lieu_de_naissance !== undefined) dataToUpdate.lieu_de_naissance = updateData.lieu_de_naissance;
    if (updateData.nir !== undefined) dataToUpdate.nir = updateData.nir;
    if (updateData.conges_spectacles !== undefined) dataToUpdate.conges_spectacles = updateData.conges_spectacles;
    if (updateData.iban !== undefined) dataToUpdate.iban = updateData.iban;
    if (updateData.bic !== undefined) dataToUpdate.bic = updateData.bic;
    if (updateData.derniere_profession !== undefined) dataToUpdate.derniere_profession = updateData.derniere_profession;
    if (updateData.notes) {
      // Récupérer les notes existantes pour les préserver
      const { data: currentSalarie } = await sb
        .from('salaries')
        .select('notes, justificatifs_personnels')
        .eq('id', tokenData.salarie_id)
        .single();
      
      // Préparer la nouvelle note avec horodatage
      const currentDate = new Date().toISOString().split('T')[0];
      const currentTime = new Date().toLocaleString('fr-FR');
      const newNote = `[${currentTime} - Auto-déclaration]\n${updateData.notes}`;
      
      // Ajouter aux notes existantes ou créer une nouvelle note
      if (currentSalarie?.notes) {
        dataToUpdate.notes = `${currentSalarie.notes}\n\n${newNote}`;
      } else {
        dataToUpdate.notes = newNote;
      }
      
      // Également ajouter aux justificatifs personnels (format JSON) pour historique
      const noteEntry = {
        date: currentDate,
        source: 'auto-declaration',
        notes: updateData.notes
      };
      
      dataToUpdate.justificatifs_personnels = JSON.stringify([noteEntry]);
    }

    // Si le nom ou le prénom change, mettre à jour automatiquement la colonne "salarie"
    if (updateData.nom || updateData.prenom) {
      // Récupérer les données actuelles pour compléter
      const { data: currentData } = await sb
        .from('salaries')
        .select('nom, prenom')
        .eq('id', tokenData.salarie_id)
        .single();
      
      if (currentData) {
        const newNom = updateData.nom || currentData.nom;
        const newPrenom = updateData.prenom || currentData.prenom;
        
        // Mettre à jour "salarie" avec le format "NOM + Prénom"
        if (newNom || newPrenom) {
          const nomUpper = (newNom || '').toUpperCase().trim();
          const prenomCapitalized = (newPrenom || '').trim();
          dataToUpdate.salarie = [nomUpper, prenomCapitalized].filter(Boolean).join(' ');
        }
      }
    }

    // Mettre à jour le salarié
    const { data, error } = await sb
      .from('salaries')
      .update(dataToUpdate)
      .eq('id', tokenData.salarie_id)
      .select()
      .single();

    if (error) {
      console.error('Erreur Supabase update:', error);
      return NextResponse.json(
        { error: 'Erreur lors de la mise à jour' },
        { status: 500 }
      );
    }

    // Marquer le token comme utilisé (optionnel)
    await sb
      .from('auto_declaration_tokens')
      .update({ 
        used: true, 
        used_at: new Date().toISOString() 
      })
      .eq('token', token);

    return NextResponse.json({
      success: true,
      data: data
    });

  } catch (error) {
    console.error('Erreur API:', error);
    return NextResponse.json(
      { error: 'Erreur interne du serveur' },
      { status: 500 }
    );
  }
}