<?php

namespace Planaday\Config\OptionGroups\Booking\Submission\Redirecting;

use Planaday\Config\OptionGroups\Booking\BookingOptions;
use Planaday\Config\OptionGroups\OptionGroup;
use Planaday\Config\OptionTypes\BoolOption;
use Planaday\Config\OptionTypes\PageOption;
use Planaday\Config\OptionTypes\TextOption;
use Planaday\Utility\DependencyInjection\ComponentRegistry;
use Planaday\Utility\DependencyInjection\ComponentRegistryShortCut;

/**
 * @implements ComponentRegistryShortCut<RedirectOptions>
 */
class RedirectOptions extends OptionGroup implements ComponentRegistryShortCut {
	private const NAME = 'Redirect Opties';

	private const DESCRIPTION = 'Instellingen voor waar de cursist naar wordt gestuurt na het indienen van een boeking.';
	const NO_REDIRECT_SUCCESS_TEXT_DESCRIPTION =
		"Tekst die op de pagina wordt getoond als een boeking door een deelnemer is gelukt<br/>" .
		"Velden met {veld} worden vervangen door waardes:<br/>" .
		"<ul>" .
			"<li>{cursus} = Naam van cursus</li>" .
			"<li>{cursuscode} = (PAD)Code van cursus</li>" .
			"<li>{startdatum} = Startdatum van cursus</li>" .
			"<li>{naam} = Voornaam, intialen, tussenvoegsel en achternaam</li>" .
			"<li>{voornaam} = Voornaam</li>" .
			"<li>{achternaam} = Achternaam</li>" .
			"<li>{website} = Titel/naam van deze website</li>" .
			"<li>{padboekingid} = BoekingID vanuit Planaday als boeking is gelukt</li>" .
			"<li>{idealtransactieid} = TransactieID van iDeal <strong>indien betalingen actief</strong></li>" .
			"<li>{betaald} = Melding of betaling is gelukt <strong>indien betalingen actief</strong></li>" .
			"<li>{bedrag} = Afgerekende bedrag <strong>indien betalingen actief</strong></li>" .
		"</ul>" .
		"<br/>" .
		"<i><strong>Tip: gebruik hier geen plugins of shortcodes oid.</strong></i>";

	const NO_REDIRECT_SUCCESS_TEXT_DEFAULT =
		"Hallo {naam},\n\n" .
		"Bedankt voor je aanmelding voor de cursus: {cursus} met startdatum: {startdatum}.\n" .
		"Zodra wij deze hebben verwerkt krijg je nog een definitieve bevestiging per E-mail.\n\n";

	const NO_REDIRECT_FAILURE_TEXT_DESCRIPTION =
		"Tekst die op de pagina wordt getoond als een boeking door een deelnemer niet is gelukt<br/>" .
		"Velden met {veld} worden vervangen door waardes:<br/>" .
		"<ul>" .
			"<li>{cursus} = Naam van cursus</li>" .
			"<li>{cursuscode} = (PAD)Code van cursus</li>" .
			"<li>{startdatum} = Startdatum van cursus</li>" .
			"<li>{naam} = Voornaam, intialen, tussenvoegsel en achternaam</li>" .
			"<li>{voornaam} = Voornaam</li>" .
			"<li>{achternaam} = Achternaam</li>" .
			"<li>{website} = Titel/naam van deze website</li>" .
		"</ul>" .
		"<br/>" .
		"<i><strong>Tip: gebruik hier geen plugins of shortcodes oid.</strong></i>";

	const NO_REDIRECT_FAILURE_TEXT_DEFAULT =
		"Hallo {naam},\n\n" .
		"Bedankt voor je aanmelding voor de cursus: {cursus} met startdatum: {startdatum}.\n" .
		"Om een of andere reden is de boeking niet gelukt.\n\n" .
		"Neem voor de zekerheid contact met ons op zodat wij dit kunnen nakijken.\n\n";

	/** @var BoolOption<bool> */
	private $redirectAfterSuccess;

	/** @var PageOption<null> */
	private $successPage;

	/** @var TextOption<string> */
	private $successText;

	/** @var BoolOption<bool> */
	private $redirectAfterFailure;

	/** @var PageOption<null> */
	private $failurePage;

