<?php

function crmPublicGetRequestUri(): string
{
    foreach (['REQUEST_URI', 'REDIRECT_URL', 'HTTP_X_ORIGINAL_URI', 'ORIG_PATH_INFO'] as $key) {
        if (!empty($_SERVER[$key]) && is_string($_SERVER[$key])) {
            return $_SERVER[$key];
        }
    }

    return '';
}

function crmPublicDetectEndpoint(string $requestUri): ?string
{
    if (preg_match('#/crm/form-(widget-i18n|widget|config|submit|availability)(/|\?|$)#', $requestUri, $matches)) {
        return $matches[1];
    }

    if (preg_match('#/crm/sms-callback(/|\?|$)#', $requestUri)) {
        return 'sms-callback';
    }

    $endpoint = $_GET['crm_endpoint'] ?? '';
    if (is_string($endpoint) && preg_match('#^(widget-i18n|widget|config|submit|availability|sms-callback)$#', $endpoint)) {
        return $endpoint;
    }

    return null;
}

function crmAuthDetectEndpoint(string $requestUri): ?string
{
    if (preg_match('#/crm/form-(tariffs|pay)(/|\?|$)#', $requestUri, $matches)) {
        return $matches[1];
    }

    $endpoint = $_GET['crm_endpoint'] ?? '';
    if (is_string($endpoint) && preg_match('#^(tariffs|pay)$#', $endpoint)) {
        return $endpoint;
    }

    return null;
}

$requestUri = crmPublicGetRequestUri();
$crmEndpoint = crmPublicDetectEndpoint($requestUri);
$crmAuthEndpoint = crmAuthDetectEndpoint($requestUri);
$isCrmPublicFormApi = isset($_GET['crm']) && $crmEndpoint !== null;
$isCrmAuthFormApi = isset($_GET['crm']) && $crmAuthEndpoint !== null;

if ($isCrmAuthFormApi) {
    set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__));
    chdir(dirname(__FILE__));

    @ini_set('display_errors', '0');
    while (ob_get_level() > 0) {
        ob_end_clean();
    }

    require_once('./helpers/db.php');
    require_once('./helpers/init.php');

    @ini_set('display_errors', '0');
    @ini_set('display_startup_errors', '0');
    error_reporting(0);

    require_once('./config/loader.php');
    require_once(Config::Get('path.root.engine') . '/classes/Engine.class.php');
    require_once(Config::Get('path.root.engine') . '/classes/Action.class.php');

    ob_start();
    require_once(Config::Get('path.root.server') . '/classes/actions/ActionCrm.class.php');
    ob_end_clean();

    $oEngine = Engine::getInstance();
    $oEngine->Init();

    $crm = new ActionCrm($oEngine, 'crm');

    switch ($crmAuthEndpoint) {
        case 'tariffs':
            $crm->serveFormTariffs();
            break;
        case 'pay':
            $crm->serveFormPay();
            break;
        default:
            http_response_code(404);
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode(['success' => false, 'error' => 'CRM endpoint not found'], JSON_UNESCAPED_UNICODE);
            break;
    }

    exit;
}

if ($isCrmPublicFormApi) {
    set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__));
    chdir(dirname(__FILE__));

    @ini_set('display_errors', '0');
    while (ob_get_level() > 0) {
        ob_end_clean();
    }

    require_once('./helpers/db.php');
    require_once('./helpers/languages.php');
    require_once('./helpers/config.php');

    @ini_set('display_errors', '0');
    @ini_set('display_startup_errors', '0');
    error_reporting(0);

    require_once('./config/loader.php');
    require_once(Config::Get('path.root.engine') . '/classes/Engine.class.php');
    require_once(Config::Get('path.root.engine') . '/classes/Action.class.php');

    ob_start();
    require_once(Config::Get('path.root.server') . '/classes/actions/ActionCrm.class.php');
    ob_end_clean();

    $oEngine = Engine::getInstance();
    // Только Hook + Database — без Init(), Session, Viewer и плагинов
    $oEngine->LoadModule('ModuleHook', true);
    $oEngine->LoadModule('ModuleDatabase', true);

    $crm = new ActionCrm($oEngine, 'crm');

    switch ($crmEndpoint) {
        case 'widget':
            $crm->serveFormWidget();
            break;
        case 'config':
            $crm->serveFormConfig();
            break;
        case 'submit':
            $crm->serveFormSubmit();
            break;
        case 'availability':
            $crm->serveFormAvailability();
            break;
        case 'widget-i18n':
            $crm->serveFormWidgetI18n();
            break;
        case 'sms-callback':
            $crm->serveSmsCallback();
            break;
        default:
            http_response_code(404);
            header('Content-Type: text/plain; charset=utf-8');
            echo 'CRM endpoint not found';
            break;
    }

    exit;
}

require_once('helpers/init.php');

// Если сайт скрыт, выводим форму
if (LOCKSITE) require_once('helpers/lock_site.php');

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__));
chdir(dirname(__FILE__));

// Получаем объект конфигурации
require_once("./config/loader.php");
require_once(Config::Get('path.root.engine') . "/classes/Engine.class.php");

$oRouter = Router::getInstance();
$oRouter->Exec();
