<?php
/**
 * Export Liste des Factures avec Détails de Paiement en PDF
 * Génère un PDF contenant la liste des factures d'une période avec leurs paiements
 */

require_once('config/connexion.php');

// Vérifier que TCPDF est installé
if (!file_exists(__DIR__ . '/vendor/tcpdf/tcpdf.php')) {
    die('TCPDF n\'est pas installé. Veuillez d\'abord installer TCPDF via install_tcpdf.php');
}

require_once(__DIR__ . '/vendor/tcpdf/tcpdf.php');

// Récupérer les paramètres
$date_debut = $_GET['date_debut'] ?? '';
$date_fin = $_GET['date_fin'] ?? '';

// Valider les dates
if (empty($date_debut) || empty($date_fin)) {
    die('Dates de début et de fin requises');
}

if (!DateTime::createFromFormat('Y-m-d', $date_debut) || !DateTime::createFromFormat('Y-m-d', $date_fin)) {
    die('Format de date invalide');
}

// Récupération du nom de la compagnie et du footer
$sql_company = "SELECT compagnie_name, footer FROM compagnie_table LIMIT 1";
$result_company = $conn->query($sql_company);
$company_name = '';
$company_footer = '';
if ($result_company && $row_company = $result_company->fetch_assoc()) {
    $company_name = $row_company['compagnie_name'] ?? '';
    $company_footer = $row_company['footer'] ?? '';
}

// Requête pour récupérer les factures et leurs paiements
$sql = "
    SELECT 
        f.facture_num,
        f.facture_date,
        f.total as montant_total,
        r.montant_paye,
        r.paiement_mode,
        r.echeance_date,
        r.paiement_statut,
        r.paiement_ref
    FROM facture_table f
    LEFT JOIN receipts_table r ON f.facture_num = r.policy_number OR f.libelle = r.policy_number
    WHERE DATE(f.facture_date) BETWEEN ? AND ?
    ORDER BY f.facture_num, r.echeance_date
";

$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $date_debut, $date_fin);
$stmt->execute();
$stmt->bind_result($facture_num_r, $facture_date_r, $montant_total_r, $montant_paye_r, $paiement_mode_r, $echeance_date_r, $paiement_statut_r, $paiement_ref_r);

// Organiser les données par facture
$factures_data = [];
$total_general = 0;

while ($stmt->fetch()) {
    $facture_num = $facture_num_r;
    
    if (!isset($factures_data[$facture_num])) {
        $factures_data[$facture_num] = [
            'facture_num' => $facture_num,
            'facture_date' => $facture_date_r,
            'montant_total' => floatval($montant_total_r),
            'paiements' => []
        ];
        $total_general += floatval($montant_total_r);
    }
      // Ajouter le paiement s'il existe
    if (!empty($montant_paye_r)) {
        $factures_data[$facture_num]['paiements'][] = [
            'montant' => floatval($montant_paye_r),
            'mode_paiement' => $paiement_mode_r ?? 'Non spécifié',
            'date_echeance' => $echeance_date_r,
            'paiement_ref' => $paiement_ref_r,
            'status' => $paiement_statut_r ?? 'En attente'
        ];
    }
}

$stmt->close();


// Mode minimal ?
$minimal = isset($_GET['minimal']) && $_GET['minimal'] == '1';

// PDF avec footer compagnie
class FactureListPDFWithFooter extends TCPDF {
    private $company_name;
    private $company_footer;
    public function __construct($company_name, $company_footer) {
        parent::__construct();
        $this->company_name = $company_name;
        $this->company_footer = $company_footer;
    }
    public function Header() {}
    public function Footer() {
        $this->SetY(-20);
        $this->SetFont('helvetica', 'I', 8);
        $this->SetTextColor(128, 128, 128);
        if (!empty($this->company_name)) {
            $this->Cell(0, 5, $this->company_name, 0, 1, 'C');
        }
        if (!empty($this->company_footer)) {
            $this->Cell(0, 5, $this->company_footer, 0, 1, 'C');
        }
        $this->Cell(0, 5, 'Page ' . $this->getAliasNumPage() . ' / ' . $this->getAliasNbPages(), 0, 0, 'C');
    }
}
$pdf = new FactureListPDFWithFooter($company_name, $company_footer);
$pdf->SetTitle('Liste des Factures');
$pdf->AddPage('L', 'A4');
$pdf->SetY(15);
$pdf->SetFont('helvetica', 'B', 14);
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(0, 10, 'LISTE DES FACTURES AVEC DÉTAILS DE PAIEMENT', 0, 1, 'C');
$pdf->SetFont('helvetica', '', 12);
$pdf->SetTextColor(100, 100, 100);
$pdf->Cell(0, 8, 'Période du ' . date('d/m/Y', strtotime($date_debut)) . ' au ' . date('d/m/Y', strtotime($date_fin)), 0, 1, 'C');
$pdf->Ln(5);

