<?php
/**
 * Système de log global avec rotation automatique
 * Garde 356 jours d'historique des opérations
 */

/**
 * Effectue la rotation des logs pour garder seulement 356 jours d'historique
 * @param string $logFile Chemin vers le fichier de log
 */
function rotateLogFile($logFile) {
    if (!file_exists($logFile)) {
        return;
    }
    
    // Lire toutes les lignes du fichier
    $lines = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (empty($lines)) {
        return;
    }
    
    $cutoffDate = date('Y-m-d', strtotime('-356 days'));
    $filteredLines = [];
    $headerAdded = false;
    
    foreach ($lines as $line) {
        // Garder les lignes de commentaire (header)
        if (substr(trim($line), 0, 1) === '#') {
            if (!$headerAdded) {
                $filteredLines[] = $line;
            }
            continue;
        }
        
        // Vérifier la date de la ligne de log
        if (preg_match('/^(\d{4}-\d{2}-\d{2})/', $line, $matches)) {
            $lineDate = $matches[1];
            // Garder seulement les lignes des 356 derniers jours
            if ($lineDate >= $cutoffDate) {
                $filteredLines[] = $line;
                $headerAdded = true;
            }
        } else {
            // Garder les lignes qui ne correspondent pas au format (pour compatibilité)
            $filteredLines[] = $line;
        }
    }
    
    // Réécrire le fichier avec les lignes filtrées
    if (count($filteredLines) < count($lines)) {
        file_put_contents($logFile, implode(PHP_EOL, $filteredLines) . PHP_EOL, LOCK_EX);
    }
}

/**
 * Fonction utilitaire pour écrire dans le log avec rotation automatique
 * @param string $logEntry L'entrée de log à écrire
 * @return bool Succès de l'écriture
 */
function writeToLog($logEntry) {
    // Vérifier si l'utilisateur est connecté
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    // Récupérer la référence de compagnie depuis la session, ou utiliser une valeur par défaut
    $compagnieRef = isset($_SESSION['compagnie_ref']) ? $_SESSION['compagnie_ref'] : '123456';
    
    // Créer le dossier data/[compagnie_ref] s'il n'existe pas
    $logDir = __DIR__ . '/../data/' . $compagnieRef;
    if (!is_dir($logDir)) {
        @mkdir($logDir, 0755, true);
    }
      // Fichier de log
    $logFile = $logDir . '/journal.log';
    
    // Effectuer la rotation des logs pour garder 356 jours (DESACTIVEE)
    // rotateLogFile($logFile);
    
    // Écrire dans le fichier
    $result = @file_put_contents($logFile, $logEntry . PHP_EOL, FILE_APPEND | LOCK_EX);
    
    return $result !== false;
}

/**
 * Enregistre une modification de client dans le log avec détails
 */
