<?php

declare(strict_types=1);

use yii;
use yii\bootstrap\ActiveForm;

use app\models\AccountEdgeOrder;
use app\models\Order;
use app\models\OrderEdgeSupply;
use app\models\Settings;

use moonland\phpexcel\Excel;

// Инициализация открытой панели
if (empty($window)) {
    if (
        !yii::$app->user->isGuest
        && yii::$app->user->identity->type === 'administrator'
        || yii::$app->user->identity->type === 'moderator'
    ) {

        $window ?? $window = 'orders_panel_moderation';
    } else {
        $window ?? $window = 'orders_panel_orders';
    }
}

?>

<link href="/css/pages/orders.css" rel="stylesheet">
<link href="/css/datepicker.css" rel="stylesheet">

<div id="page_orders" class="container mb-auto py-3">
    <?php if ($account_type = (!yii::$app->user->isGuest
        && yii::$app->user->identity->type === 'administrator'
        || yii::$app->user->identity->type === 'moderator')) : ?>
        <div class="orders_panel_menu mb-2">
            <label class="btn button_white mb-0 mr-2" for="orders_panel_moderation">Модерация</label>
            <label class="btn button_white mb-0" for="orders_panel_orders">Мои заказы</label>
        </div>
        <input type="radio" id="orders_panel_moderation" name="main_panel" <?= $window === 'orders_panel_moderation' ? 'checked' : null ?> />
        <article id="orders_panel_moderation_list">
            <div class="orders_panel_moderation_menu mb-3">
                <label class="btn btn-sm button_white mb-0" onclick="return orders_read('@last', '@all', null, null, 'orders_panel_moderation');">Все</label>
                <?php foreach(Order::statusListInRussian() as $id => $label) : ?>
                    <label class="btn btn-sm button_white mb-0 ml-2" onclick="return orders_read('@last', '<?= $id ?>', null, null, 'orders_panel_moderation');"><?= $label ?></label>
                <?php endforeach ?>
            </div>
        </article>

        <input type="radio" id="orders_panel_orders" name="main_panel" <?= $window === 'orders_panel_orders' ? 'checked' : null ?> />
    <?php endif ?>

    <article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>">
        <div class="row mt-2 mb-3">
            <h4 class="col-auto mx-auto mb-0">Заказы</h4>
        </div>
        <div class="row mb-3">
            <div class="col-auto orders_panel_menu mx-auto">
                <a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', '@all');">Все</a>
                <?php foreach(Order::statusListInRussian() as $id => $label) : ?>
                    <a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', '<?= $id ?>');"><?= $label ?></a>
                <?php endforeach ?>
            </div>
        </div>
        <div class="row mb-4 px-3">
            <div class="col-3 p-0 form-control form-control-sm d-flex align-items-center">
                <i id="orders_search_line_icon" class="ml-2 fas fa-search"></i><input id="orders_search_line" type="text" class="h-100 pr-3 my-auto form_clean_full" value="<?= $search ?? null ?>" placeholder="Номер запчасти" oninput="$('#orders_search_line').dropdown('hide'); return orders_read(this.value);" data-toggle="dropdown" aria-expanded="false" autocomplete="off">
                <?php
                // Сделать системные настройки и по ним работать
                $orders_search_panel = $panel ?? yii::$app->controller->renderPartial('/orders/search/panel', ['history' => true]);

                echo <<<HTML
                    <div id="orders_search_line_window" class="dropdown-menu w-100" aria-labelledby="orders_search_line">
                        $orders_search_panel
                    </div>
                HTML;
                ?>
            </div>
            <small class="ml-auto d-flex">
                <a class="btn btn-sm button_white button_clean mb-0 mr-2 l" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 86400 ?>', '<?= time() ?>');">День</a>
                <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 604800 ?>', '<?= time() ?>');">Неделя</a>
                <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 2592000 ?>', '<?= time() ?>');">Месяц</a>
                <a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 31536000 ?>', '<?= time() ?>');">Год</a>
            </small>
            <div class="col-auto ml-2 w-auto form-control form-control-sm">
                <input id="orders_period_calendar" class="pl-0 h-100 form_clean_full text-center" type="text" /><i class="ml-2 fas fa-calendar-alt my-auto"></i>
            </div>
        </div>
        <div class="col mb-2 list rounded">
            <div class="row py-3 text-center">
                <span class="col-2"><b>Артикул</b></span>
                <span class="col-3"><b>Статус</b></span>
                <span class="col-3"><b>Поступление</b></span>
                <span class="col-2"><b>Количество</b></span>
                <span class="col-2"><b>Стоимость</b></span>
            </div>
            <?php

            if (!empty($data)) {
                // Найдена информация о заказах

                foreach ($data as $data) {
                    // Перебор заказов

                    // Инициализация ребра: АККАУНТ -> ЗАКАЗ
                    $account_edge_order = AccountEdgeOrder::searchByOrder($data['order']->readId())[0];

                    if (isset($account_edge_order->stts) && ($account_edge_order['stts'] === 'reserved' || $account_edge_order->stts === 'current')) {
                        // Заказ был резервирован (отменён) или это активный заказ (несформированный, в корзине)

                        continue;
                    }

                    // Инициализация времени подтверждения заказа
                    if (isset($data['order']->jrnl)) {
                        // Найден журнал

                        foreach ($data['order']->jrnl as $entry) {
                            // Перебор записей в журнале

                            if ($entry['action'] === 'accepted') {
                                // Найден принятый заказ

                                // Инициализация часового пояса
                                preg_match_all('/UTC([\+\-0-9:]*)/', $account->zone ?? Settings::searchActive()['timezone_default'] ?? 'UTC+3', $timezone);
                                $timezone = $timezone[1][0];

                                // Запись данных о дате заказа
                                $date = (new DateTime())->setTimestamp($entry['date'])->setTimezone(new DateTimeZone($timezone))->format('H:i d.m.Y');
                            }
                        }
                    }

                    // Инициализация значения по умолчанию
                    $date ?? $date = 'Ожидается';

                    // Инициализация буфера поставок
                    $supplies_html = '';

                    // Инициализация общей стоимости поставок
                    $sum = 0;

                    if (isset($data['supplies'])) {
                        // Найдены поставки

                        // Инициализация максимального срока доставки поставок
                        $delivery_max = 0;

                        // Инициализация общего количества поставок
                        $amount_max = 0;

                        // Инициализация поставок
                        foreach ($data['supplies'] as $prod => $list) {
                            // Перебор поставок
                            foreach ($list as $catn => $deliveries) {
                                // Перебор доставок
                                foreach ($deliveries as $delivery => $supply) {
                                    // Перебор заказов

                                    if ($order_edge_supply = OrderEdgeSupply::searchBySupplyData((string) $catn, (string) $prod, (string) $delivery, $data['order'])) {
                                        // Удалось найти рёбра: ЗАКАЗ -> ПОСТАВКА

                                        // Инициализация цены
                                        $price_raw = $order_edge_supply[0]->cost ?? $supply['cost'] ?? 0;

                                        if ($supply['amount'] > 0) {
                                            // Пройдена проверка на количество поставок в заказе

                                            // Инициализация цены
                                            $price = $price_raw * $supply['amount'] . ' ' . $supply['currency'];

                                                // Инициализация доставки
                                                if (empty($time = $order_edge_supply[0]->time)) {
                                                    // Не найден срок доставки (в днях)

                                                    // if (empty($order_edge_supply[0]->dlvr['data'])) {
                                                    //     // Не удалось рассчитать доставку

                                                    //     // Инициализация времени
                                                    //     $time = 0;
                                                    // } else {
                                                    //     // Удалось рассчитать доставку

                                                    //     // Инициализация даты отправки
                                                    //     try {
                                                    //         // Взять данные из "arrivalToOspSender" (Дата прибытия на терминал-отправитель)

                                                    //         $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspSender'])->getTimestamp();
                                                    //     } catch (Throwable $e) {
                                                    //         // Взять данные из "pickup" (Дата передачи груза на адресе отправителя)

                                                    //         $delivery_send_date = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['pickup'])->getTimestamp();
                                                    //     }

                                                    //     // Инициализация времени доставки
                                                    //     try {
                                                    //         // Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)

                                                    //         // Оставлено на всякий случай для дальнейших разбирательств

                                                    //         $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $order_edge_supply[0]->dlvr['data']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
                                                    //     } catch (Throwable $e) {
                                                    //         // Инициализация даты отправки

                                                    //         // Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)
                                                    //         $delivery_converted = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
                                                    //     }
                                                    //     $time = ceil(($delivery_converted - ($delivery_send_date ?? 0)) / 60 / 60 / 24);
                                                    // }

                                                    if (empty($order_edge_supply[0]->dlvr['data'])) {
                                                        // Не удалось рассчитать доставку

                                                        // Инициализация времени
                                                        $time = 0;
                                                    } else {
                                                        // Удалось рассчитать доставку

                                                        preg_match_all('/UTC([\+\-0-9:]*)/', $account->zone ?? Settings::searchActive()['timezone_default'] ?? 'UTC+3', $timezone);
                                                        $timezone = $timezone[1][0];

                                                        // Инициализация времени доставки
                                                        try {
                                                            // Доставка по воздуху (подразумевается), данные из "giveoutFromOspReceiver" (Дата и время, с которого груз готов к выдаче на терминале)

                                                            // Оставлено на всякий случай для дальнейших разбирательств

                                                            $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $order_edge_supply[0]->dlvr['data']['orderDates']['giveoutFromOspReceiver'])->setTimezone(new DateTimeZone($timezone))->format('d.m.Y');
                                                        } catch (Throwable $e) {
                                                            // Инициализация даты отправки

                                                            $delivery_converted = DateTime::createFromFormat('Y-m-d', $order_edge_supply[0]->dlvr['data']['orderDates']['arrivalToOspReceiver'])->setTimezone(new DateTimeZone($timezone))->format('d.m.Y');
                                                        }
                                                        $time = $delivery_converted;
                                                    }
                                                }

                                            // Инициализация статуса связи поставки
                                            $status = Order::statusToRussian($order_edge_supply[0]->stts ?? 'Обрабатывается');

                                            // Инициализация класса для поставки (если необходимо)
                                            $css = match ($order_edge_supply[0]->stts ?? '') {
                                                'accepted' => ' supply_accepted',
                                                default => ''
                                            };

                                            // Реинициализация максимальной даты доставки
                                            if ($delivery_max < $time) $delivery_max = $time;

                                            // Добавление к общему счётчику количества
                                            $amount_max += $supply['amount'];

                                            // Инициализация иконки
                                            $icon = $delivery === 'avia' ? 'fa-plane' : 'fa-truck';

                                            // Генерация HTML (пробела между supply и $css не должно быть)
                                            $supplies_html .= <<<HTML
                                                <div class="row py-2 supply$css text-center">
                                                    <div class="m-auto col-2">{$catn}</div>
                                                    <small class="m-auto col-3">$status</small>
                                                    <div class="m-auto col-3">$time <small class="mr-1 fas $icon"></small></div>
                                                    <div class="m-auto col-2">{$supply['amount']}</div>
                                                    <div class="m-auto col-2">$price</div>
                                                </div>
                                            HTML;

                                            // Инициализация общей цены
                                            $sum += $price_raw * $supply['amount'];
                                        }
                                    }
                                }
                            }

                        }
                    }

                    // Инициализация статуса заказа
                    $status = Order::statusToRussian($account_edge_order->stts);

                    // Инициализация счета для скачивания
                    $invoice = <<<HTML
                        <a class="text-dark" href="/invoices/{$data['order']->_key}/download"><i class="mr-1 fas fa-file-invoice-dollar"></i><small><b>Счёт</b></small></a>
                    HTML;

                    echo <<<HTML
                        $supplies_html
                        <div class="row py-2 cart_list_target_total text-center">
                            <div class="col-2">$invoice</div>
                            <div class="col-3"><b>$status</b></div>
                            <div class="col-3"><b>$delivery_max <small><b>(макс.)</b></small></b></div>
                            <div class="col-2"><b>$amount_max <small><b>(макс.)</b></small></b></div>
                            <div class="col-2"><b>$sum <small><b>руб</b></small></b></div>
                        </div>
                    HTML;
                }
            } else {
                echo <<<HTML
                    <div class="row py-2 cart_list_target">
                        <div class="mx-auto py-2">
                            Заказов нет
                        </div>
                    </div>
                HTML;
            }
            ?>
        </div>
    </article>
