<?php
declare(strict_types=1);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

header('Content-Type: application/json; charset=UTF-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');

require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/xp_engine.php';
require_once __DIR__ . '/../includes/lesson_progress_engine.php';

function apiResponse(array $payload, int $status = 200): never
{
    http_response_code($status);

    echo json_encode(
        $payload,
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
    );

    exit;
}

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
    apiResponse(
        ['ok' => false, 'message' => 'Method not allowed.'],
        405
    );
}

if (empty($_SESSION['student_id'])) {
    apiResponse(
        ['ok' => false, 'message' => 'Student login required.'],
        401
    );
}

$raw = file_get_contents('php://input');
$input = json_decode(is_string($raw) ? $raw : '', true);

if (!is_array($input)) {
    $input = $_POST;
}

$studentId = (int)$_SESSION['student_id'];
$activityId = max(0, (int)($input['activity_id'] ?? 0));
$input['student_id'] = $studentId;

try {
    $pdo = getDbConnection();

    /*
     * Preview không lưu Activity Progress hoặc XP.
     * Vẫn trả về kết quả của XP Engine như trước.
     */
    $result = englishSpeakSaveActivityProgress($pdo, $input);

    /*
     * Sau khi Activity được lưu thành công, tính lại tiến độ Lesson
     * trực tiếp từ database. Các game đang dùng API này sẽ tự nhận
     * thêm lesson_progress mà không cần tự tính riêng.
     */
    if (
        ($result['ok'] ?? false) === true
        && ($result['preview'] ?? false) !== true
        && $activityId > 0
    ) {
        $activityLessonStmt = $pdo->prepare(
            'SELECT lesson_id FROM activities WHERE id = ? LIMIT 1'
        );
        $activityLessonStmt->execute([$activityId]);
        $activityLessonId = (int)($activityLessonStmt->fetchColumn() ?: 0);

        if ($activityLessonId > 0) {
            $result['lesson_progress'] =
                englishSpeakSyncLessonProgress(
                    $pdo,
                    $studentId,
                    $activityLessonId
                );
        }
    }

    apiResponse($result);
} catch (InvalidArgumentException $exception) {
    apiResponse(
        ['ok' => false, 'message' => $exception->getMessage()],
        422
    );
} catch (Throwable $exception) {
    error_log(
        'Shared Progress Engine error: '
        . $exception->getMessage()
    );

    apiResponse(
        ['ok' => false, 'message' => 'Could not save progress.'],
        500
    );
}
