<?php

use Bitrix\Main\Application;
use Bitrix\Main\Loader;
use Bitrix\Main\Web\PostDecodeFilter;
use Bitrix\Sale\Order;
use Bitrix\Sale\Registry;

const STOP_STATISTICS = true;
const NO_KEEP_STATISTIC = 'Y';
const NO_AGENT_STATISTIC = 'Y';
const DisableEventsCheck = true;
const BX_SECURITY_SHOW_MESSAGE = true;
const NOT_CHECK_PERMISSIONS = true;

$siteId = isset($_REQUEST['SITE_ID']) && is_string($_REQUEST['SITE_ID']) ? $_REQUEST['SITE_ID'] : '';
$siteId = mb_substr(preg_replace('/[^a-z0-9_]/i', '', $siteId), 0, 2);

if (!empty($siteId) && is_string($siteId)) {
    define('SITE_ID', $siteId);
}

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

$request = Application::getInstance()->getContext()->getRequest();
$request->addFilter(new PostDecodeFilter);

if (!check_bitrix_sessid() || !$request->isPost()) {
    CHTTP::SetStatus('403 Forbidden');
    die();
}

$orderData = $request->get('orderData');
$templateName = $request->get('templateName');

if(empty($templateName)) {
    $templateName = '';
}

Loader::includeModule('sale');

$accountNumber = (string)($orderData['order'] ?? '');

if ($accountNumber === '') {
    CHTTP::SetStatus('403 Forbidden');
    die();
}

$registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);
/** @var Order $orderClass*/
$orderClass = $registry->getOrderClassName();
/** @var Order|false $order */
$order = $orderClass::loadByAccountNumber($accountNumber);

if (!$order) {
    CHTTP::SetStatus('404 Not Found');
    die();
}

global $USER;

$allowed = false;

if ($USER->IsAuthorized() && $order->getUserId() === (int)$USER->GetID()) {
    $allowed = true;
}

$access = (string)($request->get('access') ?? $orderData['access'] ?? '');

if (
    !$allowed &&
    $access !== '' &&
    $order->getHash() === $access &&
    \Bitrix\Sale\Helpers\Order::isAllowGuestView($order)
) {
    $allowed = true;
}

if (!$allowed && $USER->IsAdmin()) {
    $allowed = true;
}

if (!$allowed) {
    CHTTP::SetStatus('403 Forbidden');
    die();
}

$paymentNumber = (string)($orderData['payment'] ?? '');
$payment = null;

foreach ($order->getPaymentCollection() as $item) {
    if ((string)$item->getField('ACCOUNT_NUMBER') === $paymentNumber) {
        $payment = $item;
        break;
    }
}

if (empty($payment)) {
    CHTTP::SetStatus('404 Not Found');
    die();
}

$params['ACCOUNT_NUMBER'] = $orderData['order'];
$params['PAYMENT_NUMBER'] = $orderData['payment'];
$params['PATH_TO_PAYMENT'] = $orderData['path_to_payment'] <> '' ? htmlspecialcharsbx($orderData['path_to_payment']) : '';
$params['REFRESH_PRICES'] = ($orderData['refresh_prices'] === 'Y') ? 'Y' : 'N';
$params['RETURN_URL'] = $orderData['returnUrl'] ?? '';

if (CBXFeatures::IsFeatureEnabled('SaleAccounts')) {
    $params['ALLOW_INNER'] = $orderData['allow_inner'];
    $params['ONLY_INNER_FULL'] = $orderData['only_inner_full'];
} else {
    $params['ALLOW_INNER'] = 'N';
    $params['ONLY_INNER_FULL'] = 'Y';
}

CBitrixComponent::includeComponentClass('bitrix:sale.order.payment.change');

$orderPayment = new SaleOrderPaymentChange();
$orderPayment->initComponent('bitrix:sale.order.payment.change', 'template.1');
$orderPayment->includeComponent('template.1', $params, null);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php');
