<?php
/**
 * Système de log simple pour toutes les opérations du système
 * Enregistre les modifications de clients, polices, paiements, factures, marques, et configurations
 */

/**
 * Enregistre une modification de client dans le log avec détails
 * @param string $clientName Nom du client
 * @param int $clientId ID du client
 * @param array $oldData Anciennes données
 * @param array $newData Nouvelles données
 */
function logClientEdit($clientName, $clientId, $oldData, $newData) {
    // Vérifier si l'utilisateur est connecté
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    // 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 . ')';
    
    // Écrire dans le log
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la création d'un nouveau client dans le log
 * @param string $clientName Nom du client
 * @param string $clientCin CIN du client
 * @param string $nDossier Numéro de dossier
 * @return bool Succès de l'écriture
 */
function logClientAdd($clientName, $clientCin, $nDossier) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à ajouté le client ' . $clientName . ' (CIN: ' . $clientCin . ', Dossier: ' . $nDossier . ')';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la suppression d'un client dans le log
 * @param string $clientName Nom du client
 * @param string $clientCin CIN du client
 * @return bool Succès de l'écriture
 */
function logClientDelete($clientName, $clientCin) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à supprimé le client ' . $clientName . ' (CIN: ' . $clientCin . ')';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la création d'une nouvelle police dans le log
 * @param string $policyNum Numéro de police
 * @param string $clientName Nom du client
 * @param string $clientCin CIN du client
 * @return bool Succès de l'écriture
 */
function logPolicyAdd($policyNum, $clientName, $clientCin) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à créé la police (' . $policyNum . ') pour le client ' . $clientName . ' (CIN: ' . $clientCin . ')';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la modification d'une police dans le log
 * @param string $policyNum Numéro de police
 * @param string $clientName Nom du client
 * @param array $oldData Anciennes données
 * @param array $newData Nouvelles données
 * @return bool Succès de l'écriture
 */
function logPolicyEdit($policyNum, $clientName, $oldData, $newData) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    // Comparer les données et identifier les changements
    $changes = [];
    $fieldsToCheck = [
        'police_num' => 'numéro de police',
        'prime_ttc' => 'prime TTC',
        'prime_ht' => 'prime HT',
        'date_effet' => 'date d\'effet',
        'date_echeance' => 'date d\'échéance',
        'marque' => 'marque',
        'modele' => 'modèle',
        'numero_chassi' => 'numéro de châssis',
        'numero_moteur' => 'numéro de moteur',
        'puissance_fiscale' => 'puissance fiscale',
        'place_assise' => 'places assises',
        'usage_vehicule' => 'usage du véhicule',
        'zone_circulation' => 'zone de circulation',
        'valeur_venale' => 'valeur vénale',
        'formule' => 'formule'
    ];
    
    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é la police (' . $policyNum . ') : ' . $changesList . ' pour le client ' . $clientName;
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre un paiement dans le log
 * @param string $policyNum Numéro de police
 * @param string $clientName Nom du client
 * @param float $montant Montant du paiement
 * @param string $typePaiement Type de paiement
 * @return bool Succès de l'écriture
 */
function logPayment($policyNum, $clientName, $montant, $typePaiement) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à enregistré un paiement de ' . $montant . ' DH (' . $typePaiement . ') pour la police (' . $policyNum . ') du client ' . $clientName;
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la validation d'un paiement dans le log
 * @param string $policyNum Numéro de police
 * @param string $clientName Nom du client
 * @param float $montant Montant validé
 * @return bool Succès de l'écriture
 */
function logPaymentValidation($policyNum, $clientName, $montant) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à validé un paiement de ' . $montant . ' DH pour la police (' . $policyNum . ') du client ' . $clientName;
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la création d'une facture dans le log
 * @param string $factureNum Numéro de facture
 * @param string $clientName Nom du client
 * @param float $montant Montant de la facture
 * @return bool Succès de l'écriture
 */
function logFactureCreation($factureNum, $clientName, $montant) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à créé la facture (' . $factureNum . ') de ' . $montant . ' DH pour le client ' . $clientName;
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre l'ajout d'une marque dans le log
 * @param string $marqueName Nom de la marque
 * @return bool Succès de l'écriture
 */
function logMarqueAdd($marqueName) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à ajouté la marque "' . $marqueName . '"';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la modification d'une marque dans le log
 * @param string $oldName Ancien nom de la marque
 * @param string $newName Nouveau nom de la marque
 * @return bool Succès de l'écriture
 */
function logMarqueEdit($oldName, $newName) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à modifié la marque "' . $oldName . '" en "' . $newName . '"';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la suppression d'une marque dans le log
 * @param string $marqueName Nom de la marque
 * @return bool Succès de l'écriture
 */
function logMarqueDelete($marqueName) {
    if (!isset($_SESSION['user_name'])) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $logEntry = $datetime . ', ' . $userName . ' à supprimé la marque "' . $marqueName . '"';
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la modification de la configuration de compagnie dans le log
 * @param array $changes Tableau des changements effectués
 * @return bool Succès de l'écriture
 */
function logCompagnieConfig($changes) {
    if (!isset($_SESSION['user_name']) || empty($changes)) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $changesList = implode(', ', $changes);
    $logEntry = $datetime . ', ' . $userName . ' à modifié la configuration de la compagnie : ' . $changesList;
    
    return writeToLogFile($logEntry);
}

/**
 * Enregistre la modification de la configuration des factures dans le log
 * @param array $changes Tableau des changements effectués
 * @return bool Succès de l'écriture
 */
function logFactureConfig($changes) {
    if (!isset($_SESSION['user_name']) || empty($changes)) {
        return false;
    }
    
    $datetime = date('Y-m-d H:i:s');
    $userName = $_SESSION['user_name'];
    
    $changesList = implode(', ', $changes);
    $logEntry = $datetime . ', ' . $userName . ' à modifié la configuration des factures : ' . $changesList;
    
    return writeToLogFile($logEntry);
}

/**
 * Fonction utilitaire pour écrire dans le fichier de log
 * @param string $logEntry Entrée de log à écrire
 * @return bool Succès de l'écriture
 */
function writeToLogFile($logEntry) {
    // Récupérer la référence de compagnie depuis la session
    $compagnieRef = isset($_SESSION['compagnie_ref']) ? $_SESSION['compagnie_ref'] : '123456';
    
    // Créer le répertoire de log s'il n'existe pas
    $logDir = __DIR__ . '/../data/' . $compagnieRef;
    if (!is_dir($logDir)) {
        @mkdir($logDir, 0755, true);
    }
    
    // Fichier de log
    $logFile = $logDir . '/journal.log';
    
    // Écrire dans le fichier
    $result = @file_put_contents($logFile, $logEntry . PHP_EOL, FILE_APPEND | LOCK_EX);
    
    return $result !== false;
}
?>
