<?php
/**
 * API de mise à jour des coordonnées GPS de l'employé
 * POST /api/update-location
 *
 * Met à jour latitude_site et longitude_site dans la table employees
 * avec les coordonnées GPS du device lors de la connexion.
 * Récupère aussi les infos du site (latitude, longitude, rayon_autorise)
 * et vérifie si l'employé est dans la zone autorisée.
 */

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

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']);
    exit;
}

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

$input = json_decode(file_get_contents('php://input'), true);

if (!isset($input['latitude']) || !isset($input['longitude'])) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Latitude et longitude requises']);
    exit;
}

$latitude = (float)$input['latitude'];
$longitude = (float)$input['longitude'];

if ($latitude < -90 || $latitude > 90 || $longitude < -180 || $longitude > 180) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Coordonnées GPS invalides']);
    exit;
}

try {
    $db = getDB();

    // Récupérer l'employé avec son site
    $stmt = $db->prepare("
        SELECT e.id, e.site_id, e.latitude_site, e.longitude_site, e.rayon_autorise,
               s.latitude as site_latitude, s.longitude as site_longitude,
               s.rayon_autorise as site_rayon, s.nom as site_nom
        FROM employees e
        LEFT JOIN sites s ON e.site_id = s.id
        WHERE e.id = :id AND e.actif = 1
    ");
    $stmt->execute(['id' => $userId]);
    $employee = $stmt->fetch();

    if (!$employee) {
        http_response_code(404);
        echo json_encode(['success' => false, 'message' => 'Employé non trouvé']);
        exit;
    }

    // Mettre à jour les coordonnées GPS de l'employé
    $stmt = $db->prepare("
        UPDATE employees
        SET latitude_site = :latitude,
            longitude_site = :longitude,
            updated_at = NOW()
        WHERE id = :id
    ");
    $stmt->execute([
        'latitude' => $latitude,
        'longitude' => $longitude,
        'id' => $userId
    ]);

    // Vérifier si l'employé est dans la zone autorisée
    $inZone = true;
    $distance = 0;
    $rayonAutorise = (int)($employee['site_rayon'] ?? $employee['rayon_autorise'] ?? 100);

    if (!empty($employee['site_latitude']) && !empty($employee['site_longitude'])) {
        $distance = calculateDistance(
            $latitude,
            $longitude,
            (float)$employee['site_latitude'],
            (float)$employee['site_longitude']
        );
        $inZone = $distance <= $rayonAutorise;
    }

    echo json_encode([
        'success' => true,
        'message' => 'Coordonnées mises à jour',
        'latitude_site' => $latitude,
        'longitude_site' => $longitude,
        'site_latitude' => $employee['site_latitude'] ? (float)$employee['site_latitude'] : null,
        'site_longitude' => $employee['site_longitude'] ? (float)$employee['site_longitude'] : null,
        'rayon_autorise' => $rayonAutorise,
        'distance' => round($distance),
        'in_zone' => $inZone,
        'site_nom' => $employee['site_nom'] ?? null
    ]);

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

function calculateDistance($lat1, $lon1, $lat2, $lon2) {
    $earthRadius = 6371000;
    $dLat = deg2rad($lat2 - $lat1);
    $dLon = deg2rad($lon2 - $lon1);
    $a = sin($dLat / 2) * sin($dLat / 2) +
        cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
        sin($dLon / 2) * sin($dLon / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    return $earthRadius * $c;
}
