<?php

declare(strict_types=1);

namespace mirzaev\ebala\controllers;

// Файлы проекта
use mirzaev\ebala\controllers\core,
	mirzaev\ebala\controllers\traits\errors,
	mirzaev\ebala\models\payments as model;

// System libraries
use exception;

/**
 * Контроллер выплат
 *
 * @package mirzaev\ebala\controllers
 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 */
final class payments extends core
{
	use errors;

	/**
	 * Сотрудники
	 *
	 * Расчитать стоимость работы сотрудников за выбранный период и сгенерировать excel-документ
	 *
	 * @param array $parameters Параметры запроса
	 *
	 * @return void В буфер вывода excel-документ
	 */
	public function workers(array $parameters = []): void
	{
		try {
			if ($this->account->status() && ($this->account->type === 'administrator' || $this->account->type === 'operator')) {
				// Авторизован аккаунт администратора или оператора

				// Инициализация буфера ошибок
				$this->errors['export'] ??= [];

				if (!empty($from = (int) ($_COOKIE["tasks_filter_from"] ?? @$this->session->buffer[$_SERVER['INTERFACE']]['tasks']['filters']['from']))) {
					// Инициализирован параметр: from

					if (!empty($to = (int) ($_COOKIE["tasks_filter_to"] ?? @$this->session->buffer[$_SERVER['INTERFACE']]['tasks']['filters']['to']))) {
						// Инициализирован параметр: to

						// Сброс буфера вывода
						if (ob_get_level()) {
							ob_end_clean();
						}

						// Инициализация буфера вывода
						ob_start();

						if (model::workers($from, $to, $this->errors['export'])) {
							// Сгенерирован excel-документ с выплатами (и отправлен в буфер вывода)

							// Запись заголовков ответа
							header('Content-Description: Spreadsheet transfer');
							header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
							header('Content-Disposition: attachment;filename=workers ' . gmdate("d.m.Y", $from) . ' - ' . gmdate("d.m.Y", $to) . '.xlsx');
							header('Access-Control-Expose-Headers: Content-Disposition');
							header('Cache-Control: max-age=0');
						} else throw new exception('Не удалось сгенерировать excel-документ');

						// Запись заголовков ответа
						header('Content-Length: ' . ob_get_length());

						// Отправка и деинициализация буфера вывода
						ob_end_flush();
						flush();
					} else throw new exception('Не инициализирован параметр: to');
				} else throw new exception('Не инициализирован параметр: from');
			} else throw new exception('Вы не авторизованы');
		} catch (exception $e) {
			// Запись в реестр ошибок
			$this->errors[] = [
				'text' => $e->getMessage(),
				'file' => $e->getFile(),
				'line' => $e->getLine(),
				'stack' => $e->getTrace()
			];

			// Запись заголовков ответа
			header('Content-Type: application/json');
			header('Content-Encoding: none');
			header('X-Accel-Buffering: no');

			// Инициализация буфера вывода
			ob_start();

			// Генерация ответа
			echo json_encode(
				[
					'errors' => self::parse_only_text($this->errors)
				]
			);

			// Запись заголовков ответа
			header('Content-Length: ' . ob_get_length());

			// Отправка и деинициализация буфера вывода
			ob_end_flush();
			flush();
		}
	}

	/**
	 * Магазины
	 *
	 * Расчитать ... (сверку?) за выбранный период и сгенерировать excel-документ
	 *
	 * @param array $parameters Параметры запроса
	 *
	 * @return void В буфер вывода excel-документ
	 */
	public function markets(array $parameters = []): void
	{
		try {
			if ($this->account->status() && ($this->account->type === 'administrator' || $this->account->type === 'operator')) {
				// Авторизован аккаунт администратора или оператора

				// Инициализация буфера ошибок
				$this->errors['export'] ??= [];

				if (!empty($from = (int) ($_COOKIE["tasks_filter_from"] ?? @$this->session->buffer[$_SERVER['INTERFACE']]['tasks']['filters']['from']))) {
					// Инициализирован параметр: from

					if (!empty($to = (int) ($_COOKIE["tasks_filter_to"] ?? @$this->session->buffer[$_SERVER['INTERFACE']]['tasks']['filters']['to']))) {
						// Инициализирован параметр: to

						// Сброс буфера вывода
						if (ob_get_level()) {
							ob_end_clean();
						}

						// Инициализация буфера вывода
						ob_start();

						if (model::markets($from, $to, $this->errors['export'])) {
							// Сгенерирован excel-документ с выплатами (и отправлен в буфер вывода)

							// Запись заголовков ответа
							header('Content-Description: Spreadsheet transfer');
							header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
							header('Content-Disposition: attachment;filename=markets ' . gmdate("d.m.Y", $from) . ' - ' . gmdate("d.m.Y", $to) . '.xlsx');
							header('Access-Control-Expose-Headers: Content-Disposition');
							header('Cache-Control: max-age=0');
						} else throw new exception('Не удалось сгенерировать excel-документ');

						// Запись заголовков ответа
						header('Content-Length: ' . ob_get_length());

						// Отправка и деинициализация буфера вывода
						ob_end_flush();
						flush();
					} else throw new exception('Не инициализирован параметр: to');
				} else throw new exception('Не инициализирован параметр: from');
			} else throw new exception('Вы не авторизованы');
		} catch (exception $e) {
			// Запись в реестр ошибок
			$this->errors[] = [
				'text' => $e->getMessage(),
				'file' => $e->getFile(),
				'line' => $e->getLine(),
				'stack' => $e->getTrace()
			];

			// Запись заголовков ответа
			header('Content-Type: application/json');
			header('Content-Encoding: none');
			header('X-Accel-Buffering: no');

			// Инициализация буфера вывода
			ob_start();

			// Генерация ответа
			echo json_encode(
				[
					'errors' => self::parse_only_text($this->errors)
				]
			);

			// Запись заголовков ответа
			header('Content-Length: ' . ob_get_length());

			// Отправка и деинициализация буфера вывода
			ob_end_flush();
			flush();
		}
	}

}
