<?php
// Validation/Refus d'une demande de congé par un manager
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

header("Content-Type: application/json");

// 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_";

$conn = new mysqli($host, $username, $password, $dbname);

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

// Lecture du JSON envoyé
$input = file_get_contents('php://input');
error_log("validateRequest - Input reçu: " . $input);

$data = json_decode($input, true);

if (!isset($data['request_id'], $data['action'], $data['validator_id'])) {
    error_log("validateRequest - Données manquantes: " . print_r($data, true));
    echo json_encode([
        "success" => false,
        "message" => "Données manquantes pour la validation"
    ]);
    exit();
}

$requestId = (int)$data['request_id'];
$action = $data['action']; // 'approve' ou 'reject'
$validatorId = (int)$data['validator_id'];
$comment = $data['comment'] ?? '';

error_log("validateRequest - Request ID: $requestId, Action: $action, Validator: $validatorId");

try {
    $conn->begin_transaction();
    
    // Vérifier que la demande existe et est en attente
    $queryCheck = "
        SELECT dc.Id, dc.EmployeeId, dc.TypeCongeId, dc.DateDebut, dc.DateFin, dc.NombreJours,
               u.Nom, u.Prenom, tc.Nom as TypeNom
        FROM DemandeConge dc
        JOIN Users u ON dc.EmployeeId = u.ID
        JOIN TypeConge tc ON dc.TypeCongeId = tc.Id
        WHERE dc.Id = ? AND dc.Statut = 'En attente'
    ";
    
    $stmtCheck = $conn->prepare($queryCheck);
    $stmtCheck->bind_param("i", $requestId);
    $stmtCheck->execute();
    $resultCheck = $stmtCheck->get_result();
    
    if ($requestRow = $resultCheck->fetch_assoc()) {
        $employeeId = $requestRow['EmployeeId'];
        $typeCongeId = $requestRow['TypeCongeId'];
        $nombreJours = $requestRow['NombreJours'];
        $employeeName = $requestRow['Prenom'] . ' ' . $requestRow['Nom'];
        $typeNom = $requestRow['TypeNom'];
        
        error_log("validateRequest - Demande trouvée: $employeeName, Type: $typeNom, Jours: $nombreJours");
        
        // Déterminer le nouveau statut
        $newStatus = ($action === 'approve') ? 'Validée' : 'Refusée';
        
        // Mettre à jour la demande
        $queryUpdate = "
            UPDATE DemandeConge 
            SET Statut = ?, 
                ValidateurId = ?, 
                DateValidation = NOW(),
                CommentaireValidation = ?
            WHERE Id = ?
        ";
        
        $stmtUpdate = $conn->prepare($queryUpdate);
        $stmtUpdate->bind_param("sisi", $newStatus, $validatorId, $comment, $requestId);
        
        if ($stmtUpdate->execute()) {
            error_log("validateRequest - Demande mise à jour avec succès");
            
            // Si approuvée, déduire du solde (sauf pour congé maladie)
            if ($action === 'approve' && $typeNom !== 'Congé maladie') {
                // Déterminer l'année selon le type de congé
                $currentDate = new DateTime();
                if ($typeNom === 'Congé payé') {
                    // Exercice CP: 01/06 au 31/05
                    $year = ($currentDate->format('m') < 6) ? $currentDate->format('Y') - 1 : $currentDate->format('Y');
                } else {
                    // RTT: année civile
                    $year = $currentDate->format('Y');
                }
                
                error_log("validateRequest - Déduction solde: Type=$typeNom, Année=$year, Jours=$nombreJours");
                
                // Déduire du solde
                $queryDeduct = "
                    UPDATE CompteurConges 
                    SET Solde = GREATEST(0, Solde - ?)
                    WHERE EmployeeId = ? AND TypeCongeId = ? AND Annee = ?
                ";
                
                $stmtDeduct = $conn->prepare($queryDeduct);
                $stmtDeduct->bind_param("diii", $nombreJours, $employeeId, $typeCongeId, $year);
                
                if ($stmtDeduct->execute()) {
                    error_log("validateRequest - Solde déduit avec succès");
                } else {
                    error_log("validateRequest - Erreur déduction solde: " . $stmtDeduct->error);
                }
                
                $stmtDeduct->close();
            }
            
            // Créer une notification pour l'employé
            $notificationTitle = ($action === 'approve') ? 'Demande approuvée' : 'Demande refusée';
            $notificationMessage = "Votre demande de $typeNom a été " . (($action === 'approve') ? 'approuvée' : 'refusée');
            if ($comment) {
                $notificationMessage .= ". Commentaire: $comment";
            }
            
            $queryNotif = "
                INSERT INTO Notifications (UserId, Titre, Message, Type, DemandeCongeId)
                VALUES (?, ?, ?, ?, ?)
            ";
            
            $notifType = ($action === 'approve') ? 'Success' : 'Error';
            $stmtNotif = $conn->prepare($queryNotif);
            $stmtNotif->bind_param("isssi", $employeeId, $notificationTitle, $notificationMessage, $notifType, $requestId);
            $stmtNotif->execute();
            $stmtNotif->close();
            
            // Log dans l'historique
            $actionText = ($action === 'approve') ? 'Validation congé' : 'Refus congé';
            $actionDetails = "$actionText $employeeName ($typeNom)";
            if ($comment) {
                $actionDetails .= " - $comment";
            }
            
            $queryHistory = "
                INSERT INTO HistoriqueActions (UserId, Action, Details, DemandeCongeId)
                VALUES (?, ?, ?, ?)
            ";
            
            $stmtHistory = $conn->prepare($queryHistory);
            $stmtHistory->bind_param("issi", $validatorId, $actionText, $actionDetails, $requestId);
            $stmtHistory->execute();
            $stmtHistory->close();
            
            $conn->commit();
            
            echo json_encode([
                "success" => true,
                "message" => "Demande " . (($action === 'approve') ? 'approuvée' : 'refusée') . " avec succès",
                "new_status" => $newStatus
            ]);
            
        } else {
            throw new Exception("Erreur lors de la mise à jour: " . $stmtUpdate->error);
        }
        
        $stmtUpdate->close();
    } else {
        throw new Exception("Demande non trouvée ou déjà traitée");
    }
    
    $stmtCheck->close();
    
} catch (Exception $e) {
    $conn->rollback();
    error_log("Erreur validateRequest: " . $e->getMessage());
    echo json_encode([
        "success" => false,
        "message" => "Erreur lors de la validation: " . $e->getMessage()
    ]);
}

$conn->close();
?>