<?php

declare(strict_types=1);

namespace app\controllers;

use yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;
use yii\web\HttpException;
use yii\web\UploadedFile;

use app\models\Product;
use app\models\ProductEdgeProduct;

class ProductController extends Controller
{






















    public function actionIndex(string $catn): array|string|null
    {
        if ($model = Product::searchByCatn($catn)) {
            // Товар найден

            if (yii::$app->request->isAjax) {
                // AJAX-POST-запрос

                yii::$app->response->format = Response::FORMAT_JSON;

                return [
                    'main' => $this->renderPartial('index', compact('model')),
                    'redirect' => '/product/' . $catn,
                    '_csrf' => yii::$app->request->getCsrfToken()
                ];
            }

            return $this->render('index', compact('model'));
        } else {
            throw new HttpException(404);
        }
    }

    /**
     * Подключение аналога
     *
     * @param string $catn Артикул
     */
    public function actionConnect(string $catn): array|string|null
    {
        // Инициализация буфера ответа
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Переход в конец алгоритма
            goto end;
        }

        if ($from = Product::searchByCatn($catn)) {
            // Найден товар

            if ($target = yii::$app->request->post('catn') ?? yii::$app->request->get('catn')) {
                // Инициализирован артикул товара для связи

                if ($to = Product::searchByCatn($target)) {
                    // Существует товар к которому планируется соединение
                } else {
                    // Не существует товар к которому планируется соединение

                    // Инициализация товара
                    if ($to = Product::writeEmpty((string) $target)) {
                        // Удалось записать товар

                        // Запись в буфер возврата
                        $return['alert'] = "Не удалось записать новый товар: $target";
                    } else {
                        // Не удалось записать товар

                        // Запись кода ответа
                        yii::$app->response->statusCode = 500;

                        // Запись в буфер возврата
                        $return['alert'] = "Не удалось записать новый товар: $target";

                        // Переход в конец алгоритма
                        goto end;
                    }
                }

                if ($from->synchronization($to) > 0) {
                    // Созданы рёбра

                    // Запись в буфер возврата
                    $return['alert'] = 'Продукты успешно соединены';
                }
            }
        } else {
            // Не найден товар

            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Запись в буфер возврата
            $return['alert'] = "Не удалось найти товар к которому требуется соединение: $catn";

            // Переход в конец алгоритма
            goto end;
        }

