<?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>
            <div class="orders_panel_moderation_menu mb-3">
                <label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_all">Все</label>
                <label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_requested">Запрошены</label>
                <label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_handled">Обрабатываются</label>
                <label class="btn btn-sm button_white mb-0" for="orders_panel_moderation_completed">Завершены</label>
            </div>
            <?php if (!empty($moderator_orders)) : ?>

                <?php foreach ($moderator_orders as $order) : ?>
                    <div id="<?= $order['order']['_key'] ?>_panel" class="page_order_panel mb-3 py-3 px-4 rounded">
                        <h5 class="row mt-1 mb-3">
                            <?php
                            // Инициализация времени отправки заказа
                            $date = null;

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

                                if ($entry['action'] === 'requested') {
                                    // Найдена запись со временем запроса заказа

                                    if (empty($date) || $date <= $entry['date']) {
                                        // Буфер не инициализирован или в него записано более старое событие

                                        // Запись в буфер
                                        $date = $entry['date'];
                                    }
                                }
                            }

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

                            // Конвертация данных из буфера
                            $date = [
                                'H:i' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('H:i'),
                                'm.d.Y' => (new DateTime())->setTimestamp($date)->setTimezone(new DateTimeZone($timezone))->format('m.d.Y')
                            ];

                            ?>
                            <p class="col-auto ml-1 font-weight-bold">#<?= $order['order']['_key'] ?></p>
                            <p class="col-auto mr-1 font-weight-bold">
                                <span class="mr-2"><?= $date['H:i'] ?? 'Неизвестно' ?></span>
                                <span><?= $date['m.d.Y'] ?? 'Неизвестно' ?></span>
                            </p>
                        </h5>
                        <div class="dropdown-divider mb-3"></div>
                        <div class="row px-2">
                            <div id="orders_panel_supplies_<?= $order['order']['_key'] ?>" class="col-3 unselectable">
                                <?php if (!empty($order['supplies'])) : ?>
                                    <?php
                                    // Инициализация счетчика поставок для отрисовки горизонтального разделителя
                                    $count = 1;
                                    ?>

                                    <?php foreach ($order['supplies'] as $supply) :
                                        // Перебор поставок
                                    ?>

                                        <?php
                                        // Инициализация окружения
                                        extract($supply);

                                        // Инициализация обложки
                                        $covr = null;

                                        foreach ($imgs ?? [] as $img) {
                                            // Перебор изображений для обложки

                                            if ($img['covr'] ?? false) {
                                                // Обложка найдена

                                                $covr = $img['h150'];

                                                break;
                                            }
                                        }

                                        if (is_null($covr)) {
                                            // Обложка не инициализирована

                                            if (!$covr = $imgs[0]['h150'] ?? false) {
                                                // Не удалось использовать первое изображение как обложку

                                                // Запись обложки по умолчанию
                                                $covr = '/img/covers/h150/product.png';
                                            }
                                        }

                                        if ($amount['auto'] > 0) {
                                            // Найдены поставки с автоматической доставкой

                                            if (Order::checkSuppliesStts($order_edge_supply)) {
                                                $status = '<span id="' . $supply['catn'] . '_auto_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span>';
                                            } else {
                                                $status = '';
                                            }

                                            // Генерация HTML
                                            echo <<<HTML
                                                <a id="{$supply['catn']}_auto_supply" class="row mb-2 p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('{$supply['catn']}_auto', {$order['order']['_key']});">
                                                    <img class="col-auto px-0 h-100 img-fluid rounded" src="$covr" />
                                                    <p id="{$supply['catn']}_auto_supply_stts_indicator" class="col d-flex text-dark">
                                                        {$product['catn']} x{$amount['auto']}
                                                        <small class="ml-2 my-auto fas fa-truck"></small>
                                                        $status
                                                    </p>
                                                </a>
                                            HTML;
                                        }

                                        if ($amount['avia'] > 0) {
                                            // Найдены поставки с автоматической доставкой

                                            if (Order::checkSuppliesStts($order_edge_supply)) {
                                                $status = '<span id="' . $supply['catn'] . '_avia_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span>';
                                            } else {
                                                $status = '';
                                            }

                                            // Генерация HTML
                                            echo <<<HTML
                                                <a id="{$supply['catn']}_avia_supply" class="row mb-2 p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('{$supply['catn']}_avia', {$order['order']['_key']});">
                                                    <img class="col-auto px-0 h-100 img-fluid rounded" src="$covr" />
                                                    <p id="{$supply['catn']}_avia_supply_stts_indicator" class="col d-flex text-dark">
                                                        {$product['catn']} x{$amount['avia']}
                                                        <small class="ml-2 my-auto fas fa-plane"></small>
                                                        $status
                                                    </p>
                                                </a>
                                            HTML;
                                        }

                                        ?>

                                        <?php if ($count++ < count($order['supplies'])) : ?>
                                            <div class="dropdown-divider mb-2"></div>
                                        <?php endif ?>
                                    <?php endforeach ?>
                                <?php else : ?>
                                    <div class="row">
                                        <p>Поставки не найдены</p>
                                    </div>
                                <?php endif ?>
                            </div>
                            <div id="orders_panel_edit_<?= $order['order']['_key'] ?>" class="px-4 col-6 d-flex flex-column">
                                <p class="my-auto">Выберите поставку</p>
                            </div>
                            <div id="orders_panel_info_<?= $order['order']['_key'] ?>" class="col-3 d-flex flex-column">

                                <?php
                                // Конвертация статуса заказа
                                $status = match ($order['account_edge_order'][0]['type']) {
                                    'requested' => 'Запрошен',
                                    'handled' => 'Обрабатывается',
                                    'completed' => 'Завершен',
                                }
                                ?>

                                <p class="row mt-0 mb-3 px-2"><b>Статус:</b> <span class="ml-auto"><?= $status ?></span></p>
                                <a id="<?= $order['order']['_key'] ?>_button" class="row mt-auto mb-0 text-center text-white btn button_blue button_clean disabled" type="button" onclick="return order_accept('<?= $order['order']['_key'] ?>');">Подтвердить</a>
                            </div>
                        </div>
                        <script defer>
                            document.addEventListener(
                                'DOMContentLoaded',
                                function() {

                                    order_init('<?= $order['order']['_key'] ?>');
                                },
                                false
                            );
                        </script>
                    </div>
                <?php endforeach ?>
            <?php else : ?>
                <div class="page_order_panel py-3 px-4 rounded">
                    <p class="text-center">Заказов нет</p>
                </div>
            <?php endif ?>
        </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-2">
            <h4 class="col ml-4"><i class="fas fa-list mr-2"></i>Заказы</h4>
            <div class="col-auto orders_panel_menu ml-auto text-right">
                <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>
                <a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'requested');">Запрошенные</a>
                <a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'accepted');">Активные</a>
                <a class="btn btn-sm button_white button_clean font-weight-bold mb-0" type="button" onclick="return orders_read('@last', 'completed');">Завершенные</a>
            </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-4 list rounded">
            <div class="row py-3 text-center">
                <!-- <div class="pl-3 mr-1">
                    <input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" />
                </div> -->
                <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 (isset($orders) && !empty($orders)) {
                foreach ($orders as $order) {
                    // Перебор заказов

                    // Инициализация
                    extract($order);

                    if (isset($order['stts']) && $order['stts'] === 'reserved') {
                        // Заказ был резервирован (отменён)

                        continue;
                    }

                    // Пропуск активного заказа (несформированного, корзины)
                    if ($account_edge_order[0]['type'] === 'current') continue;

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

                        foreach ($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($supplies)) {
                        // Найдены поставки

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

                        // Инициализация поставок
                        foreach ($supplies as $supply) {
                            // Перебор поставок

                            // Инициализация переменных
                            extract($supply);

                            // Инициализация цены
                            $price_raw = $cost;

                            // Инициализация комментария
                            $comment = $order_edge_supply['comm'] ?? 'Комментарий к заказу';

                            if ($amount['auto'] > 0) {
                                // Найдены поставки с автоматической доставкой

                                // Инициализация цены
                                $price_auto = $price_raw['auto'] . ' ' . $currency;

                                // Инициализация доставки
                                if (!isset($delivery) || (isset($delivery['auto'], $delivery['auto']['error']) || $delivery === '?')) {
                                    // Не удалось рассчитать доставку

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

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

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

                                        $delivery_auto_send_date = DateTime::createFromFormat('Y-m-d', $delivery['auto']['orderDates']['pickup'])->getTimestamp();
                                    }

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

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

                                        $delivery_auto_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['auto']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
                                    } catch (Throwable $e) {
                                        // Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)

                                        $delivery_auto_converted = DateTime::createFromFormat('Y-m-d', $delivery['auto']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
                                    }
                                    $delivery_auto = ceil(($delivery_auto_converted - ($delivery_auto_send_date ?? 0)) / 60 / 60 / 24) + 1;
                                }

                                // Инициализация статуса связи поставки
                                $status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? '');

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

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

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

                            if ($amount['avia'] > 0) {
                                // Найдены поставки с доставкой по воздуху

                                // Инициализация цены
                                $price_avia = $price_raw['avia'] . ' ' . $currency;

                                // Инициализация доставки
                                if (!isset($delivery) || (isset($delivery['avia'], $delivery['avia']['error']) || $delivery === '?')) {
                                    // Не удалось рассчитать доставку

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

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

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

                                        $delivery_avia_send_date = DateTime::createFromFormat('Y-m-d', $delivery['avia']['orderDates']['pickup'])->getTimestamp();
                                    }

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

                                        $delivery_avia_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['avia']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
                                    } catch (Throwable $e) {
                                        // Автоматическая доставка (подразумевается), данные из "arrivalToOspReceiver" (Дата прибытия натерминал-получатель)

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

                                        $delivery_avia_converted = DateTime::createFromFormat('Y-m-d', $delivery['avia']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
                                    }
                                    $delivery_avia = ceil(($delivery_avia_converted - ($delivery_avia_send_date ?? 0)) / 60 / 60 / 24) + 1;
                                }

                                // Инициализация статуса связи поставки
                                $status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? '');

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

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

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

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

                    // Инициализация статуса заказа
                    $status = AccountEdgeOrder::convertStatusToRussian($account_edge_order[0]['type']);

                    // Инициализация счета для скачивания
                    $invoice = <<<HTML
                        <a class="text-dark" href="/invoices/{$order['_key']}/download"><i class="fas fa-file-invoice-dollar"></i></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</b></div>
                            <div class="col-2"></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>
<?php endif ?>