// En-têtes du tableau
$pdf->SetFont('helvetica', 'B', 9);
$pdf->SetFillColor(240, 240, 240);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetDrawColor(180, 180, 180);

// Largeurs des colonnes (ajustées pour format paysage A4)
$col_widths = [32, 25, 30, 35, 25, 30, 35, 25];

$pdf->Cell($col_widths[0], 8, 'N° Facture', 1, 0, 'C', 1);
$pdf->Cell($col_widths[1], 8, 'Date Facture', 1, 0, 'C', 1);
$pdf->Cell($col_widths[2], 8, 'Montant Total', 1, 0, 'C', 1);
$pdf->Cell($col_widths[3], 8, 'Mode Paiement', 1, 0, 'C', 1);
$pdf->Cell($col_widths[4], 8, 'Montant Payé', 1, 0, 'C', 1);
$pdf->Cell($col_widths[5], 8, 'Date Échéance', 1, 0, 'C', 1);
$pdf->Cell($col_widths[6], 8, 'Réf Chèque/Effet', 1, 0, 'C', 1);
$pdf->Cell($col_widths[7], 8, 'Statut', 1, 1, 'C', 1);

// Données du tableau
$pdf->SetFont('helvetica', '', 8);
$pdf->SetFillColor(255, 255, 255);

$compteur_factures = 0;
$total_factures = 0;
$total_paiements = 0;
$total_paiements_valides = 0;
$total_paiements_refuses = 0;
$total_paiements_encours = 0;