	/** @var TextOption<string> */
	private $failureText;


	public function __construct( string $index, array $data ) {
		$this->redirectAfterSuccess = new BoolOption(
			RedirectOptionsEnum::REDIRECT_AFTER_SUCCESS,
			'Naar andere pagina sturen?',
			'Wilt u dat de cursist na het succesvol indienen van een boeking naar een andere pagina wordt gestuurd?',
			$data[ RedirectOptionsEnum::REDIRECT_AFTER_SUCCESS ] ?? null,
			false
		);

		$this->successPage = new PageOption(
			RedirectOptionsEnum::REDIRECT_SUCCESS_PAGE,
			'Pagina na succesvol indienen',
			'Welke pagina wilt u dat de cursist na succesvol indienen van een boeking naar sturen?',
			$data[ RedirectOptionsEnum::REDIRECT_SUCCESS_PAGE ] ?? null,
			null
		);

		$this->successText = new TextOption(
			RedirectOptionsEnum::NO_REDIRECT_SUCCESS_TEXT,
			'Bedankt tekst na boeking',
			self::NO_REDIRECT_SUCCESS_TEXT_DESCRIPTION,
			$data[ RedirectOptionsEnum::NO_REDIRECT_SUCCESS_TEXT ] ?? null,
			self::NO_REDIRECT_SUCCESS_TEXT_DEFAULT
		);

		$this->redirectAfterFailure = new BoolOption(
			RedirectOptionsEnum::REDIRECT_AFTER_FAILURE,
			'Naar andere pagina sturen?',
			'Wilt u dat de cursist na niet succesvol indienen van een boeking naar een andere pagina wordt gestuurd??',
			$data[ RedirectOptionsEnum::REDIRECT_AFTER_FAILURE ] ?? null,
			false
		);

		$this->failurePage = new PageOption(
			RedirectOptionsEnum::REDIRECT_FAILURE_PAGE,
			'Pagina na niet succesvol indienen',
			'Welke pagina wilt u dat de cursist na het niet succesvol indienen van een boeking naar sturen?',
			$data[ RedirectOptionsEnum::REDIRECT_FAILURE_PAGE ] ?? null,
			null
		);

		$this->failureText = new TextOption(
			RedirectOptionsEnum::NO_REDIRECT_FAILURE_TEXT,
			'Bedankt tekst na mislukte boeking',
			self::NO_REDIRECT_FAILURE_TEXT_DESCRIPTION,
			$data[ RedirectOptionsEnum::NO_REDIRECT_FAILURE_TEXT ] ?? null,
			self::NO_REDIRECT_FAILURE_TEXT_DEFAULT
		);


		$layout = [
			new OptionGroup(
				null,
				'Successvolle boeking',
				'Opties voor na een succesvolle boeking',
				[
					$this->redirectAfterSuccess,
					$this->successPage,
					$this->successText
				]
			),
			new OptionGroup(
				null,
				'Niet successvolle boeking',
				'Opties voor na een niet succesvolle boeking',
				[
					$this->redirectAfterFailure,
					$this->failurePage,
					$this->failureText
				]
			)
		];

		parent::__construct( $index, self::NAME, self::DESCRIPTION, $layout );
	}

	/**
	 * @return BoolOption<bool>
	 */
	public function redirectAfterSuccess(): BoolOption {
		return $this->redirectAfterSuccess;
	}

	/**
	 * @return PageOption<null>
	 */
	public function successPage(): PageOption {
		return $this->successPage;
	}

	/**
	 * @return TextOption<string>
	 */
	public function successText(): TextOption {
		return $this->successText;
	}

	/**
	 * @return BoolOption<bool>
	 */
	public function redirectAfterFailure(): BoolOption {
		return $this->redirectAfterFailure;
	}

	/**
	 * @return PageOption<null>
	 */
	public function failurePage(): PageOption {
		return $this->failurePage;
	}

	/**
	 * @return TextOption<string>
	 */
	public function failureText(): TextOption {
		return $this->failureText;
	}

	/**
	 * @inheritDoc
	 */
	public static function componentRegistryConstruct( ComponentRegistry $registry ) {
		return $registry->getComponent(BookingOptions::class)->submissionOptions()->redirect();
	}
}