<?php
declare(strict_types=1);

/**
 * 落地页入口闸门（防扫 / 防爆红）
 *
 * 安装：
 * 1. 本目录文件上传到落地站根目录
 * 2. 原首页改名为 landing.html 或 landing.php
 * 3. 默认文档把 index.php 放第一
 *
 * 行为：
 * - 明确 Bot → HTTP 404（nginx 壳），不吐营销页
 * - 真人首次 → 404 挑战壳（跑 JS）→ Cookie 放行 → 真页
 * - 已放行 Cookie → 直接真页
 * - 打点：blocked / pass / reached → logs/cloak.jsonl（可选回传神盾）
 */

require __DIR__ . '/cloak_lib.php';

$landingCandidates = [
    __DIR__ . '/landing.html',
    __DIR__ . '/landing.php',
    __DIR__ . '/home.html',
    __DIR__ . '/index.html.bak',
];

$landing = null;
foreach ($landingCandidates as $path) {
    if (is_file($path)) {
        $landing = $path;
        break;
    }
}

LandingCloak::handleIntegrityProbe();

// 先兑自动切换交接令牌，再判断是否已放行。
// 硬 404 只拦「确定爬虫」；弱请求头 / 机房粗判绝不能直接 404——
// 生产已见 iPhone Safari + Private Relay/AWS 出口 + Accept:*/* 被误杀，
// 客户表现为一人一链/内部链接用一会突然跳 nginx 404。
LandingCloak::handleFailoverHandoff();

// 神盾同步的 IP 白名单（内部 VIP/办公出口）：直通真页，跳过硬 404 与挑战。
$allowlisted = LandingCloak::passAllowlistedClient();

$hasPass = $allowlisted || LandingCloak::hasValidPass();
if (!$hasPass && LandingCloak::isDefinitelyBot()) {
    LandingCloak::serveBlocked();
}

// 自动切换：已过挑战真人后台轮询本机 ?_lc_wd=1，子域爆红时切到健康子域
LandingCloak::handleWatchdog();

// JS 挑战通过后 POST 换 Cookie（优先于旧版 GET ?_lc=）
LandingCloak::handleChallengeIssue();

// 兼容旧版 ?_lc=ts.sig
LandingCloak::consumeChallengeQuery();

if (!$allowlisted && LandingCloak::CHALLENGE_ENABLED && !LandingCloak::hasValidPass()) {
    LandingCloak::serveChallenge();
}

if ($landing === null) {
    http_response_code(500);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Cloaking is active, but landing file was not found.\n";
    echo "Rename your real page to landing.html (or landing.php) in this folder.\n";
    exit;
}

LandingCloak::serveLanding($landing);
