'use client';
import React, { useState, useEffect } from 'react';
import { useSearchParams, useRouter } from 'next/navigation';
import ValidateSubscription from '@/components/Inscription/ValidateSubscription';
import { editRegisterForm } from '@/app/actions/subscriptionAction';
import { fetchClasses } from '@/app/actions/schoolAction';
import { useCsrfToken } from '@/context/CsrfContext';
import logger from '@/utils/logger';
import Loader from '@/components/Loader';
import { useEstablishment } from '@/context/EstablishmentContext';
import { FE_ADMIN_SUBSCRIPTIONS_URL } from '@/utils/Url';
import { useNotification } from '@/context/NotificationContext';
import { editRegistrationSchoolFileTemplates, editRegistrationParentFileTemplates } from '@/app/actions/registerFileGroupAction';

export default function Page() {
  const [isLoadingRefuse, setIsLoadingRefuse] = useState(false);
  const searchParams = useSearchParams();
  const router = useRouter();
  const [isLoading, setIsLoading] = useState(false);

  // Récupérer les paramètres de la requête
  const studentId = searchParams.get('studentId');
  const firstName = searchParams.get('firstName');
  const lastName = searchParams.get('lastName');
  const email = searchParams.get('email');
  const level = searchParams.get('level');
  const sepa_file =
    searchParams.get('sepa_file') === 'null'
      ? null
      : searchParams.get('sepa_file');
  const student_file = searchParams.get('student_file');

  const [classes, setClasses] = useState([]);

  const csrfToken = useCsrfToken();
  const { selectedEstablishmentId } = useEstablishment();
  const { showNotification } = useNotification();

  const requestErrorHandler = (err) => {
    logger.error('Error fetching data:', err);
  };

  useEffect(() => {
    if (selectedEstablishmentId) {
      setIsLoading(true);
      fetchClasses(selectedEstablishmentId)
        .then((classesData) => {
          logger.debug('Classes récupérées :', classesData);

          // Filtrer les classes par niveau
          const filteredClasses = classesData.filter(
            (classe) => classe.levels.includes(parseInt(level, 10)) // Vérifier si le niveau de l'étudiant est dans les niveaux de la classe
          );

          setClasses(filteredClasses); // Mettre à jour les classes filtrées
          setIsLoading(false);
        })
        .catch(requestErrorHandler);
    }
  }, [selectedEstablishmentId]);

  const handleAcceptRF = (data) => {
    const formData = new FormData();
    formData.append('data', JSON.stringify(data));

    setIsLoading(true);
    // Appeler l'API pour mettre à jour le RF
    editRegisterForm(studentId, formData, csrfToken)
      .then((response) => {
        logger.debug('RF mis à jour avec succès:', response);
        showNotification(
          'Le dossier d\'inscription a été validé avec succès',
          'success',
          'Succès'
        );
        router.push(FE_ADMIN_SUBSCRIPTIONS_URL);
        setIsLoading(false);
      })
      .catch((error) => {
        showNotification(
          "Erreur lors de la validation du dossier d'inscription",
          'error',
          'Erreur'
        );
        setIsLoading(false);
        logger.error('Erreur lors de la mise à jour du RF:', error);
      });
  };


  const handleRefuseRF = (data) => {
    const formData = new FormData();
    formData.append('data', JSON.stringify(data));
    editRegisterForm(studentId, formData, csrfToken)
      .then((response) => {
        logger.debug('RF refusé et archivé:', response);
        showNotification('Le dossier a été refusé et archivé.', 'success', 'Succès');
        router.push(FE_ADMIN_SUBSCRIPTIONS_URL);
        setIsLoadingRefuse(false);
      })
      .catch((error) => {
        showNotification('Erreur lors du refus du dossier.', 'error', 'Erreur');
        setIsLoadingRefuse(false);
        logger.error('Erreur lors du refus du RF:', error);
      });
  };

    // Validation/refus d'un document individuel (hors fiche élève)
    const handleValidateOrRefuseDoc = ({ templateId, type, validated, csrfToken }) => {
      if (!templateId) return;
      let editFn = null;
      if (type === 'school') {
        editFn = editRegistrationSchoolFileTemplates;
      } else if (type === 'parent') {
        editFn = editRegistrationParentFileTemplates;
      }
      if (!editFn) return;
      const updateData = new FormData();
      updateData.append('data', JSON.stringify({ isValidated: validated }));
      editFn(templateId, updateData, csrfToken)
        .then((response) => {
          logger.debug(`Document ${validated ? 'validé' : 'refusé'} (type: ${type}, id: ${templateId})`, response);
        })
        .catch((error) => {
          logger.error('Erreur lors de la validation/refus du document:', error);
        });
    };

  if (isLoading) {
    return <Loader />;
  }

  return (
    <ValidateSubscription
      studentId={studentId}
      firstName={firstName}
      lastName={lastName}
      email={email}
      sepa_file={sepa_file}
      student_file={student_file}
      onAccept={handleAcceptRF}
      classes={classes}
      onRefuse={handleRefuseRF}
      isLoadingRefuse={isLoadingRefuse}
      handleValidateOrRefuseDoc={handleValidateOrRefuseDoc}
      csrfToken={csrfToken}
    />
  );
}
