<?php

namespace app\controllers;

use app\models\AccountForm;

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

use Throwable;
use Exception;

class AuthenticationController extends Controller
{

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

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

            // Инициализация
            $model = new AccountForm(Yii::$app->request->post('AccountForm'));
            $model->scenario = $model::SCENARIO_AUTHENTICATION;

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

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

                // Запись ответа
                $return = [
                    'menu' => $this->renderPartial('/account/deauthentication'),
                    '_csrf' => Yii::$app->request->getCsrfToken()
                ];

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

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

                    try {
                        if (empty($return['main'] = $this->renderPartial($return['redirect']))) {
                            throw new Exception('Представление найдено, но вернуло пустой результат');
                        }
                    } catch (Throwable $t) {
                        $return['main'] = $this->renderPartial($return['redirect'] . '/index');
                    }

                    // Генерация и запись
                    // $controller = 'app\\controllers\\' . ucfirst($cookies['redirect']) . 'Controller';
                    // $action = 'action' . ucfirst($cookies['redirect_action']);
                    // $return['main'] = (new $controller())->$action();

                    // Очистка cookie
                    unset(Yii::$app->response->cookies['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 [
                    'main' => $this->renderPartial('/account/index', compact('model')),
                    'redirect' => '/authentication',
                    '_csrf' => Yii::$app->request->getCsrfToken()
                ];
            }
        }

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