<?php
define('PATIENT_SUR_PLACE_ID', 51);
// c'est le premier fichier chargé par tous les endpoints de l'API
// je place les headers CORS absolument en premier avant tout output
// je force HTTPS depuis PHP directement pour éviter les redirections Apache
// qui font perdre les headers CORS
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('Location: ' . $url, true, 301);
    exit;
}

// j'autorise toutes les origines — indispensable pour l'app mobile et le web local
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Max-Age: 86400');
header('Content-Type: application/json; charset=utf-8');

// je réponds immédiatement aux requêtes OPTIONS du navigateur
// sans ça le navigateur bloque avant même d'envoyer la vraie requête
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// ── lecture d'un paramètre global depuis la BDD ──
function getParametre($cle, $defaut = null) {
    $db   = getDB();
    $stmt = $db->prepare("SELECT valeur FROM parametres WHERE cle = ?");
    $stmt->execute([$cle]);
    $row  = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row ? $row['valeur'] : $defaut;
}

// j'envoie une réponse JSON propre avec le bon code HTTP
function repondre($data, $code = 200) {
    http_response_code($code);
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

// je récupère le body JSON envoyé par l'app mobile
function getBody() {
    $raw = file_get_contents('php://input');
    file_put_contents(
        dirname(__DIR__) . '/debug.log',
        date('Y-m-d H:i:s') . " | getBody raw: [" . $raw . "] | CT: " . ($_SERVER['CONTENT_TYPE'] ?? 'none') . "\n",
        FILE_APPEND
    );
    return json_decode($raw, true) ?? [];
}

// je vérifie que des champs obligatoires sont présents dans la requête
function validerChamps($data, $champs) {
    $manquants = [];
    foreach ($champs as $champ) {
        if (empty($data[$champ])) {
            $manquants[] = $champ;
        }
    }
    if (!empty($manquants)) {
        repondre(['erreur' => 'Champs manquants : ' . implode(', ', $manquants)], 422);
    }
}

// je vérifie le token d'authentification envoyé dans le header Authorization
// je retourne maintenant services[] et service_ids[] pour les gérants multi-services
function verifierToken() {
    $headers = getallheaders();
    $auth = $headers['Authorization'] ?? '';

    if (!str_starts_with($auth, 'Bearer ')) {
        repondre(['erreur' => 'Token manquant ou invalide'], 401);
    }

    $token = substr($auth, 7);
    $db = getDB();

    $stmt = $db->prepare("
        SELECT t.utilisateur_id, u.role, u.nom, u.prenom, u.hopital_id, u.service_id
        FROM tokens_api t
        JOIN utilisateurs u ON u.id = t.utilisateur_id
        WHERE t.token = ? AND t.expire_at > NOW() AND u.actif = 1
    ");
    $stmt->execute([$token]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$user) {
        repondre(['erreur' => 'Session expirée, veuillez vous reconnecter'], 401);
    }

    // pour les gérants : je charge tous leurs services depuis gerant_services
    $user['services']    = [];
    $user['service_ids'] = [];

    if ($user['role'] === 'gerant') {
        $stmt2 = $db->prepare("
            SELECT gs.service_id, s.nom AS service_nom
            FROM gerant_services gs
            JOIN services s ON s.id = gs.service_id
            WHERE gs.gerant_id = ?
        ");
        $stmt2->execute([$user['utilisateur_id']]);
        $user['services']    = $stmt2->fetchAll(PDO::FETCH_ASSOC);
        // service_ids seuls — pratique pour les requêtes WHERE service_id IN (...)
        $user['service_ids'] = array_column($user['services'], 'service_id');
    }

    return $user;
}

// je génère un token unique de 64 caractères hexadécimaux
function genererToken() {
    return bin2hex(random_bytes(32));
}

// je génère un code QR unique pour identifier chaque ticket
function genererCodeQR() {
    return 'SENRDV-' . strtoupper(bin2hex(random_bytes(8)));
}