<?php

declare(strict_types=1);

namespace app\controllers;

use yii;
use yii\web\Controller;
use yii\web\Response;

use app\models\Account;

class VerifyController extends Controller
{
    public function actionIndex(string $vrfy = null): string|Response
    {
        if (isset($vrfy)) {
            // Подтверждение регистрации

            if (Account::verification($vrfy, auth: true)) {
                // Успешно подтверждена регистрация

                return $this->redirect('/profile');
            }

            return ErrorController::throw('Ошибка подтверждения', 'Код не совпадает с тем, что мы отправили вам на почту, либо регистрация уже была подтверждена.\n Свяжитесь с администрацией');
        } else {
            // Простой запрос

            if (yii::$app->user->isGuest) {
                // Пользователь не аутентифицирован

                return yii::$app->response->redirect('/registration');
            } else {
                // Пользователь аутентифицирован

                if (yii::$app->user->identity->vrfy === true) {
                    // Регистрация аккаунта уже подтверждена

                    // Генерация хеша пароля
                    yii::$app->user->identity->pswd = yii::$app->security->generatePasswordHash(yii::$app->user->identity->pswd);

                    // Запись в хранилище
                    yii::$app->user->identity->update();

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

                        // Запись формата ответа
                        yii::$app->response->format = Response::FORMAT_JSON;

                        return [
                            'main' => $this->renderPartial('/profile/index'),
                            'title' => 'Профиль',
                            'redirect' => '/profile',
                            '_csrf' => yii::$app->request->getCsrfToken()
                        ];
                    } else {
                        // GET-запрос (подразумевается)

                        return $this->render('/profile/index');
                    }
                } else {
                    // Регистрация аккаунта ещё не подтверждена

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

                        // Запись формата ответа
                        yii::$app->response->format = Response::FORMAT_JSON;

                        return $this->genPostVerify();
                    } else {
                        // GET-запрос (подразумевается)

                        return $this->render('/account/verify');
                    }
                }
            }
        }
    }

    /**
     * Отправить запрос на активацию
     *
     * @return string
     */
    public function actionSend(): string|array
    {
        if (!yii::$app->user->isGuest) {
            // Пользователь аутентифицирован

            // Регенерация кода подтверждения
            yii::$app->user->identity->verifyRegenerate();

            // Отправка кода подтверждения на почту
            yii::$app->user->identity->sendMailVerify();

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

                // Запись формата ответа
                yii::$app->response->format = Response::FORMAT_JSON;

                return $this->genPostVerify();
            } else {
                // GET-запрос (подразумевается)

                return $this->render('/account/verify');
            }
        }
    }

    /**
     * Генерация данных для POST-запроса с переадресацией на страницу подтверждения
     */
    function genPostVerify(): array {
        return [
            'main' => $this->renderPartial('/account/verify'),
            'title' => 'Подтверждение аккаунта',
            'redirect' => '/account/verify',
            '_csrf' => yii::$app->request->getCsrfToken()
        ];
    }
}
