<?php
// Script de réinitialisation des compteurs de congés
// À exécuter manuellement ou via cron job

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json");

// Gère la requête OPTIONS (pré-vol CORS)
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

// Log des erreurs pour debug
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$host = "192.168.0.4";
$dbname = "DemandeConge";
$username = "wpuser";
$password = "-2b/)ru5/Bi8P[7_";

// Connexion à la base de données
$conn = new mysqli($host, $username, $password, $dbname);

if ($conn->connect_error) {
    error_log("Erreur connexion DB reset: " . $conn->connect_error);
    echo json_encode([
        "success" => false,
        "message" => "Erreur de connexion à la base de données : " . $conn->connect_error
    ]);
    exit();
}

// Log de debug
error_log("Reset counters - Début du script");

// Fonction pour déterminer l'exercice des congés payés (01/06 au 31/05)
function getLeaveYear($date = null) {
    if ($date === null) {
        $date = new DateTime();
    } else {
        $date = new DateTime($date);
    }
    
    $currentYear = (int)$date->format('Y');
    $currentMonth = (int)$date->format('m');
    
    // Si on est avant le 1er juin, l'exercice a commencé l'année précédente
    if ($currentMonth < 6) {
        return $currentYear - 1;
    }
    // Si on est le 1er juin ou après, l'exercice a commencé cette année
    return $currentYear;
}

// Fonction pour déterminer l'année RTT (01/01 au 31/12)
function getRTTYear($date = null) {
    if ($date === null) {
        $date = new DateTime();
    } else {
        $date = new DateTime($date);
    }
    
    return (int)$date->format('Y');
}

