<?php

namespace App\Service\Pdf;

use Fpdf\Fpdf;

/**
 * Générateur de reçu de cotisation FPDF.
 */
class CotaReceiptGenerator extends Fpdf
{
    private array $contributionData;

    /**
     * Initialise le générateur de reçu avec les données de la cotisation.
     * @param array $data Les données de la cotisation (amount, name, date, email, etc.).
     */
    public function setContributionData(array $data): void
    {
        // Renommage de $donationData en $contributionData
        $this->contributionData = $data;
    }

    // --- Méthodes FPDF obligatoires ou recommandées ---

    /**
     * Entête du document (Logo, Nom de l'association).
     */
    public function Header(): void
    {
        // Logo de l'association E-Cosplay
        $logoPath = $_SERVER['DOCUMENT_ROOT'] . '/assets/images/logo.jpg';

        if (file_exists($logoPath)) {
            $this->Image($logoPath, 10, 8, 30); // Position X=10, Y=8, Largeur=30mm (Hauteur auto)
        } else {
            $this->SetFont('Arial', 'B', 10);
            $this->Cell(0, 10, utf8_decode('E-Cosplay Logo'), 0, 0, 'L');
            $this->Ln(5);
        }

        // Police de caractères (ex: Arial gras 15)
        $this->SetFont('Arial', 'B', 15);
        $this->Cell(80); // Ajuster le décalage après le logo

        // --- MISE À JOUR : 'Reçu de Cotisation' ---
        $this->Cell(30, 10, utf8_decode('Reçu de Cotisation'), 0, 1, 'C');

        // Informations de l'association
        $this->SetFont('Arial', '', 10);
        $this->Cell(0, 5, utf8_decode('E-Cosplay'), 0, 1, 'C');
        $this->Cell(0, 5, utf8_decode('42 RUE DE SAINT-QUENTIN 02800 BEAUTOR'), 0, 1, 'C');
        $this->Cell(0, 5, utf8_decode('SIREN: 943121517 | Code NAF: 93.29Z'), 0, 1, 'C');

        // Saut de ligne
        $this->Ln(15);
    }

    /**
     * Pied de page du document.
     */
    public function Footer(): void
    {
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        $this->Cell(0, 10, utf8_decode('Page ') . $this->PageNo() . '/{nb}', 0, 0, 'C');
    }

    // --- Méthode de génération spécifique au reçu ---

    /**
     * Génère le corps principal du reçu de cotisation.
     */
    public function generateReceiptBody(): void
    {
        // Utilisation de $this->contributionData
        if (empty($this->contributionData)) {
            $this->Cell(0, 10, utf8_decode('Erreur: Aucune donnée de cotisation n\'est définie.'), 0, 1);
            return;
        }

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

        // Affichage des informations du Membre
        $this->SetTextColor(0, 0, 0); // Noir
        $this->Cell(0, 10, utf8_decode('Membre:'), 0, 1); // --- MISE À JOUR : 'Membre' ---

        // Récupération et décodage des données du membre
        $name = utf8_decode($this->contributionData['name'] ?? 'Non spécifié');
        $email = utf8_decode($this->contributionData['email'] ?? 'Non spécifié');
        $period = utf8_decode($this->contributionData['period'] ?? 'Non spécifiée'); // Ajout potentiel

        $this->SetX(20);
        $this->Cell(0, 7, utf8_decode('Nom/Pseudo: ') . $name, 0, 1);
        $this->SetX(20);
        $this->Cell(0, 7, utf8_decode('E-mail: ') . $email, 0, 1);

        // Affichage de la période d'adhésion si disponible
        $this->SetX(20);
        $this->Cell(0, 7, utf8_decode('Période d\'adhésion: ') . $period, 0, 1);

        $this->Ln(10);

        // Affichage des détails de la Cotisation
        $this->SetFont('Arial', 'B', 14);
        $this->SetFillColor(200, 220, 255);
        // --- MISE À JOUR : 'Détails de la Cotisation' ---
        $this->Cell(0, 10, utf8_decode('Détails de la Cotisation'), 0, 1, 'L', true);

        $this->SetFont('Arial', '', 12);
        $this->Ln(3);

        // Montant
        $amount = $this->contributionData['amount'] ?? 0;
        $formattedAmount = number_format($amount, 2, ',', '.') . ' EUR';

        $this->SetX(20);
        $this->Cell(50, 8, utf8_decode('Montant de la Cotisation:'), 0, 0); // --- MISE À JOUR : 'Cotisation' ---
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 8, $formattedAmount, 0, 1);
        $this->SetFont('Arial', '', 12);

        // Date
        $date = $this->contributionData['date'] ?? date('Y-m-d');
        $this->SetX(20);
        $this->Cell(50, 8, utf8_decode('Date de la Transaction:'), 0, 0);
        $this->Cell(0, 8, $date, 0, 1);

        // Message (si présent)
        if (!empty($this->contributionData['message'])) {
            $message = utf8_decode($this->contributionData['message']);
            $this->Ln(5);
            $this->Cell(0, 8, utf8_decode('Note du Membre:'), 0, 1); // --- MISE À JOUR : 'Note du Membre' ---
            $this->SetX(20);
            $this->MultiCell(0, 6, $message);
        }

        $this->Ln(15);

        // --- MISE À JOUR : Mention spécifique pour la Cotisation ---
        $infoText = 'Ce document est un reçu attestant du paiement de votre cotisation d\'adhésion à l\'association E-Cosplay pour la période spécifiée. Il valide vos droits de membre.';

        $this->SetFont('Arial', '', 10);
        $this->MultiCell(0, 5, utf8_decode($infoText), 0, 'C');

        $this->Ln(10);

        // Signature
        $this->SetFont('Arial', 'I', 10);
        $this->Cell(0, 5, utf8_decode('Fait à BEAUTOR, le ') . date('d/m/Y'), 0, 1, 'R');
    }

    /**
     * Méthode publique pour générer et obtenir le PDF.
     * @param array $data Les données de la cotisation.
     * @param string $filename Le nom du fichier de sortie.
     * @param string $dest La destination (I: navigateur, D: téléchargement, F: fichier, S: string).
     */
    public function generate(array $data, string $filename = 'Reçu_Cotisation.pdf', string $dest = 'I')
    {
        // Utilisation de setContributionData
        $this->setContributionData($data);

        // Initialisation du PDF
        $this->AliasNbPages();
        $this->AddPage();

        // Génération du contenu
        $this->generateReceiptBody();

        // Sortie du document
        // Le nom de fichier est mis à jour
        return $this->Output($dest, utf8_decode($filename));
    }
}
