<? //edit_by_Fantych: 10.07.2024
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Main\Loader,
    Bitrix\Main\Web\Json,
    Bitrix\Main\Web\HttpClient;

if (LANGUAGE_ID === 'ru') {
    $MESS["ONLY_FOR_ADMIN"] = "Доступ разрешен только администраторам.";
    $MESS["STATUS_ERROR"] = "Ошибка подключения к серверу";
    $MESS["JSON_DECODING_ERROR"] = "Ошибка декодирования JSON";
    $MESS["FILE_PATH_ERROR"] = "Файл не найден на сервере";
    $MESS["FILE_DOWNLOAD_ERROR"] = "Не удалось скачать файл";
    $MESS["FILE_EXTRACT_ERROR"] = "Не удалось распаковать файл";
} elseif (LANGUAGE_ID === 'ua') {
    $MESS["ONLY_FOR_ADMIN"] = "Доступ дозволений лише адміністраторам.";
    $MESS["STATUS_ERROR"] = "Помилка підключення до сервера";
    $MESS["JSON_DECODING_ERROR"] = "Помилка декодування JSON";
    $MESS["FILE_PATH_ERROR"] = "Файл не знайдено на сервері";
    $MESS["FILE_DOWNLOAD_ERROR"] = "Не вдалося завантажити файл";
    $MESS["FILE_EXTRACT_ERROR"] = "Не вдалося розпакувати файл";
} else {
    $MESS["ONLY_FOR_ADMIN"] = "Only administrators are allowed access.";
    $MESS["STATUS_ERROR"] = "Error connecting to server";
    $MESS["JSON_DECODING_ERROR"] = "JSON decoding error";
    $MESS["FILE_PATH_ERROR"] = "The file was not found on the server";
    $MESS["FILE_DOWNLOAD_ERROR"] = "Failed to download file";
    $MESS["FILE_EXTRACT_ERROR"] = "Failed to extract file";
}


/**
 * @param $name
 * @return mixed
 */
function LocGetMessage($name)
{
    global $MESS;
    return $MESS[$name];
}

if (!$USER->IsAdmin()) die(LocGetMessage('ONLY_FOR_ADMIN'));

if (!class_exists('CArchiver'))
    require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/tar_gz.php');

$MID = "modulemarket.modulemarket";

?>
    <div class="main"><? echo dwnldModule($MID) ?></div>
<?
echo '<style>body{background-color:#000;font-size:18px}a{color:#ff0}.main{display:flex;flex-direction:column;height:100%;color:#fff;align-items:center;justify-content:center}</style>';

function dwnldModule($MID)
{
    $error = '';
    $MID_DIR = $_SERVER['DOCUMENT_ROOT'] . BX_ROOT . '/modules';
    $redirecUrl = BX_ROOT . '/admin/modulemarket.modulemarket_main.php';
    $installUrl = BX_ROOT . '/admin/partner_modules.php?id=' . $MID . '&lang=' . LANGUAGE_ID . '&install=Y&' . bitrix_sessid_get();

    if (is_dir($MID_DIR . '/' . $MID) && Loader::includeModule("modulemarket.modulemarket"))
        LocalRedirect($redirecUrl);

    $SERVER_NAME = 'https://bxproger.com';

    $postData = [
        "moduleget" => $MID,
        "stable" => $_REQUEST["stable"],
        "utm_medium" => "fmm_installer",
        "utm_source" => "http_referer",
        "SERVER_NAME" => urlencode($_SERVER["SERVER_NAME"]),
        "HTTP_HOST" => urlencode($_SERVER["HTTP_HOST"]),
    ];

    $app = Bitrix\Main\Application::getInstance();
    if (method_exists($app, "getLicense")) {
        $license = $app->getLicense();
        if (method_exists($license, "getPublicHashKey"))
            $postData["LICENSE_KEY"] = $license->getPublicHashKey();
    }


    // Инициализация HttpClient
    $httpClient = new HttpClient();
    $response = $httpClient->post(
        $SERVER_NAME . "/local/api/modulemarket.architector/v1.1/getList.php?lang=" . LANGUAGE_ID,
        $postData
    );

    $status = $httpClient->getStatus();

    // STATUS
    if ($status !== 200)
        $error .= LocGetMessage("STATUS_ERROR") . ': ' . $status;

    // JSON DECODING
    if ($error == "") {
        try {
            $arResult = Json::decode($response);
        } catch (\Bitrix\Main\ArgumentException $e) {
            $error .= LocGetMessage("JSON_DECODING_ERROR") . ': ' . $e->getMessage();
        }
    }

    $mmPath = $arResult["items"]["modulemarket.modulemarket"]["last_version"]["path"];
    if ($mmPath == "" && $error == "")
        $error .= LocGetMessage("FILE_PATH_ERROR");

    if ($error == "") {
        $remoteFile = $SERVER_NAME . $mmPath;
        $tmp = CFile::getTempName('', bx_basename(urldecode($remoteFile)));

        if (!$httpClient->download($remoteFile, $tmp))
            $error .= LocGetMessage("FILE_DOWNLOAD_ERROR");
    }

    if ($error == "") {
        $oArchiver = new CArchiver($tmp);
        $oArchiver->SetOptions(["CHECK_PERMISSIONS" => false]);
        if (!$oArchiver->extractFiles($MID_DIR))
            $error .= LocGetMessage("FILE_EXTRACT_ERROR");
    }

    if ($error == "") {
        if (is_dir($tmp = $MID_DIR . "/.last_version"))
            rename($tmp, str_replace(".last_version", $MID, $tmp));
        //$errorors = &$oArchiver->GetErrors();

        if (is_dir($MID_DIR . '/' . $MID))
            LocalRedirect($installUrl);

    }

    return $error;

}