<?php
namespace App\UI\Sign;

use App\Core\MujAutentifikator;
use App\Model\FormData\LoginFormData;
use App\Model\Login\ServerCredentials;
use Nette;
use Nette\Application\UI\Form;
use Nette\Application\Attributes\Persistent;

final class SignPresenter extends Nette\Application\UI\Presenter
{
	/**
	 * Stores the previous page hash to redirect back after successful login.
	 */
	#[Persistent]
	public string $backlink = '';

	public function __construct(
	) {
	}

	protected function createComponentSignInForm(): Form
	{
		$form = new Form();
		$form->addText('server', 'Server:')
			->setRequired('Prosím vyplňte server.')
			->setValue(@$_COOKIE['server']);

		$form->addText('username', 'Uživatelské jméno:')
			->setRequired('Prosím vyplňte své uživatelské jméno.')
			->setValue(@$_COOKIE['user']);

		$form->addPassword('password', 'Heslo:');
		// setRequired nepoužívat!! kvůli soft logoutu!!!
		//->setRequired('Prosím vyplňte své heslo.');

		$form->addSubmit('send', 'Přihlásit');
		//$form->addProtection(); //ochrana pomocí TOKENu

		$form->onSuccess[] = $this->signInFormSucceeded(...);
		return $form;
	}

	private function signInFormSucceeded(Form $form, LoginFormData $data): void //moje vlastní třída LoginFormData
	{
		try {
			// kontrola serverů:
			if (!Funkce::is_cloud_ip($data->server)) {
				error_log("QR Login - neplatny server.", 0); //log je ve var/log/apache2/error.log (fail2ban)
				$form->addError('Neznámý server.');
				return;
			}

			// sestav Credentials:
			$credentials = new ServerCredentials($data->server);

			$autentifikator = new MujAutentifikator($credentials, $this->session); // naše vlastní autentifikace!
			$this->getUser()->setAuthenticator($autentifikator); // musíme ji registrovat!

			$blacklist_check = $this->blackList->blacklist_check($data->server);
			bdump($blacklist_check);
			if (is_null($blacklist_check)) {
				//nic, jako by prošel    
			} else {
				// $blacklist_check->vysledek Returns 1, pokud není blacklistu. Když se tam nachází, tak 0.
				// $blacklist_check->expire_date Kdy končí.
				// $blacklist_check->expired_text Co jim zahlásíš.
				if ($blacklist_check->vysledek == 0) {
					setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ... 
					if (empty($blacklist_check->expired_text))
						throw new BlackListException("Licence pro použití PečAppky vypršela, nebo nám dlužíte peníze.");
					else
						throw new BlackListException($blacklist_check->expired_text); // custom text z blacklist DB
				}
			}

			// uložené heslo?
			if (empty($data->password) and isset($_COOKIE['salt'])) {
				$password = Funkce::decrypt_password($_COOKIE['salt']);
			} else {
				$password = $data->password;
			}
			// validace přihlášení je v třídě MujAutentifikator->authenticate(...)
			$this->getUser()->login($data->username, $password);

			// kam potom?
			$this->restoreRequest($this->backlink); // vrátit se na požadovanou stránku
			$this->redirect(':Ctecka:'); // jinak přejdi sem
		} catch (Nette\Database\ConnectionException) {
			error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
			$form->addError('Neplatné přihlášení.');
		} catch (Nette\Security\AuthenticationException $e) {
			error_log("QR Login - neplatne prihlaseni.", 0); //log je ve var/log/apache2/error.log (fail2ban)
			$form->addError($e->getMessage());
		} catch (BlackListException $e2) {	
			$form->addError($e2->getMessage());
		}
	}

	public function renderIn(): void
	{
		// ukázat či neukázat pole pro heslo?
		$this->template->salt = isset($_COOKIE['salt']);
	}

	/**
	 * Normalní logout.
	 * @return void
	 */
	public function actionOut(): void
	{
		$this->getUser()->logout();
		$this->flashMessage('Odhlášení bylo úspěšné.');
		$this->redirect('Sign:in');
	}

	/**
	 * Tvrdý logout.
	 * @return void
	 */
	public function actionHardOut(): void
	{
		$this->getUser()->logout();
		setcookie("salt", "", time() - 3600); // smažeme v tomto případě kukínu ...

		// smažeme vybranou DB ze session:
		if ($this->session->hasSection(Konstanty::sectionDatabase)) {
			$section = $this->session->getSection(Konstanty::sectionDatabase);
			$section->remove(Konstanty::sessionCurrentDatabase);
		}

		$this->flashMessage('Odhlášení bylo úspěšné.');
		$this->redirect('Sign:in');
	}
}