<?php
require_once 'db_config.php';
require_once 'security.php';

header('Content-Type: text/plain; charset=utf-8');

// Appliquer rate limiting (pas besoin de token pour se connecter)
$security = new ApiSecurity();
$rateCheck = $security->checkRateLimit();
if (!$rateCheck['allowed']) {
    http_response_code(429);
    echo "ERR|Trop de tentatives. Réessayez dans " . $rateCheck['retry_after'] . " secondes.";
    exit;
}

// Nettoyage des entrées
function sanitizeAuthInput($data) {
    if (!isset($data) || is_null($data)) return '';
    return trim($data);
}

// Accepter POST uniquement pour la sécurité (plus de GET avec identifiants en clair)
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo "ERR|Méthode non autorisée";
    exit;
}

// Lire le corps JSON si Content-Type est application/json
$inputData = [];
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (strpos($contentType, 'application/json') !== false) {
    $jsonBody = json_decode(file_get_contents('php://input'), true);
    if (is_array($jsonBody)) {
        $inputData = $jsonBody;
    }
}

$code_utilisateur = sanitizeAuthInput($_POST['code'] ?? $_POST['username'] ?? $inputData['code'] ?? $inputData['username'] ?? '');
$mot_de_passe = sanitizeAuthInput($_POST['pass'] ?? $_POST['password'] ?? $inputData['pass'] ?? $inputData['password'] ?? '');
$session_id = sanitizeAuthInput($_POST['session_id'] ?? $inputData['session_id'] ?? '');

if (empty($code_utilisateur) || empty($mot_de_passe)) {
    echo "ERR|Veuillez saisir le code utilisateur et le mot de passe";
    exit;
}

// Validation longueur
if (strlen($code_utilisateur) > 100 || strlen($mot_de_passe) > 255 || strlen($session_id) > 255) {
    echo "ERR|Paramètres invalides";
    exit;
}

$conn = getConnectionGGR();
if (!$conn) {
    echo "ERR|Erreur de connexion à la base de données";
    exit;
}

// Requête préparée pour éviter l'injection SQL
$sql = "SELECT code_utilisateur, Nom, Prenom, NomPrenom, role, statut, SiteID, mot_de_passe 
        FROM Utilisateurs 
        WHERE code_utilisateur = ? AND statut = 'ACTIF'
        LIMIT 1";

$stmt = $conn->prepare($sql);
if (!$stmt) {
    echo "ERR|Erreur de requête";
    exit;
}

$stmt->bind_param("s", $code_utilisateur);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows === 0) {
    $stmt->close();
    $conn->close();
    echo "ERR|Utilisateur non trouvé ou compte inactif";
    exit;
}

$user = $result->fetch_assoc();
$stmt->close();

// Vérification mot de passe (en clair)
if ($user['mot_de_passe'] !== $mot_de_passe) {
    $conn->close();
    echo "ERR|Mot de passe incorrect";
    exit;
}

// Récupérer le nom du site à partir de la table Sites (requête préparée)
$siteID = $user['SiteID'];
$nomSite = $siteID; // fallback: utiliser le SiteID si la table Sites n'existe pas

$sql_site = "SELECT Nom_Site FROM Sites WHERE SiteID = ? LIMIT 1";
$stmt_site = $conn->prepare($sql_site);
if ($stmt_site) {
    $stmt_site->bind_param("s", $siteID);
    $stmt_site->execute();
    $result_site = $stmt_site->get_result();
    if ($result_site && $result_site->num_rows > 0) {
        $row_site = $result_site->fetch_assoc();
        $nomSite = $row_site['Nom_Site'];
    }
    $stmt_site->close();
}

// ===== GÉNÉRATION DU TOKEN DE SÉCURITÉ =====
$token = $security->generateToken(
    $user['code_utilisateur'],
    $user['role'],
    $user['SiteID']
);

// Journaliser la connexion
$security->logSecurity('login_success', [
    'user' => $user['code_utilisateur'],
    'role' => $user['role'],
    'site' => $user['SiteID']
]);

// Nouveau format avec token : OK|Token|NomPrenom|SiteID|NomSite|Role
$response = "OK|" . $token . "|" . $user['NomPrenom'] . "|" . $siteID . "|" . $nomSite . "|" . $user['role'];
echo $response;

$conn->close();
?>
