<?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['account'] = accounts::account($vars);

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

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

            if (empty($vars['book'])) {
                // Не найдена книга

                return null;
            }

            // Генерация представления
            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
     *
     * @return string|null Файл, если найден
     */
    public function cover(array $vars = []): ?string
    {
        // Проверка входных параметров
        if (empty($vars['id'])) return null;

        // Инициализация пути до файла
        $file = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . $vars['id'] . DIRECTORY_SEPARATOR . '0.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 Параметры
     * @param array $files Файлы
     *
     * @return string|null HTML-документ
     */
    public function write(array $vars = [], array $files = []): ?string
    {
        // ПЕРЕНЕСТИ В МОДЕЛЬ

        // Инициализация буфера сохранённых книг
        $books = [];

        for ($i = -1; count($files['books']['name']) > ++$i;) {
            // Перебор загруженных книг

            // Генерация хеша файла
            $hash = hash_file('md5', $files['books']['tmp_name'][$i]) ?? 0;

            if (move_uploaded_file($files['books']['tmp_name'][$i], \STORAGE . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR . $hash . '_' . $files['books']['name'][$i])) {
                // Загружен и перемещён из временной папки файл с книгой

                // Запись в буфер сохранённых книг
                $books[] = $hash . '_' . $files['books']['name'][$i];
            }
        }

        foreach ($books as $book) {
            // Перебор сохранённых книг

            // Запись в базу данных


            // Инициализация пути до хранилища
            $storage = \STORAGE . DIRECTORY_SEPARATOR . 'books' . DIRECTORY_SEPARATOR . 'id' . DIRECTORY_SEPARATOR;

            // Извлечение изображений из PDF-документа
            exec("cd $storage && pdfimages -j $book");
        }

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

        return null;
    }

    /**
     * Чтение
     *
     * @param array $vars Параметры запроса
     *
     * @return string|null HTML-документ
     */
    public function read(array $vars = []): ?string
    {
        if (accounts::deauthentication($vars)) {
            // Удалось деаутентифицироваться
        }

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

    /**
     * Удаление
     *
     * @param array $vars Параметры запроса
     *
     * @return string|null HTML-документ
     */
    public function delete(array $vars = []): ?string
    {
        if (accounts::deauthentication($vars)) {
            // Удалось деаутентифицироваться
        }

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