<?php
/**
 * Ping-Pong Discipline Settings Endpoint
 * 
 * Endpoint: /administration/disciplines/ping-pong/settings (i inne dyscypliny)
 * Metody: GET (pobranie), POST (aktualizacja)
 * 
 * Wymaga: zalogowany użytkownik z rolą admin
 */

error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);

// Ustaw header JSON
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

// Obsługa preflight
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit(0);
}

// ===== BEZPIECZEŃSTWO =====
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/session_bootstrap.php';

// Sprawdzenie czy użytkownik jest zalogowany
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    http_response_code(401);
    echo json_encode([
        'success' => false,
        'error' => 'Unauthorized',
        'message' => 'You must be logged in'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// Sprawdzenie czy użytkownik ma rolę admina
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
    http_response_code(403);
    echo json_encode([
        'success' => false,
        'error' => 'Forbidden',
        'message' => 'Only administrators can access this endpoint'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// ===== BAZA DANYCH =====
// Ścieżki względem katalogu: administration/disciplines/ping-pong/settings
require_once __DIR__ . '/../../../includes/config.php';
require_once __DIR__ . '/../../../../api/DisciplineSettingsModel.php';
require_once __DIR__ . '/../../../../api/DisciplineSettingsService.php';

// ===== ROUTING =====
// Wydziel dyscyplinę z URL: /administration/disciplines/{discipline}/settings
// lub /administration/api/disciplines/{discipline}/settings (alternatywnie)

$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pathParts = array_filter(explode('/', $requestUri));

// Spróbuj znaleźć dyscyplinę w ścieżce
$discipline = null;
foreach (['ping-pong', 'rock-paper-scissors', 'table-football'] as $disc) {
    if (in_array($disc, $pathParts)) {
        $discipline = $disc;
        break;
    }
}

// Fallback: jeśli brak dyscypliny, domyślnie ping-pong
if (!$discipline) {
    $discipline = 'ping-pong';
}

// ===== INICJALIZACJA SERWISÓW =====
try {
    $model = new DisciplineSettingsModel($pdo);
    $service = new DisciplineSettingsService($model);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Database initialization error',
        'details' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// ===== ROUTING METOD =====
try {
    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
        handleGetSettings($service, $discipline);
    } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
        handlePostSettings($service, $discipline);
    } else {
        http_response_code(405);
        echo json_encode([
            'success' => false,
            'error' => 'Method Not Allowed',
            'message' => 'Only GET and POST methods are supported'
        ], JSON_UNESCAPED_UNICODE);
    }
} catch (InvalidArgumentException $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => 'Validation Error',
        'message' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
} catch (RuntimeException $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => 'Business Logic Error',
        'message' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Server Error',
        'message' => $e->getMessage()
    ], JSON_UNESCAPED_UNICODE);
}

// ===== OBSŁUGIWACZE METOD =====

/**
 * Obsługuje GET - pobranie ustawień
 * 
 * Query parameters:
 * - version: (opcjonalne) konkretna wersja ustawień
 * - snapshot: (opcjonalne) pobierz snapshot do startu meczu
 */
function handleGetSettings($service, $discipline)
{
    // Czy chcemy snapshot?
    $snapshot = isset($_GET['snapshot']) && $_GET['snapshot'] === 'true';
    $version = isset($_GET['version']) ? (int)$_GET['version'] : null;

    if ($snapshot) {
        $result = $service->getMatchSnapshot($discipline, $version);
        echo json_encode($result, JSON_UNESCAPED_UNICODE);
    } else {
        // Zwróć normalne ustawienia
        $settings = $service->getSettingsForAPI($discipline);
        echo json_encode([
            'success' => true,
            'data' => $settings
        ], JSON_UNESCAPED_UNICODE);
    }
}

/**
 * Obsługuje POST - aktualizacja ustawień
 * 
 * Body (JSON):
 * {
 *   "rules": {
 *     "pointsToWin": 11,
 *     "setsToWin": 3,
 *     "serveRotation": 2,
 *     "specialRules": "Deuce at 10-10..."
 *   },
 *   "customization": {
 *     "tableColor": "#2d5016",
 *     "ballColor": "#ff6600",
 *     ...
 *   }
 * }
 */
function handlePostSettings($service, $discipline)
{
    // Pobierz raw body
    $body = file_get_contents('php://input');
    
    // Dekoduj JSON
    $input = json_decode($body, true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new InvalidArgumentException('Invalid JSON: ' . json_last_error_msg());
    }

    if (!is_array($input)) {
        throw new InvalidArgumentException('Request body must be a JSON object');
    }

    // Sprawdź czy jest opcja reset
    if (isset($input['reset']) && $input['reset'] === true) {
        $userId = (int)($_SESSION['id'] ?? $_SESSION['user_id'] ?? 0);
        $result = $service->resetToDefaults($discipline, $userId);
        http_response_code(200);
        echo json_encode([
            'success' => true,
            'message' => "Ustawienia dla $discipline zostały przywrócone do domyślnych.",
            'data' => $result
        ], JSON_UNESCAPED_UNICODE);
        return;
    }

    // Normalnie: aktualizuj ustawienia
    $userId = (int)($_SESSION['id'] ?? $_SESSION['user_id'] ?? 0);
    $result = $service->validateAndUpdate($discipline, $input, $userId);

    http_response_code(200);
    echo json_encode([
        'success' => true,
        'message' => "Ustawienia dla $discipline zapisane.",
        'data' => $result
    ], JSON_UNESCAPED_UNICODE);
}
?>
