<?php

declare(strict_types=1);

namespace App\Services;

require_once __DIR__ . '/../../vendor/autoload.php';

use setasign\Fpdi\Fpdi;

/**
 * Générateur de reçus PDF avec FPDI (utilise un template PDF)
 * Génère des PDF légers et valides en format paysage (A4 Landscape)
 */
class ReceiptPDFGenerator extends Fpdi {

    private const TEMPLATE_PATH = __DIR__ . '/../../docs/_recu_template.pdf';
    private const DEFAULT_LOGO_PATH = __DIR__ . '/../../docs/_logo_recu.png';
    private const LOGO_WIDTH = 45;  // Largeur du logo en mm

    /**
     * Génère un reçu fiscal PDF et l'enregistre directement dans un fichier
     *
     * @param array $data Données du reçu
     * @param string $outputPath Chemin complet du fichier PDF à créer
     * @param string|null $logoPath Chemin vers le logo (optionnel)
     * @return bool True si la génération a réussi
     */
    public function generateReceipt(array $data, string $outputPath, ?string $logoPath = null): bool {
        try {
            // Créer la page en orientation paysage (Landscape)
            $this->AddPage('L');

            // Importer le template PDF
            if (file_exists(self::TEMPLATE_PATH)) {
                $this->setSourceFile(self::TEMPLATE_PATH);
                $tplIdx = $this->importPage(1);
                $this->useTemplate($tplIdx);
            }

            // Configuration de base
            $this->SetFont('Arial');
            $this->SetFontSize(16);
            $this->SetTextColor(50, 50, 50);

            // Nom de l'amicale (en haut à droite du template)
            $this->SetXY(116, 26);
            $this->Write(0, $this->cleanText($data['entite_city'] ?? ''));

            // Nom du donateur
            $this->SetXY(35, 41);
            $this->Write(0, $this->cleanText($data['donor_name'] ?? ''));

            // Adresse du donateur
            $this->SetXY(35, 55);
            $this->Write(0, $this->cleanText($data['donor_address'] ?? ''));

            // Montant et mode de règlement
            $this->SetXY(48, 68);
            $amount = $data['amount'] ?? '0';
            $paymentMethod = !empty($data['payment_method'])
                ? ' en ' . mb_strtolower($data['payment_method'], 'UTF-8')
                : '';
            $this->Write(0, $this->cleanText($amount . ' euros' . $paymentMethod));

            // Date du don
            $this->SetXY(20, 82);
            $this->Write(0, $this->cleanText($data['donation_date'] ?? date('d/m/Y')));

            // Logo de l'entité (en haut à droite)
            $logoToUse = null;
            if ($logoPath && file_exists($logoPath)) {
                $logoToUse = $logoPath;
            } elseif (file_exists(self::DEFAULT_LOGO_PATH)) {
                $logoToUse = self::DEFAULT_LOGO_PATH;
            }

            if ($logoToUse) {
                try {
                    $this->Image($logoToUse, 245, 8, self::LOGO_WIDTH);
                } catch (\Exception $e) {
                    // Si erreur avec le logo custom, utiliser le logo par défaut
                    if ($logoToUse !== self::DEFAULT_LOGO_PATH && file_exists(self::DEFAULT_LOGO_PATH)) {
                        try {
                            $this->Image(self::DEFAULT_LOGO_PATH, 245, 8, self::LOGO_WIDTH);
                        } catch (\Exception $e2) {
                            // Continuer sans logo
                        }
                    }
                }
            }

            // Écrire directement dans le fichier (mode 'F')
            $this->Output($outputPath, 'F');

            return true;

        } catch (\Exception $e) {
            error_log('Erreur génération PDF: ' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * Nettoie le texte pour le PDF (supprime ou remplace les caractères problématiques)
     */
    private function cleanText(string $text): string {
        // Vérifier que le texte n'est pas vide
        if (empty($text)) {
            return '';
        }
        
        // Remplacer d'abord les caractères problématiques avant la conversion
        $replacements = [
            '€' => 'EUR',
            '—' => '-',
            '–' => '-',
            '"' => '"',
            '"' => '"',
            "'" => "'",
            "'" => "'",
            '…' => '...'
        ];
        
        $text = str_replace(array_keys($replacements), array_values($replacements), $text);
        
        // Tentative de conversion UTF-8 vers ISO-8859-1 pour FPDF
        $converted = @iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $text);
        
        // Si la conversion échoue, utiliser utf8_decode en fallback
        if ($converted === false) {
            $converted = @utf8_decode($text);
            
            // Si utf8_decode échoue aussi, supprimer les caractères non-ASCII
            if ($converted === false) {
                $converted = preg_replace('/[^\x20-\x7E]/', '?', $text);
            }
        }
        
        return $converted;
    }
}