<?php
/**
 * API d'authentification
 * Répertoire: Includes/Auth/
 * Retourne un token JWT après connexion réussie
 */

include_once __DIR__ . '/../auth_check.php';

// Rate limiting par IP et username
checkRateLimit(($_SERVER['REMOTE_ADDR'] ?? 'unknown') . '_login');

$jsonInput = json_decode(file_get_contents('php://input'), true);
$username = $_REQUEST['username'] ?? $jsonInput['username'] ?? '';
$password = $_REQUEST['password'] ?? $jsonInput['password'] ?? '';

if (empty($username) || empty($password)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Nom d\'utilisateur et mot de passe requis']);
    exit;
}

try {
    $pdo = getDbConnection();
    
    // Requête sur la table Utilisateurs avec jointure pour avoir le nom du site
    $query = "
        SELECT u.code_utilisateur, u.mot_de_passe, u.role, u.Nom, u.Prenom, u.SiteID, s.Nom_Site 
        FROM Utilisateurs u 
        LEFT JOIN Sites s ON u.SiteID = s.SiteID 
        WHERE u.code_utilisateur = ? 
        LIMIT 1
    ";
    
    $stmt = $pdo->prepare($query);
    $stmt->execute([$username]);
    
    if ($stmt->rowCount() > 0) {
        $user = $stmt->fetch();
        
        // Vérification du mot de passe
        // Note: En production, utiliser password_verify si les mots de passe sont hachés
        // Support pour mot de passe en texte clair (migration) et haché
        $passwordMatch = false;
        if ($user['mot_de_passe'] === $password) {
            $passwordMatch = true;
        } elseif (password_verify($password, $user['mot_de_passe'])) {
            $passwordMatch = true;
        } elseif (md5($password) === $user['mot_de_passe']) {
            // Support legacy MD5
            $passwordMatch = true;
        }
        
        if ($passwordMatch) {
            // Créer le token JWT
            $token = createJwtToken($user['code_utilisateur'], $user['role']);
            
            // Stocker la session
            if (session_status() === PHP_SESSION_NONE) {
                session_start();
            }
            $_SESSION['user_id'] = $user['code_utilisateur'];
            $_SESSION['user_role'] = $user['role'];
            $_SESSION['site_id'] = $user['SiteID'] ?? null;
            $_SESSION['authenticated'] = true;
            $_SESSION['login_time'] = time();
            
            // Journaliser la connexion
            logLogin($pdo, $user['code_utilisateur'], 'SUCCESS');
            
            echo json_encode([
                'success' => true, 
                'message' => 'Connexion réussie',
                'token' => $token,
                'user' => [
                    'id' => $user['code_utilisateur'],
                    'username' => $user['code_utilisateur'],
                    'role' => $user['role'],
                    'nom' => $user['Nom'],
                    'prenom' => $user['Prenom'],
                    'site_id' => $user['SiteID'],
                    'Nom_Site' => $user['Nom_Site']
                ]
            ]);
        } else {
            // Journaliser la tentative échouée
            logLogin($pdo, $user['code_utilisateur'], 'FAILED_PASSWORD');
            
            http_response_code(401);
            echo json_encode(['success' => false, 'message' => 'Mot de passe incorrect']);
        }
    } else {
        http_response_code(404);
        echo json_encode(['success' => false, 'message' => 'Utilisateur non trouvé']);
    }

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

function logLogin($pdo, $userId, $status) {
    try {
        $stmt = $pdo->prepare("
            INSERT INTO Journalisation (DateJournal, TimeJournal, OperateurID, Action, Details) 
            VALUES (?, ?, ?, ?, ?)
        ");
        $stmt->execute([
            date('Y-m-d'),
            date('H:i:s'),
            $userId,
            'LOGIN_API',
            "Statut: $status, IP: " . ($_SERVER['REMOTE_ADDR'] ?? 'unknown')
        ]);
    } catch (Exception $e) {
        // Ne pas bloquer si la journalisation échoue
    }
}
?>
