<?php

declare(strict_types=1);

namespace mirzaev\surikovlib\controllers;

use mirzaev\surikovlib\controllers\core;

use mirzaev\surikovlib\models\accounts_model as accounts;

/**
 * Контроллер пользователей
 *
 * @package mirzaev\surikovlib\controllers
 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 */
final class accounts_controller extends core
{
    /**
     * Страница профиля
     *
     * @param array $vars
     */
    public function index(array $vars = []): ?string
    {
        return null;
    }

    /**
     * Регистрация
     *
     * @param array $vars Параметры запроса
     *
     * @return string|null HTML-документ
     */
    public function registration(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        if ($vars['account'] = accounts::registration(mail: $vars['mail'] ?? null, password: $vars['password'] ?? null, errors: $vars['errors'])) {
            // Удалось зарегистрироваться

            if ($vars['account'] = accounts::authentication($vars['mail'] ?? null, $vars['password'] ?? null, (bool) ($vars['remember'] ?? false), $vars)) {
                // Удалось аутентифицироваться
            } else {
                // Не удалось аутентифицироваться

                // Запись кода ответа
                http_response_code(401);
            }
        } else {
            // Не удалось зарегистрироваться

            // Запись кода ответа
            http_response_code(401);
        }

        // Инициализаци пути для перенаправления
        $redirect = isset($vars['redirect']) ? $vars['redirect'] : $_SERVER['HTTP_REFERER'] ?? '/';

        // Перенаправление
        header("Location: $redirect", response_code: 303);

        return null;
    }

    /**
     * Аутентификация
     *
     * @param array $vars Параметры запроса
     *
     * @return string|null HTML-документ
     */
    public function authentication(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        if ($vars['account'] = accounts::authentication($vars['mail'] ?? null, $vars['password'] ?? null, (bool) ($vars['remember'] ?? false), errors: $vars['errors'])) {
            // Удалось аутентифицироваться
        } else {
            // Не удалось аутентифицироваться

            // Запись кода ответа
            http_response_code(401);
        }

        // Инициализаци пути для перенаправления
        $redirect = isset($vars['redirect']) ? $vars['redirect'] : $_SERVER['HTTP_REFERER'] ?? '/';

        // Перенаправление
        header("Location: $redirect", response_code: 303);

        return null;
    }

    /**
     * Деаутентификация
     *
     * @param array $vars Параметры запроса
     *
     * @return string|null HTML-документ
     */
    public function deauthentication(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        if (accounts::deauthentication(errors: $vars['errors'])) {
            // Удалось деаутентифицироваться

            // Деинициализация аккаунта
            $vars['account'] = null;
        } else {
            // Не удалось деаутентифицироваться

            // Запись кода ответа
            http_response_code(500);
        }

        // Перенаправление
        header('Location: /', response_code: 303);

        return null;
    }

    /**
     * Данные аккаунта
     *
     * Если информацию запрашивает администратор, то вернётся вся, иначе только разрешённая публично
     *
     * @param array $vars Параметры запроса
     *
     * @return string JSON-документ
     */
    public function data(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        if ($account = accounts::read(['id' => $vars['id']], $vars['errors'])) {
            // Найдены данные запрашиваемого аккаунта

            // Инициализация аккаунта
            $vars['account'] = accounts::init(errors: $vars['errors']);

            if ($vars['account'] && $vars['account']->permissions['accounts'] ?? 0 === 1) {
                // Удалось аутентифицироваться и пройдена проверка авторизации
            } else {
                // Не удалось аутентифицироваться

                // Удаление запрещённых к публикации полей
                $account->password = $account->hash = $account->time = null;
            }

            // Генерация ответа
            return json_encode($account ?? '');
        } else {
            // Не найдены данные запрашиваемого аккаунта

            // Запись кода ответа
            http_response_code(404);
        }

        return null;
    }
}