foreach ($factures_data as $facture) {
    $compteur_factures++;
    $total_factures += $facture['montant_total'];
    if (empty($facture['paiements'])) {
        // Facture sans paiement
        $pdf->Cell($col_widths[0], 6, $facture['facture_num'], 1, 0, 'C');
        $pdf->Cell($col_widths[1], 6, date('d/m/Y', strtotime($facture['facture_date'])), 1, 0, 'C');
        $pdf->Cell($col_widths[2], 6, number_format($facture['montant_total'], 2) . ' DH', 1, 0, 'R');
        $pdf->Cell($col_widths[3], 6, 'Aucun paiement', 1, 0, 'C');
        $pdf->Cell($col_widths[4], 6, '0,00 DH', 1, 0, 'R');
        $pdf->Cell($col_widths[5], 6, '-', 1, 0, 'C');
        $pdf->Cell($col_widths[6], 6, '-', 1, 0, 'C');
        
        // Afficher "Impayé" en rouge
        $pdf->SetTextColor(255, 0, 0);
        $pdf->Cell($col_widths[7], 6, 'Impayé', 1, 1, 'C');
        $pdf->SetTextColor(0, 0, 0);
    } else {
        // Première ligne avec le montant total de la facture
        $premier_paiement = $facture['paiements'][0];
        
        $pdf->Cell($col_widths[0], 6, $facture['facture_num'], 1, 0, 'C');
        $pdf->Cell($col_widths[1], 6, date('d/m/Y', strtotime($facture['facture_date'])), 1, 0, 'C');
        $pdf->Cell($col_widths[2], 6, number_format($facture['montant_total'], 2) . ' DH', 1, 0, 'R');
        $pdf->Cell($col_widths[3], 6, $premier_paiement['mode_paiement'], 1, 0, 'C');
        $pdf->Cell($col_widths[4], 6, number_format($premier_paiement['montant'], 2) . ' DH', 1, 0, 'R');
        $pdf->Cell($col_widths[5], 6, $premier_paiement['date_echeance'] ? date('d/m/Y', strtotime($premier_paiement['date_echeance'])) : '-', 1, 0, 'C');
        
        // Afficher référence de chèque/effet
        $ref_paiement = !empty($premier_paiement['paiement_ref']) ? substr($premier_paiement['paiement_ref'], 0, 15) : '-';
        $pdf->Cell($col_widths[6], 6, $ref_paiement, 1, 0, 'C');
        
        // Afficher statut avec couleur
        $statut_text = '';
        $couleur_statut = [0, 0, 0]; // Noir par défaut
        
        switch ($premier_paiement['status']) {
            case '0':
                $statut_text = 'En cours';
                $couleur_statut = [255, 140, 0]; // Orange
                break;
            case '1':
                $statut_text = 'Validé';
                $couleur_statut = [0, 128, 0]; // Vert
                break;
            case '3':
                $statut_text = 'Refusé';
                $couleur_statut = [255, 0, 0]; // Rouge
                break;
            default:
                $statut_text = 'En cours';
                $couleur_statut = [255, 140, 0]; // Orange
        }
        
        // Appliquer la couleur et afficher le statut
        $pdf->SetTextColor($couleur_statut[0], $couleur_statut[1], $couleur_statut[2]);
        $pdf->Cell($col_widths[7], 6, $statut_text, 1, 1, 'C');
        $pdf->SetTextColor(0, 0, 0); // Remettre en noir
        
        $total_paiements += $premier_paiement['montant'];
        
        // Compter seulement les paiements validés (statut = 1) dans le total encaissé
        if ($premier_paiement['status'] == '1') {
            $total_paiements_valides += $premier_paiement['montant'];
        }
        if ($premier_paiement['status'] == '3') {
            $total_paiements_refuses += $premier_paiement['montant'];
        }
        if ($premier_paiement['status'] == '0') {
            $total_paiements_encours += $premier_paiement['montant'];
        }
        // Lignes suivantes pour les autres paiements (dupliquer la facture)
        for ($i = 1; $i < count($facture['paiements']); $i++) {
            $paiement = $facture['paiements'][$i];
            
            $pdf->SetFont('helvetica', '', 8);
            $pdf->SetTextColor(100, 100, 100);
            
            $pdf->Cell($col_widths[0], 6, $facture['facture_num'], 1, 0, 'C');
            $pdf->Cell($col_widths[1], 6, '', 1, 0, 'C');
            $pdf->Cell($col_widths[2], 6, '', 1, 0, 'R');
            
            $pdf->SetTextColor(0, 0, 0);
            $pdf->Cell($col_widths[3], 6, $paiement['mode_paiement'], 1, 0, 'C');
            $pdf->Cell($col_widths[4], 6, number_format($paiement['montant'], 2) . ' DH', 1, 0, 'R');
            $pdf->Cell($col_widths[5], 6, $paiement['date_echeance'] ? date('d/m/Y', strtotime($paiement['date_echeance'])) : '-', 1, 0, 'C');
            
            // Afficher référence de chèque/effet
            $ref_paiement = !empty($paiement['paiement_ref']) ? substr($paiement['paiement_ref'], 0, 15) : '-';
            $pdf->Cell($col_widths[6], 6, $ref_paiement, 1, 0, 'C');
            
            // Afficher statut avec couleur
            $statut_text = '';
            $couleur_statut = [0, 0, 0]; // Noir par défaut
            
            switch ($paiement['status']) {
                case '0':
                    $statut_text = 'En cours';
                    $couleur_statut = [255, 140, 0]; // Orange
                    break;
                case '1':
                    $statut_text = 'Validé';
                    $couleur_statut = [0, 128, 0]; // Vert
                    break;
                case '3':
                    $statut_text = 'Refusé';
                    $couleur_statut = [255, 0, 0]; // Rouge
                    break;
                default:
                    $statut_text = 'En cours';
                    $couleur_statut = [255, 140, 0]; // Orange
            }
            
            // Appliquer la couleur et afficher le statut
            $pdf->SetTextColor($couleur_statut[0], $couleur_statut[1], $couleur_statut[2]);
            $pdf->Cell($col_widths[7], 6, $statut_text, 1, 1, 'C');
            $pdf->SetTextColor(0, 0, 0); // Remettre en noir
            
            $total_paiements += $paiement['montant'];
            
            // Compter seulement les paiements validés (statut = 1) dans le total encaissé
            if ($paiement['status'] == '1') {
                $total_paiements_valides += $paiement['montant'];
            }
            if ($paiement['status'] == '3') {
                $total_paiements_refuses += $paiement['montant'];
            }
            if ($paiement['status'] == '0') {
                $total_paiements_encours += $paiement['montant'];
            }
        }
    }
      // Vérifier si on a besoin d'une nouvelle page (ajusté pour format paysage)
    if ($pdf->GetY() > 180) {
        $pdf->AddPage('L', 'A4');
    }
}

