'use client'; import React, { useState, useEffect } from 'react'; import Popup from '@/components/Popup'; import ToggleSwitch from '@/components/Form/ToggleSwitch'; import SelectChoice from '@/components/Form/SelectChoice'; import { fetchSchoolFileTemplatesFromRegistrationFiles, fetchParentFileTemplatesFromRegistrationFiles, } from '@/app/actions/subscriptionAction'; import { getSecureFileUrl } from '@/utils/fileUrl'; import logger from '@/utils/logger'; import { School, FileText } from 'lucide-react'; import SectionHeader from '@/components/SectionHeader'; import Button from '@/components/Form/Button'; export default function ValidateSubscription({ studentId, firstName, email, lastName, sepa_file, student_file, onAccept, onRefuse, classes, handleValidateOrRefuseDoc, csrfToken, }) { const [schoolFileTemplates, setSchoolFileTemplates] = useState([]); const [parentFileTemplates, setParentFileTemplates] = useState([]); const [currentTemplateIndex, setCurrentTemplateIndex] = useState(0); const [mergeDocuments, setMergeDocuments] = useState(false); const [isPageValid, setIsPageValid] = useState(false); // Pour la validation/refus des documents const [docStatuses, setDocStatuses] = useState({}); // {index: 'accepted'|'refused'} // Met à jour docStatuses selon isValidated des templates récupérés useEffect(() => { // On construit la map index -> status à partir des templates const newStatuses = {}; // Fiche élève (pas de validation individuelle) newStatuses[0] = undefined; // School templates schoolFileTemplates.forEach((tpl, i) => { if (typeof tpl.isValidated === 'boolean') { newStatuses[1 + i] = tpl.isValidated ? 'accepted' : 'refused'; } }); // Parent templates parentFileTemplates.forEach((tpl, i) => { if (typeof tpl.isValidated === 'boolean') { newStatuses[1 + schoolFileTemplates.length + i] = tpl.isValidated ? 'accepted' : 'refused'; } }); setDocStatuses((s) => ({ ...s, ...newStatuses })); }, [schoolFileTemplates, parentFileTemplates]); const [showRefusedPopup, setShowRefusedPopup] = useState(false); // Affiche la popup de confirmation finale (tous docs validés et classe sélectionnée) const [showFinalValidationPopup, setShowFinalValidationPopup] = useState(false); const [formData, setFormData] = useState({ associated_class: null, }); useEffect(() => { if (classes.length > 0) { // Si l'étudiant a déjà une classe associée, initialisez formData avec cette classe const initialClass = classes.find( (classe) => classe.id === formData.associated_class ); setFormData({ associated_class: initialClass ? initialClass.id : null, }); } }, [classes]); // Mettre à jour isPageValid en fonction de la sélection de la classe useEffect(() => { setIsPageValid(!!formData.associated_class); // true si une classe est sélectionnée, sinon false }, [formData.associated_class]); useEffect(() => { // Récupérer les fichiers schoolFileTemplates fetchSchoolFileTemplatesFromRegistrationFiles(studentId) .then((data) => { setSchoolFileTemplates(data); logger.debug('Fichiers schoolFileTemplates récupérés:', data); }) .catch((error) => logger.error( 'Erreur lors de la récupération des schoolFileTemplates:', error ) ); // Récupérer les fichiers parentFileTemplates fetchParentFileTemplatesFromRegistrationFiles(studentId) .then((data) => { setParentFileTemplates(data); logger.debug('Fichiers parentFileTemplates récupérés:', data); }) .catch((error) => logger.error( 'Erreur lors de la récupération des parentFileTemplates:', error ) ); }, [studentId]); const handleToggleMergeDocuments = () => { setMergeDocuments((prevState) => !prevState); }; const handleAssignClass = () => { if (formData.associated_class) { const data = { student: { associated_class: formData.associated_class, }, status: 5, fusionParam: mergeDocuments, notes: 'Dossier validé', }; onAccept(data); } else { logger.warn('Aucune classe sélectionnée.'); } }; const handleRefuseDossier = () => { // Message clair avec la liste des documents refusés let notes = 'Dossier non validé pour les raisons suivantes :\n'; notes += refusedDocs.map((doc) => `- ${doc.name}`).join('\n'); const data = { status: 2, notes, }; if (onRefuse) { onRefuse(data); } }; const onChange = (field, value) => { setFormData((prev) => ({ ...prev, [field]: value, })); }; const allTemplates = [ { name: 'Fiche élève', file: `/api/generate-pdf?studentId=${studentId}`, type: 'main', }, ...schoolFileTemplates.map((template) => ({ name: template.name || 'Document scolaire', file: template.file, description: template.description, })), ...parentFileTemplates.map((template) => ({ name: template.master_name || 'Document parent', file: template.file, description: template.description, })), ...(sepa_file ? [ { name: 'Mandat SEPA', file: sepa_file, description: 'Mandat SEPA pour prélèvement automatique', }, ] : []), ]; // Récupère la liste des documents refusés (inclut la fiche élève si refusée) const refusedDocs = allTemplates .map((doc, idx) => ({ ...doc, idx })) .filter((doc, idx) => docStatuses[idx] === 'refused'); // Récupère la liste des documents à cocher (hors fiche élève) const docIndexes = allTemplates .map((_, idx) => idx) .filter((idx) => idx !== 0); const allChecked = docIndexes.length > 0 && docIndexes.every( (idx) => docStatuses[idx] === 'accepted' || docStatuses[idx] === 'refused' ); const allValidated = docIndexes.length > 0 && docIndexes.every((idx) => docStatuses[idx] === 'accepted'); const hasRefused = docIndexes.some((idx) => docStatuses[idx] === 'refused'); logger.debug(allTemplates); return (