<?php
/**
 * SniperX Front Controller — handles routing when .htaccess rewrites are unavailable.
 * Serves as index.php. All requests route through here.
 */

$requestUri = $_SERVER['REQUEST_URI'] ?? '/';
$path = parse_url($requestUri, PHP_URL_PATH);
$path = rtrim($path, '/') ?: '/';

// Static files and existing PHP files — let the server handle them
if (preg_match('/\.(js|css|svg|png|jpg|jpeg|ico|woff2|webp|json|txt)$/', $path)) {
    return false;
}

// API routes
$apiRoutes = [
    '/users' => 'api/users.php',
    '/strategies' => 'api/strategies.php',
    '/trades' => 'api/trades.php',
    '/copy-trades' => 'api/copy-trades.php',
    '/exchange-connections' => 'api/exchange-connections.php',
    '/memecoin-snipes' => 'api/snipes.php',
    '/dex-wallets' => 'api/dex-wallets.php',
    '/deposits' => 'api/deposits.php',
    '/cashouts' => 'api/cashouts.php',
    '/subscription-plans' => 'api/subscription-plans.php',
    '/user-subscriptions' => 'api/user-subscriptions.php',
    '/memecoins' => 'api/memecoins.php',
    '/memecoin-trades' => 'api/memecoin-trades.php',
    '/referrals' => 'api/referrals.php',
    '/creator-pools' => 'api/creator-pools.php',
    '/passphrases' => 'api/passphrases.php',
    '/deposit-wallets' => 'api/deposit-wallets.php',
    '/daily-profits' => 'api/daily-profits.php',
    '/performance-metrics' => 'api/performance-metrics.php',
    '/bot-action-logs' => 'api/bot-action-logs.php',
    '/wallet-memberships' => 'api/wallet-memberships.php',
];

// Match API routes with optional ID
foreach ($apiRoutes as $route => $file) {
    if ($path === $route) {
        require __DIR__ . '/' . $file;
        exit;
    }
    if (preg_match('#^' . preg_quote($route, '#') . '/([0-9]+)$#', $path, $m)) {
        $_GET['id'] = $m[1];
        require __DIR__ . '/' . $file;
        exit;
    }
    // Special: traders with /trades sub-route
    if ($route === '/api/traders' && preg_match('#^/api/traders/([0-9]+)/trades$#', $path, $m)) {
        $_GET['id'] = $m[1];
        $_GET['trades'] = '1';
        require __DIR__ . '/api/traders.php';
        exit;
    }
}

// Special API routes
if ($path === '/api/traders') {
    require __DIR__ . '/api/traders.php'; exit;
}
if (preg_match('#^/api/traders/([0-9]+)$#', $path, $m)) {
    $_GET['id'] = $m[1];
    require __DIR__ . '/api/traders.php'; exit;
}
if ($path === '/api/copy-trade-execute') {
    require __DIR__ . '/api/copy-trade-execute.php'; exit;
}
if ($path === '/admin/broadcast') {
    require __DIR__ . '/api/admin-broadcast.php'; exit;
}
if ($path === '/api/ai/chat') {
    require __DIR__ . '/api/ai/chat.php'; exit;
}
if ($path === '/api/get-price') {
    require __DIR__ . '/api/get-price.php'; exit;
}
if ($path === '/api/seed') {
    require __DIR__ . '/api/seed.php'; exit;
}
if ($path === '/telegram/webhook') {
    require __DIR__ . '/telegram-webhook.php'; exit;
}
if ($path === '/api/telegram/webhook') {
    require __DIR__ . '/api/telegram/webhook.php'; exit;
}
if ($path === '/auth/telegram-miniapp') {
    require __DIR__ . '/auth-telegram-miniapp.php'; exit;
}

// Page routes
$pages = [
    '/welcome' => 'welcome.php',
    '/home' => 'home.php',
    '/strategy' => 'strategy.php',
    '/copytrade' => 'copytrade.php',
    '/trade' => 'trade.php',
    '/deposit' => 'deposit.php',
    '/withdraw' => 'withdraw.php',
    '/settings' => 'settings.php',
    '/subscription' => 'subscription.php',
    '/snipe' => 'sniper.php',
    '/memecoin' => 'memecoin.php',
    '/pool' => 'pool.php',
    '/team' => 'team.php',
    '/admin' => 'admin.php',
    '/how-it-works' => 'how-it-works.php',
];

foreach ($pages as $route => $file) {
    if ($path === $route || preg_match('#^' . preg_quote($route, '#') . '/([0-9]+)$#', $path)) {
        require __DIR__ . '/' . $file;
        exit;
    }
}

// Legacy connect-wallet guard
if ($path === '/connect-wallet.php') {
    require __DIR__ . '/connect-wallet-guard.php'; exit;
}

// 404
http_response_code(404);
echo '<!DOCTYPE html><html><head><title>404 - SniperX</title></head><body style="font-family:sans-serif;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;background:#111;color:#fff;"><div style="text-align:center"><h1 style="font-size:4rem;margin:0">404</h1><p>Page not found</p><a href="/home" style="color:#3b82f6">Go to Dashboard</a></div></body></html>';
