<?php

// Фреймворк Telegram
use Zanzara\Zanzara;
use Zanzara\Context;
use Zanzara\Config;

// Фреймворк для Google Sheets
use Flow\ETL\Adapter\GoogleSheet\GoogleSheetRange,
	Flow\ETL\Adapter\GoogleSheet\GoogleSheetExtractor,
	Flow\ETL\Adapter\GoogleSheet\Columns,
	Flow\ETL\Flow,
	Flow\ETL\Config as _config,
	Flow\ETL\FlowContext,
	Flow\ETL\Row\Entry,
	Flow\ETL\Row,
	Flow\ETL\DSL\To,
	Flow\ETL\DSL\From;

// Фреймворк для Google API
use Google\Client,
	Google\Service\Sheets,
	Google\Service\Sheets\ValueRange;


require __DIR__ . '/../../../../../../../vendor/autoload.php';

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

$config = new Config();
$config->setParseMode(Config::PARSE_MODE_MARKDOWN);

$bot = new Zanzara(require(__DIR__ . '/../settings/key.php'), $config);

$bot->onMessage(function (Context $ctx) {
	if ($members = $ctx->getMessage()->getNewChatMembers()) {
		// Новый аккаунт в чате
		echo "Обнаружен новый участник в чате" . PHP_EOL;
		$ctx->sendMessage("⚠️ Введите ваш табельный номер", ['reply_to_message_id' => $ctx->getMessage()->getMessageId()])
			->then(function ($message) use ($ctx, $members) {
				// Инициализация идентификатора сотрудника
				$id = $members[0]->getId();

				echo "Отправлено сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id)" . PHP_EOL;

				$ctx->getGlobalDataItem("member_{$id}_request")
					->then(
						function ($old) use ($ctx, $id, $message) {

							$timer = function ($ctx, $id, $message) {
								$ctx->setGlobalDataItem("member_{$id}_request", $message)
									->then(function () use ($ctx, $id, $message) {
										echo "Записано сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id) в сессионное хранилище" . PHP_EOL;

										// Инициализация таймера
										React\Promise\Timer\sleep(180)->then(
											function () use ($ctx, $id) {

												$ctx->getGlobalDataItem("member_{$id}_request")
													->then(
														function ($message) use ($ctx, $id) {
															if ($message) {
																// Изгнание из чата
																$ctx->kickChatMember($message->getChat()->getId(), $id)
																	->then(function () use ($ctx, $id, $message) {
																		echo "Сотрудник ($id) изгнан из чата ({$message->getChat()->getId()})" . PHP_EOL;

																		// Удаление сообщения из сессионного хранилища
																		$ctx->deleteGlobalDataItem("member_{$id}_request");

																		echo "Удалено сообщение ({$message->getMessageId()}?) (member_{$id}_request) с запросом ID у сотрудника ($id) из сессионного хранилища" . PHP_EOL;

																		// Удаление сообщения 
																		$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());

																		echo "Удалено сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$message->getChat()->getId()})" . PHP_EOL;
																	});
															}
														},
														function () {
														}
													);
											}
										);

										echo "Инициализирован таймер изгнания сотрудника ($id)" . PHP_EOL;
									});
							};

							if ($old) {
								echo "Найдено сообщение ({$old->getMessageId()}) с запросом ID у сотрудника ($id) в сессионном хранилище" . PHP_EOL;

								$ctx->deleteGlobalDataItem("member_{$id}_request")
									->then(function () use ($ctx, $id, $message, $timer, $old) {
										echo "Удалено сообщение ({$old->getMessageId()}?) (member_{$id}_request) с запросом ID у сотрудника ($id) из сессионного хранилища" . PHP_EOL;

										$ctx->deleteMessage($old->getChat()->getId(), $old->getMessageId())
											->then(function () use ($ctx, $id, $message, $timer, $old) {
												echo "Удалено сообщение ({$old->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$old->getChat()->getId()})" . PHP_EOL;
												$timer($ctx, $id, $message);
											});
									});
							} else {
								echo "Не найдено сообщение с запросом ID у сотрудника ($id) в сессионном хранилище" . PHP_EOL;
								$timer($ctx, $id, $message);
							}
						}
					);
			});
	} else {
		// Любое сообщение

		// Инициализация сообщения
		$message = $ctx->getMessage();

		// Инициализация идентификатора отправителя сообщения
		$id = $message->getFrom()->getId();

		$ctx->getGlobalDataItem("member_{$id}_request")
			->then(
				function ($_message) use ($ctx, $id, $message) {
					if ($_message) {
						// Инициализация переданного идентификатора (только цифры)
						$worker = preg_replace('/[^\d]/', '', $message->getText() ?? '');

						$settings = json_decode(require(__DIR__ . '/../settings/workers/google.php'), true);
						$document = require(__DIR__ . '/../settings/workers/document.php');
						$sheets = require(__DIR__ . '/../settings/workers/sheets.php');

						$client = new Client();
						$client->setScopes(Sheets::SPREADSHEETS);
						$client->setAuthConfig($settings);
						$api = new Sheets($client);

						foreach ($sheets as $sheet) {
							$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'A'), true, 1000));

							foreach ($rows->fetch(10000) as $row) {
								// Перебор строк

								if ($worker === $row->toArray()['ID']) {
									$ctx->sendMessage("✅ Авторизован сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()])
										->then(
											function ($message) use ($ctx, $id) {
												// Инициализация таймера
												React\Promise\Timer\sleep(10)->then(
													function () use ($ctx, $id, $message) {
														// Удаление сообщения 
														$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());

														echo "Удалено сообщение ({$message->getMessageId()}) с подтверждением авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL;
													},
													function () {
													}
												);
											}
										);
									echo "Авторизован сотрудник ($id) по идентификатору ($worker)" . PHP_EOL;

									// Удаление сообщения из сессионного хранилища
									$ctx->deleteGlobalDataItem("member_{$id}_request");

									echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из сессионного хранилища после успешной авторизации" . PHP_EOL;

									// Удаление сообщения 
									$ctx->deleteMessage($_message->getChat()->getId(), $_message->getMessageId());

									echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$_message->getChat()->getId()}) после успешной авторизации" . PHP_EOL;

									return;
								}
							}
						}

						if (!empty($worker)) {
							echo "Не удалось авторизовать сотрудника ($id) по номеру ($worker)" . PHP_EOL;
							$ctx->sendMessage("⛔ Не найден сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()])
								->then(
									function ($message) use ($ctx, $id) {
										// Инициализация таймера
										React\Promise\Timer\sleep(10)->then(
											function () use ($ctx, $id, $message) {
												// Удаление сообщения 
												$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());

												echo "Удалено сообщение ({$message->getMessageId()}) с провалом авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL;
											},
											function () {
											}
										);
									}
								);
						}
					}
				}
			);
	}
});

$bot->run();