<?php

namespace Planaday\Config\OptionGroups\Booking\Form\Student;

use Planaday\Config\OptionGroups\Booking\BookingOptions;
use Planaday\Config\OptionGroups\OptionCluster;
use Planaday\Config\OptionGroups\OptionGroup;
use Planaday\Config\OptionTypes\BoolOption;
use Planaday\Config\OptionTypes\StringOption;
use Planaday\Utility\DependencyInjection\ComponentRegistry;
use Planaday\Utility\DependencyInjection\ComponentRegistryShortCut;

class StudentOptions extends OptionGroup implements ComponentRegistryShortCut {
	private const NAME = 'Cursist';
	private const DESCRIPTION = 'De instellingen voor de registratie van cursisten in het boeking formulier.';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/** @var StringOption<null> */
	private $termsAndConditionsUrl;

	/** @var StringOption<string> */
	private $costCenterCodeText;

	/** @var StringOption<string> */
	private $code95Text;

	/** @var StringOption<string> */
	private $soobText;

	public function __construct( string $index, array $data ) {
		$this->askAddress = new BoolOption(
			StudentOptionsEnum::ASK_ADDRESS,
			'Adres vragen?',
			'Moet er een adres gevraagd worden? Deze is verplicht als deze gevraagd wordt.',
			$data[ StudentOptionsEnum::ASK_ADDRESS ] ?? null,
			false
		);

		$this->askIfContact = new BoolOption(
			StudentOptionsEnum::ASK_IF_CONTACT,
			'Contactpersoon?',
			"Moet er gevraagd worden of de student een contactpersoon is?",
			$data[ StudentOptionsEnum::ASK_IF_CONTACT ] ?? null,
			false
		);

		$this->askNickName = new BoolOption(
			StudentOptionsEnum::ASK_NICK_NAME,
			'Roepnaam vragen?',
			"Moet de roepnaam gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_NICK_NAME ] ?? null,
			false
		);

		$this->askMaidenName = new BoolOption(
			StudentOptionsEnum::ASK_MAIDEN_NAME,
			'Meisjesnaam vragen?',
			"Moet de meisjesnaam gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_MAIDEN_NAME ] ?? null,
			false
		);

		$this->askInternalReference = new BoolOption(
			StudentOptionsEnum::ASK_INTERNAL_REFERENCE,
			'Interne Referentie vragen?',
			"Moet de interne referentie gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_INTERNAL_REFERENCE ] ?? null,
			false
		);

		$this->askCompanyPosition = new BoolOption(
			StudentOptionsEnum::ASK_COMPANY_POSITION,
			'Bedrijfsfunctie vragen?',
			"Moet de bedrijfsfunctie gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_COMPANY_POSITION ] ?? null,
			false
		);

		$this->askCostCenterCode = new BoolOption(
			StudentOptionsEnum::ASK_COST_CENTER_CODE,
			'Kostencentrum code vragen?',
			"Moet de kostencentrum code gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_COST_CENTER_CODE ] ?? null,
			false
		);

		$this->askEmployeeNumber = new BoolOption(
			StudentOptionsEnum::ASK_EMPLOYEE_NUMBER,
			'Personeelsnummer vragen?',
			"Moet het personeelsnummer gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_EMPLOYEE_NUMBER ] ?? null,
			false
		);

		$this->askDateOfBirth = new BoolOption(
			StudentOptionsEnum::ASK_DATE_OF_BIRTH,
			'Geboortedatum vragen?',
			"Moet de geboortedatum gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_DATE_OF_BIRTH ] ?? null,
		false
		);

		$this->askPlaceOfBirth = new BoolOption(
			StudentOptionsEnum::ASK_PLACE_OF_BIRTH,
			'Geboorteplaats vragen?',
			"Moet de geboorteplaats gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_PLACE_OF_BIRTH ] ?? null,
			false
		);

		$this->askPhoneNumber = new BoolOption(
			StudentOptionsEnum::ASK_PHONE_NUMBER,
			'Telefoonnummer vragen?',
			"Moet er een telefoonnummer gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_PHONE_NUMBER ] ?? null,
			false
		);

		$askFieldsCluster = new OptionCluster(
			'Persoonsgegevens vragen',
			'Welke persoonsgegevens worden gevraagt in het boekings formulier?',
			[
				"adres (verplicht als geselecteerd)" => $this->askAddress,
				"roepnaam" => $this->askNickName,
				"meisjesnaam" => $this->askMaidenName,
				"telefoonnummer" => $this->askPhoneNumber,
				"geboortedatum" => $this->askDateOfBirth,
				"geboorteplaats" => $this->askPlaceOfBirth,
				"functie" => $this->askCompanyPosition,
				"of cursist contactpersoon is" => $this->askIfContact,
				"personeelsnummer" => $this->askEmployeeNumber,
				"kostenplaats" => $this->askCostCenterCode,
				"interne referentie" => $this->askInternalReference,
			]
		);

		$this->askCode95 = new BoolOption(
			StudentOptionsEnum::ASK_CODE_95,
			'Code 95 optie',
			"Moet de optie voor code 95 gegeven worden? Dit wordt alleen gedaan wanneer dit beschikbaar is.",
			$data[ StudentOptionsEnum::ASK_CODE_95 ] ?? null,
			false
		);

		$this->askSoob = new BoolOption(
			StudentOptionsEnum::ASK_SOOB,
			'Soob optie',
			"Moet de optie voor Soob gegeven worden? Dit wordt alleen gedaan wanneer dit beschikbaar is.",
			$data[ StudentOptionsEnum::ASK_SOOB ] ?? null,
			false
		);

		$optionsCluster = new OptionCluster(
			'Cursus opties',
			'Welke opties worden gegeven in het boekings formulier bij cursist wanneer deze beschikbaar zijn?',
			[
				"code 95" => $this->askCode95,
				"SOOB" => $this->askSoob
			]
		);

		$this->askRemark = new BoolOption(
			StudentOptionsEnum::ASK_REMARK,
			'Opmerkingen vragen?',
			"Moet er een opmerking gevraagd worden?",
			$data[ StudentOptionsEnum::ASK_REMARK ] ?? null,
			false
		);

		$this->costCenterCodeRequired = new BoolOption(
			StudentOptionsEnum::COST_CENTER_CODE_REQUIRED,
			'Kostencentrum code verplicht?',
			"Moet de kostencentrum code verplicht zijn?",
			$data[ StudentOptionsEnum::COST_CENTER_CODE_REQUIRED ] ?? null,
			false
		);

		$this->dateOfBirthRequired = new BoolOption(
			StudentOptionsEnum::DATE_OF_BIRTH_REQUIRED,
			'Geboortedatum verplicht?',
			"Moet de geboortedatum verplicht zijn?",
			$data[ StudentOptionsEnum::DATE_OF_BIRTH_REQUIRED ] ?? null,
			false
		);

		$this->placeOfBirthRequired = new BoolOption(
			StudentOptionsEnum::PLACE_OF_BIRTH_REQUIRED,
			'Geboorteplaats verplicht?',
			"Moet de geboorteplaats verplicht zijn?",
			$data[ StudentOptionsEnum::PLACE_OF_BIRTH_REQUIRED ] ?? null,
			false
		);

		$this->phoneNumberRequired = new BoolOption(
			StudentOptionsEnum::PHONE_NUMBER_REQUIRED,
			'Telefoonnummer verplicht?',
			"Moet het telefoonnummer verplicht zijn?",
			$data[StudentOptionsEnum::PHONE_NUMBER_REQUIRED ] ?? null,
		false
		);

		$this->companyPositionRequired = new BoolOption(
			StudentOptionsEnum::COMPANY_POSITION_REQUIRED,
			'Bedrijfsfunctie verplicht?',
			"Moet de bedrijfsfunctie verplicht zijn?",
			$data[ StudentOptionsEnum::COMPANY_POSITION_REQUIRED ] ?? null,
			false
		);

		$requiredFieldsCluster = new OptionCluster(
			'Verplichte velden',
			'Welke velden bij cursist moeten verplicht zijn?',
			[
				"kostenplaats" => $this->costCenterCodeRequired,
				"geboortedatum" => $this->dateOfBirthRequired,
				"geboorteplaats" => $this->placeOfBirthRequired,
				"telefoonnummer" => $this->phoneNumberRequired,
				"functie" => $this->companyPositionRequired
			]
		);

		$this->termsAndConditionsRequired = new BoolOption(
			StudentOptionsEnum::TERMS_AND_CONDITIONS_REQUIRED,
			'Algemene voorwaarden?',
			"Moet gebruiker de algemene voorwaarden accepteren?",
			$data[ StudentOptionsEnum::TERMS_AND_CONDITIONS_REQUIRED ] ?? null,
			false
		);

		$this->termsAndConditionsUrl = new StringOption(
			StudentOptionsEnum::TERMS_AND_CONDITIONS_URL,
			'Algemene voorwaarden URL',
			"Het volledige URL naar de algemene voorwaarden (inclusief https://)",
			$data[ StudentOptionsEnum::TERMS_AND_CONDITIONS_URL ] ?? null,
			null
		);

		$this->costCenterCodeText = new StringOption(
			StudentOptionsEnum::COST_CENTER_CODE_TEXT,
			'Kostenplaats tekst',
			"De text die wordt gebruikt om voor 'kostenplaats'",
			$data[ StudentOptionsEnum::COST_CENTER_CODE_TEXT ] ?? null,
			"Kostenplaats"
		);

		$this->code95Text = new StringOption(
			StudentOptionsEnum::CODE_95_TEXT,
			'Code 95 tekst',
			"Tekst die wordt gebruikt voor de code 95 optie",
			$data[ StudentOptionsEnum::CODE_95_TEXT ] ?? null,
			"Cursus bevat code95, deze deelnemer ook meteen hiervoor aanmelden?"
		);

		$this->soobText = new StringOption(
			StudentOptionsEnum::SOOB_TEXT,
			'SOOB tekst',
			"Tekst die wordt gebruikt voor de SOOB optie",
			$data[ StudentOptionsEnum::SOOB_TEXT ] ?? null,
			"Cursus bevat SOOB, deze deelnemer ook meteen hiervoor aanmelden?"
		);

		$layout = [
			$askFieldsCluster,
			$optionsCluster,
			$this->askRemark,
			$requiredFieldsCluster,
			$this->termsAndConditionsRequired,
			$this->termsAndConditionsUrl,
			$this->costCenterCodeText,
			$this->code95Text,
			$this->soobText
		];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	public static function componentRegistryConstruct( ComponentRegistry $registry ) {
		return $registry->getComponent(BookingOptions::class)->formOptions()->student();
	}
}