<?php
/**
 * 简易路由器入口
 * 启动: php -S 0.0.0.0:8080 -t public public/index.php
 */
error_reporting(E_ALL);
ini_set('display_errors', '0');
date_default_timezone_set('Asia/Yangon');

$cfg = require __DIR__ . '/../api/config.php';

header('Access-Control-Allow-Origin: ' . ($cfg['cors_origin'] ?? '*'));
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

require_once __DIR__ . '/../api/lib/Db.php';
require_once __DIR__ . '/../api/lib/Response.php';
require_once __DIR__ . '/../api/lib/Auth.php';
require_once __DIR__ . '/../api/lib/AdminIpAllowService.php';
require_once __DIR__ . '/../api/lib/RateLimit.php';
require_once __DIR__ . '/../api/lib/GameService.php';
require_once __DIR__ . '/../api/lib/DockService.php';
require_once __DIR__ . '/../api/lib/NgService.php';
require_once __DIR__ . '/../api/lib/NgHttp.php';
require_once __DIR__ . '/../api/lib/AgService.php';
require_once __DIR__ . '/../api/lib/AgHttp.php';
require_once __DIR__ . '/../api/lib/VipService.php';
require_once __DIR__ . '/../api/lib/UsdtRecharge.php';
require_once __DIR__ . '/../api/lib/DingshengPay.php';
require_once __DIR__ . '/../api/lib/UpayPay.php';
require_once __DIR__ . '/../api/lib/OneCentPay.php';
require_once __DIR__ . '/../api/lib/ManualPayService.php';
require_once __DIR__ . '/../api/lib/InviteService.php';
require_once __DIR__ . '/../api/lib/UserPurgeService.php';
require_once __DIR__ . '/../api/lib/AgentService.php';
require_once __DIR__ . '/../api/lib/BonusService.php';
require_once __DIR__ . '/../api/lib/CheckinService.php';
require_once __DIR__ . '/../api/lib/DailyShareService.php';
require_once __DIR__ . '/../api/lib/ReportService.php';
require_once __DIR__ . '/../api/lib/AdminStaffService.php';
require_once __DIR__ . '/../api/lib/AdminTotp.php';
require_once __DIR__ . '/../api/lib/RebateService.php';
require_once __DIR__ . '/../api/lib/CsService.php';
require_once __DIR__ . '/../api/lib/HallService.php';
require_once __DIR__ . '/../api/lib/HallBotService.php';
require_once __DIR__ . '/../api/lib/TelegramNotify.php';
require_once __DIR__ . '/../api/lib/CaptchaService.php';
require_once __DIR__ . '/../api/lib/TurnstileService.php';
require_once __DIR__ . '/../api/lib/PresenceService.php';
require_once __DIR__ . '/../api/lib/AdminUserService.php';
require_once __DIR__ . '/../api/lib/GameWalletService.php';
require_once __DIR__ . '/../api/lib/UploadHelper.php';
require_once __DIR__ . '/../api/lib/GamesHttp.php';
require_once __DIR__ . '/../api/lib/AdminLotteryHttp.php';
require_once __DIR__ . '/../api/lib/RankService.php';
require_once __DIR__ . '/../api/lib/PublicHttp.php';
require_once __DIR__ . '/../api/lib/EntryService.php';
require_once __DIR__ . '/../api/lib/EntryHttp.php';
require_once __DIR__ . '/../api/lib/AuthHttp.php';
require_once __DIR__ . '/../api/lib/UserHttp.php';
require_once __DIR__ . '/../api/lib/LotteryHttp.php';
require_once __DIR__ . '/../api/lib/AdminStaffHttp.php';
require_once __DIR__ . '/../api/lib/AdminFinanceHttp.php';
require_once __DIR__ . '/../api/lib/AdminRebateHttp.php';
require_once __DIR__ . '/../api/lib/AdminUsersHttp.php';
require_once __DIR__ . '/../api/lib/AdminSystemHttp.php';
require_once __DIR__ . '/../api/lib/HallCsHttp.php';
require_once __DIR__ . '/../api/lib/KefuHttp.php';
require_once __DIR__ . '/../api/lib/FundDeskService.php';
require_once __DIR__ . '/../api/lib/FundDeskHttp.php';
require_once __DIR__ . '/../api/lib/AdminContentHttp.php';
require_once __DIR__ . '/../api/lib/InboxService.php';
require_once __DIR__ . '/../api/lib/InboxHttp.php';
require_once __DIR__ . '/../api/lib/ApiHelpers.php';
require_once __DIR__ . '/../api/lib/kg_games.php';
require_once __DIR__ . '/../api/lib/LotteryXyftService.php';
require_once __DIR__ . '/../api/lib/LotteryMarkSixService.php';
require_once __DIR__ . '/../api/lib/LotteryJnd28Service.php';
require_once __DIR__ . '/../api/lib/LotterySscService.php';
require_once __DIR__ . '/../api/lib/LotteryKlsfService.php';
require_once __DIR__ . '/../api/lib/LotteryLabubuService.php';
require_once __DIR__ . '/../api/lib/LotteryGachaService.php';
require_once __DIR__ . '/../api/lib/LotteryMinesService.php';
require_once __DIR__ . '/../api/lib/LotteryControlService.php';

