<?php

namespace app\controllers;

use app\models\AccountForm;
use app\models\Order;
use app\models\Notification;
use yii;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\AccessControl;

use Throwable;
use Exception;
use yii\bootstrap\ActiveForm;

class AuthenticationController extends Controller
{

    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['?'],
                    ]
                ],
            ]
        ];
    }

    public function actionIndex()
    {
        // Инициализация
        $model = new AccountForm(yii::$app->request->post('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_AUTHENTICATION;

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

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

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

            // Настройка кода ответа
            yii::$app->response->format = Response::FORMAT_JSON;

            if (!yii::$app->user->isGuest || $model->authentication()) {
                // Аккаунт аутентифицирован

                // Отправка уведомления
                Notification::_write('Вы аутентифицированы с устройства ' . $_SERVER['HTTP_USER_AGENT'] . ' ' . $_SERVER['REMOTE_ADDR'], true, yii::$app->user->identity->_key, Notification::TYPE_NOTICE);

                // Инициализация
                $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->request->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')),
                    'redirect' => '/authentication',
                    '_csrf' => yii::$app->request->getCsrfToken()
                ];
            }
        }

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