// Ligne de total
$pdf->Ln(3);
$pdf->SetFont('helvetica', 'B', 9);
$pdf->SetFillColor(220, 220, 220);

$pdf->Cell($col_widths[0] + $col_widths[1], 8, 'TOTAUX:', 1, 0, 'C', 1);
$pdf->Cell($col_widths[2], 8, number_format($total_factures, 2) . ' DH', 1, 0, 'R', 1);
$pdf->Cell($col_widths[3], 8, '', 1, 0, 'C', 1);
$pdf->Cell($col_widths[4], 8, number_format($total_paiements_valides, 2) . ' DH', 1, 0, 'R', 1);
$pdf->Cell($col_widths[5], 8, '', 1, 0, 'C', 1);
$pdf->Cell($col_widths[6], 8, '', 1, 0, 'C', 1);
$pdf->Cell($col_widths[7], 8, '', 1, 1, 'C', 1);

// Statistiques
$pdf->Ln(5);
$pdf->SetFont('helvetica', 'B', 10);
$pdf->Cell(0, 6, 'RÉSUMÉ DE LA PÉRIODE', 0, 1, 'L');

$pdf->SetFont('helvetica', '', 9);
$pdf->Cell(80, 5, '• Nombre de factures: ' . $compteur_factures, 0, 0, 'L');
$pdf->Cell(0, 5, '• Total facturé: ' . number_format($total_factures, 2) . ' DH', 0, 1, 'L');
$pdf->Cell(80, 5, '• Total encaissé (validé): ' . number_format($total_paiements_valides, 2) . ' DH', 0, 0, 'L');
$pdf->Cell(0, 5, '• Reste à encaisser: ' . number_format($total_factures - $total_paiements_valides, 2) . ' DH', 0, 1, 'L');
$pdf->Cell(80, 5, '• Total Refusé: ' . number_format($total_paiements_refuses, 2) . ' DH', 0, 0, 'L');
$pdf->Cell(0, 5, '• Total En cours: ' . number_format($total_paiements_encours, 2) . ' DH', 0, 1, 'L');

// Pourcentage d'encaissement
$pourcentage_encaissement = $total_factures > 0 ? ($total_paiements_valides / $total_factures) * 100 : 0;
$pdf->Cell(0, 5, '• Taux d\'encaissement: ' . number_format($pourcentage_encaissement, 1) . '%', 0, 1, 'L');

// Légende des statuts
$pdf->Ln(3);
$pdf->SetFont('helvetica', 'B', 9);
$pdf->Cell(0, 5, 'LÉGENDE DES STATUTS:', 0, 1, 'L');

$pdf->SetFont('helvetica', '', 8);
$pdf->Cell(5, 4, '• ', 0, 0, 'L');
$pdf->SetTextColor(255, 140, 0);
$pdf->Cell(20, 4, 'En cours', 0, 0, 'L');
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(30, 4, ': Paiement en attente', 0, 0, 'L');

$pdf->Cell(5, 4, '• ', 0, 0, 'L');
$pdf->SetTextColor(0, 128, 0);
$pdf->Cell(15, 4, 'Validé', 0, 0, 'L');
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(30, 4, ': Paiement confirmé', 0, 0, 'L');

$pdf->Cell(5, 4, '• ', 0, 0, 'L');
$pdf->SetTextColor(255, 0, 0);
$pdf->Cell(15, 4, 'Refusé', 0, 0, 'L');
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(0, 4, ': Paiement rejeté', 0, 1, 'L');

$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(0, 4, '• Les numéros de chèque/effet sont affichés dans la colonne "Réf Chèque/Effet"', 0, 1, 'L');
$pdf->Cell(0, 4, '• Le "Total encaissé" ne comptabilise que les paiements avec statut "Validé"', 0, 1, 'L');

// Générer le nom du fichier
$filename = 'Liste_Factures_' . date('d-m-Y', strtotime($date_debut)) . '_au_' . date('d-m-Y', strtotime($date_fin)) . '.pdf';

// Envoyer le PDF
$pdf->Output($filename, 'D');

// Connection is managed globally; do not close it here.
?>
