<?php
/**
 * API Sessions - Gestion des sessions utilisateurs
 * À placer dans le dossier apiggr sur cPanel
 * 
 * Endpoints:
 * - POST create: Créer une session
 * - POST check: Vérifier si une session est valide
 * - POST delete: Supprimer une session
 */

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit;
}

// Configuration base de données cPanel
$config = require_once __DIR__ . '/config/database.php';

$jsonInput = json_decode(file_get_contents('php://input'), true);
$action = $_POST['action'] ?? $jsonInput['action'] ?? $_GET['action'] ?? '';

try {
    $dsn = "mysql:host={$config['host']};dbname={$config['dbname']};charset={$config['charset']}";
    $pdo = new PDO($dsn, $config['user'], $config['pass'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'DB Connection failed: ' . $e->getMessage()]);
    exit;
}

switch ($action) {
    case 'create':
        createSession($pdo, $jsonInput);
        break;
    case 'check':
        checkSession($pdo, $jsonInput);
        break;
    case 'delete':
        deleteSession($pdo, $jsonInput);
        break;
    default:
        echo json_encode(['success' => false, 'message' => 'Action non reconnue']);
}

function createSession($pdo, $data) {
    $codeUtilisateur = $data['code_utilisateur'] ?? '';
    $jeton = $data['jeton'] ?? bin2hex(random_bytes(32));
    $ipAppareil = $data['ip_appareil'] ?? ($_SERVER['REMOTE_ADDR'] ?? '');
    $statut = $data['statut'] ?? 'ACTIVE';
    
    // Date d'expiration par défaut: 7 jours
    $dateCreation = date('Y-m-d H:i:s');
    $dateExpiration = date('Y-m-d H:i:s', strtotime('+7 days'));
    
    try {
        $stmt = $pdo->prepare("
            INSERT INTO Sessions (code_utilisateur, jeton, date_creation, date_expiration, ip_appareil, statut) 
            VALUES (?, ?, ?, ?, ?, ?)
        ");
        $stmt->execute([$codeUtilisateur, $jeton, $dateCreation, $dateExpiration, $ipAppareil, $statut]);
        
        echo json_encode([
            'success' => true,
            'message' => 'Session créée',
            'data' => [
                'jeton' => $jeton,
                'date_expiration' => $dateExpiration
            ]
        ]);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'message' => 'Erreur: ' . $e->getMessage()]);
    }
}

function checkSession($pdo, $data) {
    $codeUtilisateur = $data['code_utilisateur'] ?? '';
    
    try {
        $stmt = $pdo->prepare("
            SELECT * FROM Sessions 
            WHERE code_utilisateur = ? 
            AND statut = 'ACTIVE' 
            AND date_expiration > NOW()
        ");
        $stmt->execute([$codeUtilisateur]);
        $result = $stmt->fetchAll();
        
        if (count($result) > 0) {
            echo json_encode([
                'success' => true,
                'valid' => true,
                'data' => $result[0]
            ]);
        } else {
            echo json_encode([
                'success' => true,
                'valid' => false,
                'message' => 'Aucune session valide'
            ]);
        }
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'message' => 'Erreur: ' . $e->getMessage()]);
    }
}

function deleteSession($pdo, $data) {
    $codeUtilisateur = $data['code_utilisateur'] ?? '';
    $jeton = $data['jeton'] ?? null;
    
    try {
        if ($jeton) {
            // Supprimer une session spécifique
            $stmt = $pdo->prepare("
                UPDATE Sessions 
                SET statut = 'REVOQUEE' 
                WHERE code_utilisateur = ? AND jeton = ?
            ");
            $stmt->execute([$codeUtilisateur, $jeton]);
        } else {
            // Supprimer toutes les sessions de l'utilisateur
            $stmt = $pdo->prepare("
                UPDATE Sessions 
                SET statut = 'REVOQUEE' 
                WHERE code_utilisateur = ?
            ");
            $stmt->execute([$codeUtilisateur]);
        }
        
        echo json_encode([
            'success' => true,
            'message' => 'Session(s) supprimée(s)'
        ]);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'message' => 'Erreur: ' . $e->getMessage()]);
    }
}
?>