<?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;

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);
        }
    }

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

        if (is_null($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->name = $text;

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

                $return['name'] = $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 (is_null($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 (is_null($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 (is_null($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 (is_null($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 (is_null($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 (is_null($catn) || is_null($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 (is_null($catn) || is_null($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('/');
        }
    }
}
