<?php

namespace App\Service\Pdf;

use Fpdf\Fpdf;

class DonReceiptGenerator extends Fpdf
{
    private array $donationData;

    /**
     * Initialise le générateur de reçu avec les données du don.
     * @param array $data Les données du don (amount, name, date, email, message, etc.).
     */
    public function setDonationData(array $data): void
    {
        $this->donationData = $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
        // IMPORTANT : Ajustez le chemin de l'image pour qu'il soit absolu ou relatif à l'exécution du script
        // Exemple pour Symfony : $_SERVER['DOCUMENT_ROOT'] . '/assets/images/logo.jpg'
        $logoPath = $_SERVER['DOCUMENT_ROOT'] . '/assets/images/logo.jpg';

        // Vérifie si le fichier existe avant de tenter de l'insérer
        if (file_exists($logoPath)) {
            $this->Image($logoPath, 10, 8, 30); // Position X=10, Y=8, Largeur=30mm (Hauteur auto)
        } else {
            // Optionnel : Afficher un texte si le logo n'est pas trouvé
            $this->SetFont('Arial', 'B', 10);
            $this->Cell(0, 10, utf8_decode('E-Cosplay Logo'), 0, 0, 'L');
            $this->Ln(5); // Saut de ligne après le texte du logo
        }

        // Police de caractères (ex: Arial gras 15)
        $this->SetFont('Arial', 'B', 15);
        // Décalage à droite (après le logo si utilisé, ou ajuster)
        // Si logo utilisé, le décalage doit être plus grand
        $this->Cell(80); // Ajustez cette valeur si le logo est présent et plus grand/petit
        // Titre - Utilisation de utf8_decode()
        $this->Cell(30, 10, utf8_decode('Reçu de Don'), 0, 1, 'C');

        // Informations de l'association
        $this->SetFont('Arial', '', 10);
        // Ligne 1: Nom de l'association
        $this->Cell(0, 5, utf8_decode('E-Cosplay'), 0, 1, 'C');
        // Ligne 2: Adresse
        $this->Cell(0, 5, utf8_decode('42 RUE DE SAINT-QUENTIN 02800 BEAUTOR'), 0, 1, 'C');
        // Ligne 3: SIREN et NAF
        $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
    {
        // Positionnement à 1.5 cm du bas
        $this->SetY(-15);
        // Police Arial italique 8
        $this->SetFont('Arial', 'I', 8);
        // Numéro de page
        $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 don.
     */
    public function generateReceiptBody(): void
    {
        if (empty($this->donationData)) {
            // Utilisation de utf8_decode()
            $this->Cell(0, 10, utf8_decode('Erreur: Aucune donnée de don n\'est définie.'), 0, 1);
            return;
        }

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

        // Affichage des informations du donateur
        $this->SetTextColor(0, 0, 0); // Noir
        $this->Cell(0, 10, utf8_decode('Donateur:'), 0, 1);

        // Récupération et décodage des données du donateur
        $name = utf8_decode($this->donationData['name'] ?? 'Non spécifié');
        $email = utf8_decode($this->donationData['email'] ?? 'Non spécifié');

        $this->SetX(20); // Décalage pour les détails
        $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);

        $this->Ln(10);

        // Affichage des détails du don
        $this->SetFont('Arial', 'B', 14);
        $this->SetFillColor(200, 220, 255); // Couleur de fond pour le titre
        // Utilisation de utf8_decode()
        $this->Cell(0, 10, utf8_decode('Détails de la Contribution'), 0, 1, 'L', true);

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

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

        $this->SetX(20);
        $this->Cell(50, 8, utf8_decode('Montant Reçu:'), 0, 0);
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 8, $formattedAmount, 0, 1);
        $this->SetFont('Arial', '', 12);

        // Date
        $date = $this->donationData['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->donationData['message'])) {
            $message = utf8_decode($this->donationData['message']);
            $this->Ln(5);
            $this->Cell(0, 8, utf8_decode('Message du Donateur:'), 0, 1);
            $this->SetX(20);
            $this->MultiCell(0, 6, $message);
        }

        $this->Ln(15);

        // Mention de non-déductibilité (Crucial) - Utilisation de utf8_decode()
        $nonDeductibilityText = 'NOTE IMPORTANTE : Votre don à notre association ne vous permet pas de bénéficier d\'une réduction d\'impôt en vertu des lois fiscales actuelles.';

        $this->SetFont('Arial', 'B', 10);
        $this->SetTextColor(150, 0, 0); // Rouge foncé
        $this->MultiCell(0, 5, utf8_decode($nonDeductibilityText), 0, 'C');
        $this->SetTextColor(0, 0, 0); // Revenir au noir

        $this->Ln(10);

        // Signature (Seule la ligne "Fait à [Ville], le [Date]" est conservée)
        $this->SetFont('Arial', 'I', 10);
        $this->Cell(0, 5, utf8_decode('Fait à BEAUTOR, le ') . date('d/m/Y'), 0, 1, 'R');
        // La ligne "Signature du Responsable" a été retirée.
    }

    /**
     * Méthode publique pour générer et obtenir le PDF.
     * @param array $data Les données du don.
     * @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_Don.pdf', string $dest = 'I')
    {
        $this->setDonationData($data);

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

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

        // Sortie du document
        // Le nom de fichier doit aussi être décodé pour l'en-tête HTTP si dest='D'
        return $this->Output($dest, utf8_decode($filename));
    }
}
