<?php

declare(strict_types=1);

namespace app\controllers;

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

use app\models\AccountForm;
use app\models\Order;
use yii\bootstrap\ActiveForm;

class RegistrationController extends Controller
{
    public function actionIndex()
    {
        // Инициализация
        $model = new AccountForm(yii::$app->request->post('AccountForm') ?? yii::$app->request->get('AccountForm'));
        $type = yii::$app->request->post('type') ?? yii::$app->request->get('type');
        $target = yii::$app->request->post('target') ?? yii::$app->request->get('target');
        $model->scenario = $model::SCENARIO_REGISTRATION;

        // Фильтрация
        $target = match ($target) {
            'panel' => 'panel',
            'main' => 'main',
            default => 'main'
        };

        // Рендер для всплывающей панели
        $panel = $target === 'panel';

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

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

            if ($type === 'registration' && (!yii::$app->user->isGuest || $model->registration())) {
                // Данные прошли проверку и аккаунт был создан

                // Аутентификация
                $model->scenario = $model::SCENARIO_AUTHENTICATION;

                if (!$model->authentication()) {
                    // Не удалось аутентифицироваться

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

                    $model->scenario = $model::SCENARIO_REGISTRATION;

                    return [
                        $target => $this->renderPartial('/account/index', compact('model', 'panel') + ['registration' => true]),
                        'redirect' => '/registration',
                        '_csrf' => yii::$app->request->getCsrfToken()
                    ];
                }

                // Инициализация
                $notifications_button = $this->renderPartial('/notification/button');
                $notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
                $cart_button = $this->renderPartial('/cart/button', ['cart_amount' => Order::count(supplies: true)]);

                // Запись ответа
                $return = [
                    'menu' => $this->renderPartial('/account/panel/authenticated', compact(
                        'notifications_button',
                        'notifications_panel',
                        'cart_button'
                    )),
                    '_csrf' => yii::$app->request->getCsrfToken()
                ];

                if (($cookies = yii::$app->response->cookies)->has('redirect')) {
                    // Найдено cookie с переадресацией

                    // Запись ответа
                    $return['redirect'] = '/' . $cookies['redirect'];

                    // Очистка cookie
                    unset(yii::$app->response->cookies['redirect']);

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

                    // Переадресация
                    return $this->redirect($return['redirect']);
                } else {
                    // Не найдено cookie с переадресацией

                    if (yii::$app->request->pathInfo === 'authentication' || yii::$app->request->pathInfo === 'registration') {
                        // Если клиент на промежуточном URI

                        // Запись ответа
                        $return['redirect'] = '/';
                        $return['main'] = $this->renderPartial('/index');
                    }
                }

                return $return;
            } else {
                // Данные не прошли проверку

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

                return [
                    $target => $this->renderPartial('/account/index', compact('model', 'panel') + ['registration' => true]),
                    'redirect' => '/registration',
                    '_csrf' => yii::$app->request->getCsrfToken()
                ];
            }
        }

        if (!yii::$app->user->isGuest) {
            yii::$app->response->redirect('/');
        } else {
            return $this->render('/account/index', compact('model', 'panel') + ['registration' => true]);
        }
    }
}
