<?php
/**
 * API de récupération des pointages
 * GET /api/attendances?employee_id=X&filter=Y&limit=Z
 * Si employee_id n'est pas fourni, retourne tous les pointages (admin)
 */

require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../auth.php';

// Vérifier la méthode HTTP
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    http_response_code(405);
    echo json_encode([
        'success' => false,
        'message' => 'Méthode non autorisée'
    ]);
    exit;
}

// Authentification requise
$payload = requireAuth();
$userId = $payload['user_id'];

// Vérifier que l'utilisateur est Admin
$db = getDB();
$stmtAdmin = $db->prepare("SELECT role FROM employees WHERE id = :id AND actif = 1");
$stmtAdmin->execute(['id' => $userId]);
$adminCheck = $stmtAdmin->fetch();

if (!$adminCheck || $adminCheck['role'] !== 'Admin') {
    http_response_code(403);
    echo json_encode([
        'success' => false,
        'message' => 'Accès réservé à l\'administrateur'
    ]);
    exit;
}

// Récupérer les paramètres
$employeeId = isset($_GET['employee_id']) ? (int)$_GET['employee_id'] : 0;
$filter = isset($_GET['filter']) ? $_GET['filter'] : 'all';
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 100;

try {
    $db = getDB();

    // Construire la requête
    $sql = "
        SELECT a.*, e.nom as employee_nom, e.prenom as employee_prenom, e.nomprenom
        FROM attendances a
        JOIN employees e ON a.employee_id = e.id
        WHERE 1=1
    ";

    // Filtrer par employee_id si fourni
    if ($employeeId > 0) {
        $sql .= " AND a.employee_id = :employee_id";
    }

    // Ajouter le filtre type
    if ($filter === 'entree') {
        $sql .= " AND a.type_pointage = 'entree'";
    } elseif ($filter === 'sortie') {
        $sql .= " AND a.type_pointage = 'sortie'";
    }

    // Trier par date décroissante
    $sql .= " ORDER BY a.date_heure DESC";

    // Ajouter la limite
    if ($limit > 0) {
        $sql .= " LIMIT :limit";
    }

    $stmt = $db->prepare($sql);

    if ($employeeId > 0) {
        $stmt->bindValue('employee_id', $employeeId, PDO::PARAM_INT);
    }
    if ($limit > 0) {
        $stmt->bindValue('limit', $limit, PDO::PARAM_INT);
    }
    $stmt->execute();

    $attendances = $stmt->fetchAll();

    // Formater les données pour la réponse
    $responseAttendances = array_map(function($a) {
        return [
            'id' => (int)$a['id'],
            'employee_id' => (int)$a['employee_id'],
            'type_pointage' => $a['type_pointage'],
            'date_heure' => $a['date_heure'],
            'latitude' => (float)$a['latitude'],
            'longitude' => (float)$a['longitude'],
            'precision_gps' => (float)$a['precision_gps'],
            'score_visage' => isset($a['score_visage']) && $a['score_visage'] !== null ? (float)$a['score_visage'] : null,
            'appareil' => $a['appareil'],
            'statut_validation' => $a['statut_validation'],
            'distance_meters' => isset($a['distance_meters']) ? (int)$a['distance_meters'] : 0,
            'employee_nom' => $a['employee_nom'],
            'employee_prenom' => $a['employee_prenom'],
            'nomprenom' => $a['nomprenom'] ?? ($a['employee_nom'] . ' ' . $a['employee_prenom'])
        ];
    }, $attendances);

    echo json_encode([
        'success' => true,
        'message' => 'Pointages récupérés',
        'attendances' => $responseAttendances
    ]);

} catch (Exception $e) {
    error_log("Erreur attendances: " . $e->getMessage());
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Erreur serveur'
    ]);
}