function logClientEdit($clientName, $clientId, $oldData, $newData) {
    // Préparer l'entrée de log
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Comparer les données et identifier les changements
    $changes = [];
    $fieldsToCheck = [
        'client_cin' => 'numéro de CIN',
        'client_name' => 'nom',
        'client_phone' => 'téléphone',
        'client_email' => 'email',
        'client_company' => 'entreprise',
        'client_genre' => 'genre',
        'client_adresse' => 'adresse',
        'n_dossier' => 'numéro de dossier',
        'client_ice' => 'ICE'
    ];
    
    foreach ($fieldsToCheck as $field => $label) {
        if (isset($oldData[$field]) && isset($newData[$field]) && $oldData[$field] != $newData[$field]) {
            $changes[] = $label . ' de "' . $oldData[$field] . '" à "' . $newData[$field] . '"';
        }
    }
    
    if (empty($changes)) {
        return false; // Aucun changement détecté
    }
    
    // Format: DATETIME, nom de user à changé [détails des changements] pour le client [nom] (ID: [id])
    $changesList = implode(', ', $changes);
    $logEntry = $datetime . ', ' . $userName . ' à changé ' . $changesList . ' pour le client ' . $clientName . ' (ID: ' . $clientId . ')';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la création d'un nouveau client dans le log
 */
function logClientCreation($clientName, $clientCin, $nDossier) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à ajouté le client \'' . $clientName . '\' ayant la CIN numéro : \'' . $clientCin . '\' et le numéro de dossier (' . $nDossier . ')';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la suppression d'un client dans le log
 */
function logClientDeletion($clientName, $clientCin, $nDossier) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à supprimé le client \'' . $clientName . '\' ayant la CIN numéro : \'' . $clientCin . '\' et le numéro de dossier (' . $nDossier . ')';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la création d'une nouvelle police dans le log
 */
function logPolicyCreation($policyNumber, $clientCin) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à créé la police (' . $policyNumber . ') pour le client CIN ' . $clientCin;
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la modification d'une police dans le log
 */
function logPolicyEdit($policyNumber, $oldData, $newData) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Comparer les données et identifier les changements
    $changes = [];
    $fieldsToCheck = [
        'client_cin' => 'CIN client',
        'client_name' => 'nom client',
        'immatriculation' => 'immatriculation',
        'n_policy' => 'numéro de police',
        'start_date' => 'date début',
        'end_date' => 'date fin',
        'montant_to_paie' => 'montant à payer',
        'marque' => 'marque'
    ];
    
    foreach ($fieldsToCheck as $field => $label) {
        if (isset($oldData[$field]) && isset($newData[$field]) && $oldData[$field] != $newData[$field]) {
            $changes[] = $label . ' de "' . $oldData[$field] . '" à "' . $newData[$field] . '"';
        }
    }
    
    if (empty($changes)) {
        return false; // Aucun changement détecté
    }
    
    $changesList = implode(', ', $changes);
    $logEntry = $datetime . ', ' . $userName . ' à modifié ' . $changesList . ' pour la police (' . $policyNumber . ')';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre un paiement dans le log
 */
function logPayment($policyNumber, $montantPaye, $modePaiement, $refPaiement = '', $receiptNumber = '') {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Préparer les détails du paiement
    $details = [];
    $details[] = 'montant : ' . number_format($montantPaye, 2, ',', ' ') . ' DH';
    $details[] = 'mode : ' . $modePaiement;
    if (!empty($refPaiement)) {
        $details[] = 'référence : ' . $refPaiement;
    }
    if (!empty($receiptNumber)) {
        $details[] = 'reçu : ' . $receiptNumber;
    }
    
    $detailsList = implode(', ', $details);
    $logEntry = $datetime . ', ' . $userName . ' à enregistré un paiement pour la police (' . $policyNumber . ') - ' . $detailsList;
    
    return writeToLog($logEntry);
}

/**
 * Enregistre une validation ou un refus de paiement dans le log
 */
function logPaymentValidation($policyNumber, $montantPaye, $modePaiement, $refPaiement = '', $receiptNumber = '', $action = 'validation') {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Préparer les détails du paiement
    $details = [];
    $details[] = 'montant : ' . number_format($montantPaye, 2, ',', ' ') . ' DH';
    $details[] = 'mode : ' . $modePaiement;
    if (!empty($refPaiement)) {
        $details[] = 'référence : ' . $refPaiement;
    }
    if (!empty($receiptNumber)) {
        $details[] = 'reçu : ' . $receiptNumber;
    }
    
    // Format selon l'action
    $actionText = ($action === 'validation') ? 'validé' : 'refusé';
    $detailsList = implode(', ', $details);
    $logEntry = $datetime . ', ' . $userName . ' à ' . $actionText . ' un paiement pour la police (' . $policyNumber . ') - ' . $detailsList;
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la création d'une facture dans le log
 */
function logFactureCreation($factureNumber, $clientName, $clientCin, $montant) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à créé la facture (' . $factureNumber . ') pour le client \'' . $clientName . '\' (CIN: ' . $clientCin . ') - montant : ' . number_format($montant, 2, ',', ' ') . ' DH';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la création d'une nouvelle marque dans le log
 */
function logMarqueCreation($marque) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à ajouté la marque \'' . $marque . '\'';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la modification d'une marque dans le log
 */
function logMarqueEdit($oldMarque, $newMarque) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à modifié la marque de \'' . $oldMarque . '\' à \'' . $newMarque . '\'';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre la suppression d'une marque dans le log
 */
function logMarqueDeletion($marque) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à supprimé la marque \'' . $marque . '\'';
    
    return writeToLog($logEntry);
}

/**
 * Enregistre les modifications de configuration de compagnie dans le log
 */
function logCompagnieConfigEdit($oldData, $newData) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Comparer les données et identifier les changements
    $changes = [];
    $fieldsToCheck = [
        'compagnie_name' => 'nom de la compagnie',
        'adresse' => 'adresse',
        'tel1' => 'téléphone 1',
        'tel2' => 'téléphone 2',
        'fax' => 'fax',
        'whatsapp' => 'WhatsApp',
        'mail_1' => 'email 1',
        'mail_2' => 'email 2',
        'mail_3' => 'email 3',
        'footer' => 'pied de page',
        'logo_format' => 'format du logo',
        'logo' => 'logo'
    ];
    
    foreach ($fieldsToCheck as $field => $label) {
        if (isset($oldData[$field]) && isset($newData[$field])) {
            // Pour le logo, ne pas afficher le chemin complet
            if ($field === 'logo') {
                if ($oldData[$field] != $newData[$field]) {
                    $changes[] = $label . ' mis à jour';
                }
            } else {
                if ($oldData[$field] != $newData[$field]) {
                    $changes[] = $label . ' de "' . $oldData[$field] . '" à "' . $newData[$field] . '"';
                }
            }
        }
    }
    
    if (empty($changes)) {
        return false; // Aucun changement détecté
    }
    
    // Enregistrer chaque changement sur une ligne séparée
    $result = true;
    foreach ($changes as $change) {
        $logEntry = $datetime . ', ' . $userName . ' à modifié la configuration de la compagnie : ' . $change;
        $writeResult = writeToLog($logEntry);
        if (!$writeResult) {
            $result = false;
        }
    }
    
    return $result;
}

