<?php

namespace App\Service\Pdf;

use App\Entity\Ag\Main;
use App\Entity\Members;
use Doctrine\ORM\EntityManagerInterface;
use Fpdf\Fpdf;
use Symfony\Component\HttpKernel\KernelInterface;

class AgAdh extends Fpdf
{
    private Main $main;
    private KernelInterface $kernel;
    private EntityManagerInterface $em;

    // Données d'association simulées (à remplacer par de vraies données si disponibles via Kernel ou autre)
    private array $associationData = [
        'name' => 'E-Cosplay Association',
        'address' => '42 rue de saint-quentin',
        'city' => '02800 Beautor',
        'rna' => 'W022006988',
        'type' => 'Association loi 1901 à but non lucratif',
    ];

    public function setData(Main $main, KernelInterface $kernel,EntityManagerInterface $entityManager)
    {
        $this->main = $main;
        $this->kernel = $kernel;
        $this->em = $entityManager;
    }

    /**
     * En-tête du document (Informations de l'association et titre - NOUVELLE IMPLÉMENTATION)
     */
    public function Header()
    {
        // --- 1. Définition des constantes de position ---
        $yPos = 10;
        $xPos = 10;
        $logoWidth = 20;
        $logoHeight = 10;

        // --- 2. Logo (Haut Gauche) ---
        $logoPath = $this->kernel->getProjectDir() . '/public/assets/images/logo.jpg';
        if (file_exists($logoPath)) {
            $this->Image($logoPath, $xPos, $yPos, $logoWidth, $logoHeight);
        }

        // --- 3. Titre de l'Association (Haut Centré) ---
        $this->SetY($yPos);
        $this->SetFont('Arial', 'B', 14);
        $this->SetTextColor(0, 0, 0);
        $this->Cell(0, 7, utf8_decode('E-Cosplay Association'), 0, 1, 'C');

        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, utf8_decode('Siège social : 42 rue de saint-quentin 02800 Beautor'), 0, 1, 'C');

