<?php

declare(strict_types=1);

namespace mirzaev\surikovlib\controllers;

use mirzaev\surikovlib\controllers\core;

use mirzaev\surikovlib\models\accounts_model as accounts;
use mirzaev\surikovlib\models\books_model as books;

/**
 * Контроллер пользователей
 *
 * @package mirzaev\surikovlib\controllers
 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 */
final class books_controller extends core
{
    /**
     * Страница с книгами (или книгой)
     *
     * @param array $vars
     */
    public function index(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        // Проверка аутентифицированности
        $vars['account'] = accounts::init(errors: $vars['errors']);

        if (isset($vars['id'])) {
            // Определённая книга

            // Чтение метаданных книги
            $vars['book'] = books::read(['id' => $vars['id']])[0] ?? null;

            // Инициализация страницы
            if (empty($vars['page']) || $vars['page'] < 0) $vars['page'] = 0;

            // Генерация представления
            return $this->view->render(DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'book.html', $vars);

        } else {
            // Все книги

            // Чтение книг
            $vars['books'] = books::read(limit: 30, page: isset($vars['page']) && $vars['page'] > 0 ? $vars['page'] : 1);

            // Генерация представления
            return $this->view->render(DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'index.html', $vars);
        }
    }

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

        if (accounts::init(errors: $vars['errors'])->access('books')) {
            // Найден и авторизован аккаунт

            if (count($books = books::import($files['books'] ?? [], errors: $vars['errors'])) > 0) {
                // Загружены книги
            } else {
                // Не загружены книги
            }
        }

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

        return 'wtf';
    }

    /**
     * Чтение
     *
     * @param array $vars
     *
     * @return string|null Файл, если найден
     */
    public function read(array $vars = []): ?string
    {
        if (isset($vars['id'], $vars['file'])) {
            // Найдены обязательные входные параметры

            // Инициализация пути до файла
            $file = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . $vars['id'] . DIRECTORY_SEPARATOR . $vars['file'] . '.jpg';

            if (file_exists($file)) {
                // Найден файл

                // Настройка заголовков
                header('Content-Description: File Transfer');
                header('Content-Type: image/jpeg');
                header('Content-Disposition: attachment; filename=' . basename($file));
                header('Content-Transfer-Encoding: binary');
                header('Content-Length: ' . filesize($file));

                // Очистить буфер вывода
                ob_end_clean();

                return file_get_contents($file);
            }
        }

        return null;
    }

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

        if (accounts::init(errors: $vars['errors'])->access('books')) {
            // Найден и авторизован аккаунт

            if (isset($vars['id'])) {
                // Найдены обязательные входные параметры

                if (books::delete((int) $vars['id'], $vars['errors'])) {
                    // Удалена книга из базы данных

                    // Инициализация пути до книги
                    $book = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . $vars['id'];

                    if (file_exists($book)) {
                        // Найдена книга

                        // Удаление книги
                        exec('rm -rf ' . escapeshellarg($book));

                        // Запись статуса выполнения в буфер вывода
                        $status = true;
                    }
                }
            }
        }

        return json_encode([
            'status' => $status ?? false,
            'errors' => $vars['errors']
        ]);
    }

    /**
     * Поворот
     *
     * @param array $vars
     *
     * @return string|null JSON
     */
    public function rotate(array $vars = []): ?string
    {
        // Инициализация журнала ошибок
        $vars['errors'] = [];

        if (accounts::init(errors: $vars['errors'])->access('books')) {
            // Найден и авторизован аккаунт

            if (isset($vars['id'], $vars['page'])) {
                // Найдены обязательные входные параметры

                // Поворот страницы
                $status = books::rotate((int) $vars['id'], (int) $vars['page'], $vars['errors']);
            }
        }

        return json_encode([
            'status' => $status ?? false,
            'errors' => $vars['errors']
        ]);
    }
}