try {
    $conn->begin_transaction();
    
    $currentDate = new DateTime();
    $leaveYear = getLeaveYear();
    $rttYear = getRTTYear();
    
    error_log("Reset counters - Exercice CP: $leaveYear, RTT: $rttYear");
    
    $resetLog = [];
    
    // 1. Récupérer tous les employés depuis la table Users
    $queryEmployees = "SELECT ID FROM Users";
    $resultEmployees = $conn->query($queryEmployees);
    
    if (!$resultEmployees) {
        throw new Exception("Erreur lors de la récupération des employés : " . $conn->error);
    }
    
    error_log("Reset counters - Nombre d'employés trouvés: " . $resultEmployees->num_rows);
    
    // 2. Récupérer les IDs des types de congés
    $queryTypes = "SELECT Id, Nom FROM TypeConge WHERE Nom IN ('Congé payé', 'RTT', 'Congé maladie')";
    $resultTypes = $conn->query($queryTypes);
    
    $typeIds = [];
    while ($row = $resultTypes->fetch_assoc()) {
        $typeIds[$row['Nom']] = $row['Id'];
    }
    
    error_log("Reset counters - Types trouvés: " . print_r($typeIds, true));
    
    if (count($typeIds) < 3) {
        throw new Exception("Types de congés manquants dans la base de données");
    }
    
    // 3. Pour chaque employé, réinitialiser les compteurs
    $employeesUpdated = 0;
    while ($employee = $resultEmployees->fetch_assoc()) {
        $employeeId = $employee['ID'];
        
        error_log("Reset counters - Traitement employé: $employeeId");
        
        // CONGÉS PAYÉS - Exercice du 01/06 au 31/05 (25 jours)
        $queryUpdateCP = "
            INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
            VALUES (?, ?, ?, 25, 25)
            ON DUPLICATE KEY UPDATE 
                Solde = 25,
                Total = 25
        ";
        $stmtCP = $conn->prepare($queryUpdateCP);
        if (!$stmtCP) {
            throw new Exception("Erreur préparation CP: " . $conn->error);
        }
        $stmtCP->bind_param("iii", $employeeId, $typeIds['Congé payé'], $leaveYear);
        
        if (!$stmtCP->execute()) {
            throw new Exception("Erreur lors de la mise à jour des CP pour l'employé $employeeId : " . $stmtCP->error);
        }
        $stmtCP->close();
        
        // RTT - Année civile du 01/01 au 31/12
        // Calcul du nombre de RTT selon l'année
        $rttCount = 10; // Par défaut 10 pour 2025
        if ($rttYear == 2024) {
            $rttCount = 8; // Exemple pour 2024
        } elseif ($rttYear >= 2025) {
            $rttCount = 10; // 10 pour 2025 et après
        }
        
        $queryUpdateRTT = "
            INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
            VALUES (?, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
                Solde = ?,
                Total = ?
        ";
        $stmtRTT = $conn->prepare($queryUpdateRTT);
        if (!$stmtRTT) {
            throw new Exception("Erreur préparation RTT: " . $conn->error);
        }
        $stmtRTT->bind_param("iiiiiii", $employeeId, $typeIds['RTT'], $rttYear, $rttCount, $rttCount, $rttCount, $rttCount);
        
        if (!$stmtRTT->execute()) {
            throw new Exception("Erreur lors de la mise à jour des RTT pour l'employé $employeeId : " . $stmtRTT->error);
        }
        $stmtRTT->close();
        
        // CONGÉ MALADIE - Réinitialiser à 0 (pas de limite)
        $queryUpdateABS = "
            INSERT INTO CompteurConges (EmployeeId, TypeCongeId, Annee, Solde, Total)
            VALUES (?, ?, ?, 0, 0)
            ON DUPLICATE KEY UPDATE 
                Solde = 0,
                Total = 0
        ";
        $stmtABS = $conn->prepare($queryUpdateABS);
        if (!$stmtABS) {
            throw new Exception("Erreur préparation ABS: " . $conn->error);
        }
        $stmtABS->bind_param("iii", $employeeId, $typeIds['Congé maladie'], $rttYear);
        
        if (!$stmtABS->execute()) {
            throw new Exception("Erreur lors de la mise à jour des ABS pour l'employé $employeeId : " . $stmtABS->error);
        }
        $stmtABS->close();
        
        $resetLog[] = "Employé $employeeId : CP=$leaveYear (25j), RTT=$rttYear ({$rttCount}j), ABS=$rttYear (0j)";
        $employeesUpdated++;
    }
    
    error_log("Reset counters - Employés mis à jour: $employeesUpdated");
    
    // 4. Log de la réinitialisation
    $logEntry = "
        === RÉINITIALISATION DES COMPTEURS ===
        Date: " . $currentDate->format('Y-m-d H:i:s') . "
        Exercice CP: $leaveYear (01/06/$leaveYear au 31/05/" . ($leaveYear + 1) . ")
        Année RTT: $rttYear (01/01/$rttYear au 31/12/$rttYear)
        Employés traités: $employeesUpdated
        
        Détails:
        " . implode("\n        ", $resetLog) . "
    ";
    
    // Sauvegarder le log (optionnel - créer une table de logs si nécessaire)
    error_log($logEntry, 3, "reset_counters.log");
    
    $conn->commit();
    error_log("Reset counters - Transaction commitée avec succès");
    
    echo json_encode([
        "success" => true,
        "message" => "Compteurs réinitialisés avec succès",
        "details" => [
            "employees_updated" => $employeesUpdated,
            "leave_year" => $leaveYear,
            "rtt_year" => $rttYear,
            "cp_days" => 25,
            "rtt_days" => $rttCount,
            "reset_date" => $currentDate->format('Y-m-d H:i:s')
        ],
        "log" => $resetLog
    ]);
    
} catch (Exception $e) {
    $conn->rollback();
    error_log("Erreur réinitialisation compteurs : " . $e->getMessage());
    
    echo json_encode([
        "success" => false,
        "message" => "Erreur lors de la réinitialisation : " . $e->getMessage()
    ]);
}

$conn->close();
?>