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

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Appliquer rate limiting sans token (connexion)
$security = new ApiSecurity();
$rateCheck = $security->checkRateLimit();
if (!$rateCheck['allowed']) {
    http_response_code(429);
    sendError('Trop de tentatives. Réessayez dans ' . $rateCheck['retry_after'] . ' secondes.');
}

// POST uniquement (plus de GET avec identifiants en clair)
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    sendError('Méthode non autorisée');
}

// 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;
    }
}

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

$code_utilisateur = sanitizeLoginInput($_POST['username'] ?? $inputData['username'] ?? '');
$mot_de_passe = sanitizeLoginInput($_POST['password'] ?? $inputData['password'] ?? '');

if (empty($code_utilisateur) || empty($mot_de_passe)) {
    sendError('Veuillez saisir le nom d\'utilisateur et le mot de passe');
}

// Validation supplémentaire : limiter la longueur
if (strlen($code_utilisateur) > 100 || strlen($mot_de_passe) > 255) {
    sendError('Paramètres invalides');
}

$conn = getConnectionGGR();
if (!$conn) {
    sendError('Erreur de connexion à la base de données');
}

// Utilisation d'une 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) {
    sendError('Erreur de requête');
}

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

if ($result->num_rows === 0) {
    $stmt->close();
    $conn->close();
    sendError('Utilisateur non trouvé ou compte inactif');
}

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

// Vérification du mot de passe
if ($user['mot_de_passe'] !== $mot_de_passe) {
    $conn->close();
    sendError('Mot de passe incorrect');
}

// Récupérer le nom du site
$siteID = $user['SiteID'];
$nomSite = $siteID;
$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']
]);

// Retourner les infos utilisateur AVEC le token
$userData = array(
    'code_utilisateur' => $user['code_utilisateur'],
    'Nom' => $user['Nom'],
    'Prenom' => $user['Prenom'],
    'NomPrenom' => $user['NomPrenom'],
    'role' => $user['role'],
    'statut' => $user['statut'],
    'SiteID' => $user['SiteID'],
    'NomSite' => $nomSite,
    'token' => $token,
    'token_expires_in' => $security->shouldRenewToken($token) ? 'renew_needed' : 'valid'
);

$conn->close();
sendResponse($userData, true, 'Authentification réussie');
?>