        // Ligne de séparation
        $this->Ln(3);
        $this->Cell(0, 1, '', 'B', 1, 'L', false);
        $this->Ln(10);
    }

    /**
     * Pied de page du document
     */
    public function Footer()
    {
        // Positionnement à 15 mm du bas
        $this->SetY(-15);
        // Police Arial italique 8
        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(120, 120, 120);
        // Numéro de page
        $this->Cell(0, 10, utf8_decode('Page ' . $this->PageNo() . '/{nb}'), 0, 0, 'C');
    }

    /**
     * Bloc d'information contextuelle pour l'Assemblée Générale.
     */
    public function writeAgContextBlock()
    {
        // Récupération des données nécessaires
        $agDate = $this->main->getAgDateAt() ? $this->main->getAgDateAt()->format('d/m/Y') : 'Date non spécifiée';
        $agTime = $this->main->getAgDateAt() ? $this->main->getAgDateAt()->format('H\hi') : 'Heure non spécifiée';

        $this->SetFont('Arial', '', 10);
        $this->SetTextColor(0, 0, 0);

        // Largeur de la cellule de données (pour aligner les données)
        $dataCellWidth = 100;
        $labelCellWidth = 60;

        // Message introductif pour la convocation
        $text = utf8_decode("Cher(e) membre de l'Association E-Cosplay,");
        $this->MultiCell(0, 6, $text);
        $this->Ln(3);
        $text = utf8_decode("Vous êtes cordialement convoqué(e) à l'Assemblée Générale de notre association dont les détails sont les suivants :");
        $this->MultiCell(0, 6, $text);
        $this->Ln(5);

        // Ajout du cadre
        $this->Cell(0, 1, '', 'T', 1, 'L', false); // Ligne supérieure légère
        $this->Ln(2); // Petite marge après la ligne

        $this->SetFont('Arial', 'B', 10);
        $this->Cell(0, 5, utf8_decode('DÉTAILS DE L\'ASSEMBLÉE GÉNÉRALE'), 0, 1, 'C');
        $this->Ln(1);

        $this->SetFont('Arial', '', 10);

        // Ligne 1: Association / RNA
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode('Association :'), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        $this->Cell($dataCellWidth, 5, utf8_decode('E-Cosplay Association loi 1901 – RNA N°W022006988'), 0, 1, 'L');

        // Ligne 2: Siège social
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode('Siège social :'), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        $this->Cell($dataCellWidth, 5, utf8_decode('42 rue de saint-quentin 02800 Beautor'), 0, 1, 'L');

        // Ligne 3: Date de l'AG
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode("Date de l'Assemblée Générale :"), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        $this->Cell($dataCellWidth, 5, utf8_decode($agDate), 0, 1, 'L');

        // Ligne 4: Heure de début
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode('Heure de début de la séance :'), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        $this->Cell($dataCellWidth, 5, utf8_decode($agTime), 0, 1, 'L');

        // Ligne 5: Lieu (Dynamique)
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode('Lieu :'), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        // Utiliser l'opérateur de coalescence null si les getters peuvent retourner null
        $location = $this->main->getLocate() . " " . $this->main->getLocateZipcode() . " " . $this->main->getLocateCity();
        $this->Cell($dataCellWidth, 5, utf8_decode($location), 0, 1, 'L');

        // Ligne 6: Nature de l'AG (Dynamique)
        $this->SetFont('Arial', 'B', 10);
        $this->Cell($labelCellWidth, 5, utf8_decode("Nature de l'AG :"), 0, 0, 'L');
        $this->SetFont('Arial', '', 10);
        $this->Cell($dataCellWidth, 5, utf8_decode($this->main->getType()), 0, 1, 'L');

        // Fin de la mise en forme du bloc
        $this->Ln(2); // Petite marge avant la ligne
        $this->Cell(0, 1, '', 'T', 1, 'L', false); // Ligne inférieure légère
        $this->Ln(5); // Espacement final avant le corps du texte
    }

    /**
     * Méthode principale pour générer le PDF
     */
    public function GeneratePdf()
    {
        $this->AliasNbPages(); // Active le comptage total des pages
        $this->AddPage();

        // ----------------------------------------------------
        // 1. Informations Générales de l'AG (Utilisation du nouveau bloc)
        // ----------------------------------------------------
        $this->writeAgContextBlock();

        // ----------------------------------------------------
        // 2. Listing des Membres de l'AG
        // ----------------------------------------------------
        $membersCount = $this->em->getRepository(Members::class)->count([]);

        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(230, 230, 230);
        $this->Cell(0, 7, utf8_decode('Liste de tous les Membres de l\'association (' . $membersCount . ' membres)'), 0, 1, 'L', true);

        // En-têtes du tableau (Hauteur 7)
        $idCellWidth = 5;
        $signatureCellWidth = 105;

        // Nouvelle répartition des largeurs pour utiliser 190mm: 5 (id) + 60 (name) + 75 (email) + 50 (signature) = 190
        $nameCellWidth = 40;
        $emailCellWidth = 40;

        $this->SetFont('Arial', 'B', 9);
        $this->SetFillColor(200, 220, 255);
        $this->Cell($idCellWidth, 7, utf8_decode('#'), 1, 0, 'C', true);
        $this->Cell($nameCellWidth, 7, utf8_decode('Nom Prénom / Pseudo'), 1, 0, 'L', true);
        $this->Cell($emailCellWidth, 7, utf8_decode('E-mail.'), 1, 0, 'L', true);
        $this->Cell($signatureCellWidth, 7, utf8_decode('Signature de Présence'), 1, 1, 'C', true);

        // Lignes du tableau
        $this->SetFont('Arial', '', 9);
        $i = 1;
        $fill = false;
        $cellHeight = 15; // Hauteur de cellule définie à 15

        // Récupérer tous les membres
        $members = $this->em->getRepository(Members::class)->findAll();

        foreach ($members as $member) {
            // Alternance des couleurs de fond
            $this->SetFillColor($fill ? 240 : 255, 240, 240);
            $fill = !$fill;

            // Affichage des informations
            $this->Cell($idCellWidth, $cellHeight, $i++, 1, 0, 'C', true);
            $this->Cell($nameCellWidth, $cellHeight,
                utf8_decode($member->getName() . ' ' . $member->getSurname() . ' (' . $member->getPseudo() . ')'),
                1, 0, 'C', true
            );
            $this->Cell($emailCellWidth, $cellHeight,
                utf8_decode($member->getEmail()),
                1, 0, 'C'   , true
            );


            // Espace pour la signature (avec le placeholder de signature) - Largeur de la cellule et du placeholder = 50. Alignement 'C'
            $this->Cell($signatureCellWidth, $cellHeight, '{{Signature;width=250;height=25;type=signature;role=member_'.$member->getId().'}}', 1, 1, 'C', true);

            // Gérer les sauts de page automatiques
            if ($this->GetY() + $cellHeight > 280) { // Si la prochaine ligne dépasse la limite
                $this->AddPage();
                // Ré-afficher les en-têtes du tableau sur la nouvelle page (Hauteur 7)
                $this->SetFont('Arial', 'B', 9);
                $this->SetFillColor(200, 220, 255);
                $this->Cell($idCellWidth, 7, utf8_decode('#'), 1, 0, 'C', true);
                $this->Cell($nameCellWidth, 7, utf8_decode('Nom Prénom / Pseudo'), 1, 0, 'L', true);
                $this->Cell($emailCellWidth, 7, utf8_decode('E-mail.'), 1, 0, 'L', true);
                $this->Cell($signatureCellWidth, 7, utf8_decode('Signature de Présence'), 1, 1, 'C', true);
                $this->SetFont('Arial', '', 9);
                $this->SetFillColor(240, 240, 240);
            }
        }

    }
}