        // Конец алгоритма
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if (Product::searchByCatn($catn)) {
            // Старый товар ещё существует (подразумевается, что произошла ошибка)

            // Возврат на страницу товара
            return $this->redirect("/product/$catn");
        } else {
            // Обрабатываемый товар не существует (подразумевается, что произошла ошибка)

            // Переадресация на главную страницу
            return $this->redirect("/");
        }
    }

    /**
     * Отключение аналога
     *
     * @param string $catn Артикул
     */
    public function actionDisconnect(string $catn): array|string|null
    {
        // Инициализация буфера ответа
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Переход в конец алгоритма
            goto end;
        }

        if ($from = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация цели
            $target = yii::$app->request->post('catn') ?? yii::$app->request->get('catn');

            if ($from->disconnect(Product::searchByCatn(empty($target) ? null : $target))) {
                // Удалено ребро (связь)

                // Запись в буфер возврата
                $return['alert'] = "Продукты успешно отсоединены";
            } else {
                // Не удалено ребро (связь)

                // Запись кода ответа
                yii::$app->response->statusCode = 500;

                // Запись в буфер возврата
                $return['alert'] = "Не удалось отсоединить $target от $catn";

                // Переход в конец алгоритма
                goto end;
            }
        } else {
            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Запись в буфер возврата
            $return['alert'] = "Не удалось найти товар от когорого требуется отсоединение: $catn";

            // Переход в конец алгоритма
            goto end;
        }

        // Конец алгоритма
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if (Product::searchByCatn($catn)) {
            // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка)

            // Возврат на страницу товара
            return $this->redirect("/product/$catn");
        } else {
            // Обрабатываемый товар не существует (подразумевается, что произошла ошибка)

            // Переадресация на главную страницу
            return $this->redirect("/");
        }
    }

    /**
     * Отключение аналога
     *
     * @param string $catn Артикул
     */
    public function actionDelete(string $catn): array|string|null
    {
        // Инициализация буфера ответа
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Переход в конец алгоритма
            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            if ($product->disconnect()) {
                // Отсоединён от аналогов

                if ($product->delete() > 0) {
                    // Удалён

                    // Запись в буфер возврата
                    $return['alert'] = "Товар удалён: $catn";
                    $return['location'] = '/';
                } else {
                    // Не удалось удалить

                    // Запись кода ответа
                    yii::$app->response->statusCode = 500;

                    // Запись в буфер возврата
                    $return['alert'] = "Не удалось удалить товар: $catn";

                    // Переход в конец алгоритма
                    goto end;
                }
            } else {
                // Не отсоединён от аналогов

                // Запись кода ответа
                yii::$app->response->statusCode = 500;

                // Запись в буфер возврата
                $return['alert'] = "Не удалось отсоединить от аналогов перед удалением: $catn";

                // Переход в конец алгоритма
                goto end;
            }
        } else {
            // Запись кода ответа
            yii::$app->response->statusCode = 500;

            // Запись в буфер возврата
            $return['alert'] = "Не удалось найти товар: $catn";

            // Переход в конец алгоритма
            goto end;
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if (Product::searchByCatn($catn)) {
            // Обрабатываемый товар ещё существует (подразумевается, что произошла ошибка)

            // Возврат на страницу товара
            return $this->redirect("/product/$catn");
        } else {
            // Обрабатываемый товар не существует (подразумевается, что он успешно удалён)

            // Переадресация на главную страницу
            return $this->redirect("/");
        }
    }

    public function actionEditTitle(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($model = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $text = yii::$app->request->get('text') ?? yii::$app->request->post('text') ?? 'Без названия';

            $model->prod = $text;

            if ($model->save()) {
                // Товар обновлён

                $return['prod'] = $text;
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionEditCatn(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($model = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? 'Без названия';

            $model->catn = $text;

            if ($model->save()) {
                // Товар обновлён

                $return['main'] = $this->renderPartial('index', compact('model'));
                $return['redirect'] = '/product/' . $model->catn;
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if (Product::searchByCatn($catn)) {
            // Старый товар ещё существует (подразумевается, что произошла ошибка)

            // Возврат на страницу товара
            return $this->redirect("/product/$catn");
        } else {
            // Старый товар не существует (подразумевается, что его артикул успешно изменён)

            // Переадресация на новую страницу товара
            return $this->redirect("/product/$model->catn");
        }
    }

    public function actionEditDscr(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $text = yii::$app->request->get('text') ?? yii::$app->request->post('text') ?? 'Без названия';

            $product->dscr = $text;

            if ($product->save()) {
                // Товар обновлён

                $return['description'] = $text;
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionEditDmns(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? '0';
            $dimension = yii::$app->request->post('dimension') ?? yii::$app->request->get('dimension') ?? 'x';

            $product->dmns = array_merge(
                $product->dmns ?? [],
                [
                    $dimension => $text
                ]
            );

            if ($product->save()) {
                // Товар обновлён

                $return['dimension'] = $text;
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionEditWght(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $text = yii::$app->request->post('text') ?? yii::$app->request->get('text') ?? '0';

            $product->wght = $text;

            if ($product->save()) {
                // Товар обновлён

                $return['wght'] = $text;
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionWriteImage(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];

        if (empty($catn)) {
            // Не получен артикул

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация
            $product->file_image = UploadedFile::getInstancesByName('images');
            $product->scenario = $product::SCENARIO_IMPORT_IMAGE;

            if ($product->importImages() > 0) {
                // Товар обновлён

                $return['main'] = $this->renderPartial('index', ['model' => $product]);
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionDeleteImage(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];
        $index = yii::$app->request->post('index') ?? yii::$app->request->get('index');

        if (empty($catn) || empty($index)) {
            // Не получены обязательные параметры

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация (буфер нужен из-за кривых сеттеров)
            $buffer = $product->imgs;

            // Удаление
            unset($buffer[$index]);

            // Запись
            $product->imgs = $buffer;

            if ($product->save()) {
                // Товар обновлён

                $return['main'] = $this->renderPartial('index', ['model' => $product]);
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }

    public function actionWriteCover(string $catn): array|string|null
    {
        // Инициализация
        $return = [
            '_csrf' => yii::$app->request->getCsrfToken()
        ];
        $index = yii::$app->request->post('index') ?? yii::$app->request->get('index');

        if (empty($catn) || empty($index)) {
            // Не получены обязательные параметры

            yii::$app->response->statusCode = 500;

            goto end;
        }

        if ($product = Product::searchByCatn($catn)) {
            // Товар найден

            // Инициализация (буфер нужен из-за кривых сеттеров)
            $buffer = $product->imgs;

            foreach ($buffer as $image_index => &$image) {
                // Перебор изображений

                if ($image_index === (int) $index) {
                    // Найдено запрашиваемое изображение

                    // Установка обложки
                    $image['covr'] = true;
                } else {
                    $image['covr'] = false;
                }
            }

            // Запись
            $product->imgs = $buffer;

            if ($product->save()) {
                // Товар обновлён

                $return['main'] = $this->renderPartial('index', ['model' => $product]);
            }
        }

        /**
         * Конец алгоритма
         */
        end:

        if (yii::$app->request->isPost) {
            // POST-запрос

            yii::$app->response->format = Response::FORMAT_JSON;

            return $return;
        }

        if ($model = Product::searchByCatn($catn)) {
            return $this->render('index', compact('model'));
        } else {
            return $this->redirect('/');
        }
    }
}