/**
 * Enregistre les modifications de configuration des factures dans le log
 */
function logFactureConfigEdit($oldData, $newData) {
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Comparer les données et identifier les changements
    $changes = [];
    $fieldsToCheck = [
        'facture_ref' => 'référence de facture',
        'facture_prefixe' => 'préfixe des factures',
        'facture_suffixe' => 'suffixe des factures',
        'use_year_prefix' => 'utilisation de l\'année en préfixe',
        'use_monthyear_prefix' => 'utilisation du mois/année en préfixe',
        'use_year_suffix' => 'utilisation de l\'année en suffixe',
        'use_monthyear_suffix' => 'utilisation du mois/année en suffixe',
        'reset_number_yearly' => 'remise à zéro annuelle du compteur'
    ];
    
    foreach ($fieldsToCheck as $field => $label) {
        if (isset($oldData[$field]) && isset($newData[$field])) {
            if ($oldData[$field] != $newData[$field]) {
                // Pour les champs booléens, afficher Oui/Non
                if (in_array($field, ['use_year_prefix', 'use_monthyear_prefix', 'use_year_suffix', 'use_monthyear_suffix', 'reset_number_yearly'])) {
                    $oldValue = $oldData[$field] ? 'Oui' : 'Non';
                    $newValue = $newData[$field] ? 'Oui' : 'Non';
                } else {
                    $oldValue = $oldData[$field];
                    $newValue = $newData[$field];
                }
                $changes[] = $label . ' de "' . $oldValue . '" à "' . $newValue . '"';
            }
        }
    }
    
    if (empty($changes)) {
        return false; // Aucun changement détecté
    }
    
    // Enregistrer chaque changement sur une ligne séparée
    $result = true;
    foreach ($changes as $change) {
        $logEntry = $datetime . ', ' . $userName . ' à modifié la configuration des factures : ' . $change;
        $writeResult = writeToLog($logEntry);
        if (!$writeResult) {
            $result = false;
        }
    }
    
    return $result;
}
?>