try {
    $pdoBoot = Db::pdo();
    BonusService::ensureSchema($pdoBoot);
    HallService::ensureSchema($pdoBoot);
    UsdtRecharge::ensureSchema($pdoBoot);
    DingshengPay::ensureSchema($pdoBoot);
    CsService::ensureSchema($pdoBoot);
    FundDeskService::ensureSchema($pdoBoot);
    InviteService::ensureSchema($pdoBoot);
    AgentService::ensureSchema($pdoBoot);
    DailyShareService::ensureSchema($pdoBoot);
    AdminStaffService::ensureSchema($pdoBoot);
    RebateService::ensureTable($pdoBoot);
    VipService::ensureUserColumns($pdoBoot);
    Auth::ensureSessionVerColumn($pdoBoot);
    LotteryXyftService::ensureSchema($pdoBoot);
    LotteryMarkSixService::ensureSchema($pdoBoot);
    LotteryJnd28Service::ensureSchema($pdoBoot);
    LotterySscService::ensureSchema($pdoBoot);
    LotteryKlsfService::ensureSchema($pdoBoot);
    LotteryLabubuService::ensureSchema($pdoBoot);
    LotteryGachaService::ensureSchema($pdoBoot);
    LotteryMinesService::ensureSchema($pdoBoot);
    LotteryControlService::ensureSchema($pdoBoot);
    NgService::ensureSchema($pdoBoot);
    AgService::ensureSchema($pdoBoot);
} catch (Throwable $e) {
}

$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$base = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\');
if ($base && strpos($uri, $base) === 0) {
    $uri = substr($uri, strlen($base));
}
$uri = '/' . trim($uri, '/');
$method = $_SERVER['REQUEST_METHOD'];

$body = [];
$ct = $_SERVER['CONTENT_TYPE'] ?? $_SERVER['HTTP_CONTENT_TYPE'] ?? '';
// multipart 上传时不要读 php://input，否则部分环境下 $_FILES 会异常
if (stripos($ct, 'multipart/form-data') === false) {
    $raw = file_get_contents('php://input');
    if ($raw) {
        $json = json_decode($raw, true);
        if (is_array($json)) {
            $body = $json;
        }
    }
}
$body = array_merge($_POST, $body);

// 静态 uploads（支持子目录，防目录穿越）
if (preg_match('#^/uploads/(.+)$#', $uri, $m)) {
    $rel = str_replace('\\', '/', $m[1]);
    if (strpos($rel, '..') !== false) {
        http_response_code(400);
        exit('bad path');
    }
    $file = rtrim($cfg['upload_dir'], '/\\') . '/' . $rel;
    if (is_file($file)) {
        $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
        $types = ['png'=>'image/png','jpg'=>'image/jpeg','jpeg'=>'image/jpeg','gif'=>'image/gif','ico'=>'image/x-icon','webp'=>'image/webp','svg'=>'image/svg+xml'];
        header('Content-Type: ' . ($types[$ext] ?? 'application/octet-stream'));
        header('Cache-Control: public, max-age=86400');
        readfile($file);
        exit;
    }
    http_response_code(404);
    exit('not found');
}

try {
    route($method, $uri, $body);
} catch (Throwable $e) {
    Response::fail($e->getMessage(), 500, 500);
}

function route($method, $uri, $body)
{
    AdminStaffService::note($method, $uri, $body);
    AdminStaffService::guardWrite($method, $uri);
    AdminStaffService::guardPerm($uri);
    if (GamesHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AgHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (NgHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminLotteryHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (PublicHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (EntryHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AuthHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (UserHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (LotteryHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminStaffHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminFinanceHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminRebateHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminUsersHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminSystemHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (KefuHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (FundDeskHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (HallCsHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (InboxHttp::dispatch($method, $uri, $body)) {
        return;
    }
    if (AdminContentHttp::dispatch($method, $uri, $body)) {
        return;
    }
    Response::fail('接口不存在: ' . $method . ' ' . $uri, 404, 404);
}