</div>

<script src="/js/orders.js" defer></script>
<script src="/js/calendar/datepicker.js" defer></script>
<script>
    // Инициализация индикатора готовности календаря
    orders_calendar_ready = false;

    <?php
    preg_match_all('/UTC([\+\-0-9:]*)/', $account->zone ?? Settings::searchActive()['timezone_default'] ?? 'UTC+3', $timezone);
    $timezone = $timezone[1][0];
    ?>

    if (document.readyState === "complete") {
        // Документ загружен

        // Инициализация календаря
        $('#orders_period_calendar').datepicker({
            firstDay: 1,
            dateFormat: 'yyyy-mm-dd',
            toggleSelected: false,
            maxDate: new Date(),
            range: true,
            multipleDatesSeparator: ' - ',
            onSelect: orders_calendar_select
        });

        $('#orders_period_calendar').data('datepicker').selectDate([new Date('<?= $from ?? (new DateTime())->setTimestamp(time() - 604800)->setTimezone(new DateTimeZone($timezone))->format('Y-m-d') ?>'), new Date('<?= $to ?? (new DateTime('now', new DateTimeZone($timezone)))->format('Y-m-d') ?>')]);

        // Активация календаря
        orders_calendar_ready = true;
    } else {
        // Документ не загружен

        // Обработчик события загрузки документа
        document.addEventListener('DOMContentLoaded', function() {
            // Обработчик события инициализации

            // Инициализация календаря
            $('#orders_period_calendar').datepicker({
                firstDay: 1,
                dateFormat: 'yyyy-mm-dd',
                toggleSelected: false,
                maxDate: new Date(),
                range: true,
                multipleDatesSeparator: ' - ',
                onSelect: orders_calendar_select
            });

            $('#orders_period_calendar').data('datepicker').selectDate([new Date('<?= $from ?? (new DateTime())->setTimestamp(time() - 604800)->setTimezone(new DateTimeZone($timezone))->format('Y-m-d') ?>'), new Date('<?= $to ?? (new DateTime('now', new DateTimeZone($timezone)))->format('Y-m-d') ?>')]);

            // Активация календаря
            orders_calendar_ready = true;
        }, false);
    };
</script>
<?php if (
    !yii::$app->user->isGuest
    && (yii::$app->user->identity->type === 'administrator'
        || yii::$app->user->identity->type === 'moderator')
) : ?>
    <script src="/js/orders_panel.js" defer></script>
    <script>
    document.addEventListener('orders_panel.loaded', function(e) {
        // Загружена программа для работы с заказами

        // Инициализация списка аналогов
        order_init_list(8, 1);
    });
    </script>
<?php endif ?>
