<?php

namespace Planaday\Entities\Booking\Form\Students;

use Planaday\Config\BasicEnumMappedSetting;
use Planaday\Config\EnumMappedSettings;
use Planaday\Config\FormGroupable;
use Planaday\Config\SettingsLoader;
use Planaday\Config\SettingsWithForm;
use Planaday\Platform\PlatformAbstraction\LocalizationController;
use Planaday\Utility\DependencyInjection\Attributes\Scoped;
use Planaday\Utility\FormBuilder\Conditions\InputValueCondition;
use Planaday\Utility\FormBuilder\InputFields\BoolInput;
use Planaday\Utility\FormBuilder\InputFields\StringInput;
use Planaday\Utility\FormBuilder\Structures\BasicGroup;
use Planaday\Utility\FormBuilder\Structures\CollapsibleGroup;
use Planaday\Utility\FormBuilder\Structures\QuestionCluster;
use Planaday\Utility\FormBuilder\Validators\Required;

#[Scoped]
class StudentSettings implements EnumMappedSettings, SettingsWithForm {
	use FormGroupable;
	use BasicEnumMappedSetting;

	protected bool $askGender = true;
	protected bool $genderRequired = true;
	
	protected bool $askInitials = true;
	protected bool $initialsRequired = false;

	protected bool $askPhoneNumber = false;
	protected bool $phoneNumberRequired = false;

	protected bool $askPlaceOfBirth = false;
	protected bool $placeOfBirthRequired = false;

	protected bool $askDateOfBirth = false;
	protected bool $dateOfBirthRequired = false;

	protected bool $askMaidenName = false;
	protected bool $maidenNameRequired = false;

	protected bool $askEmployeeNumber = false;
	protected bool $employeeNumberRequired = false;

	protected bool $askCostCenterCode = false;
	protected bool $costCenterCodeRequired = false;

	protected bool $askCompanyPosition = false;
	protected bool $companyPositionRequired = false;

	protected bool $askInternalReference = false;
	protected bool $internalReferenceRequired = false;

	protected bool $askNickName = false;
	protected bool $nickNameRequired = false;

	protected bool $askAddress = false;
	protected bool $addressRequired = false;

	protected bool $askRemark = false;
	protected bool $askCode95 = false;
	protected bool $askSoob = false;

	protected string $costCenterCodeName = "Kostenplaats";
	protected string $code95Text = "Cursus bevat code95, deze deelnemer ook meteen hiervoor aanmelden?";
	protected string $soobText = "Cursus bevat SOOB, deze deelnemer ook meteen hiervoor aanmelden?";

	public function __construct(
		protected LocalizationController $translator,
		SettingsLoader $settingsLoader
	) {
		$settingsLoader->reloadData($this, StudentSettingsEnum::class);
	}

	protected function createFormGroup(): CollapsibleGroup {
		$t = function ( string $string ) {
			return $this->translator->translate( $string );
		};

		return ( new CollapsibleGroup() )
			->startCollapsed()
			->setIndex( StudentSettingsEnum::class )
			->setHeader( $t( "Cursist instellingen" ))
			->setDescription( $t( "De instellingen voor de registratie van cursisten in het boeking formulier." ) )
			->addContents(
				( new QuestionCluster() )
					->setName( $t( "Persoonsgegevens vragen en verplichten" ) )
					->setDescription( $t( "Welke persoonsgegevens worden gevraagt in het boekingsformulier? En " .
					                      "zijn deze verplicht (wanneer mogelijk)?" ) )
					->addContents(
						$askAddress = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskAddress->value )
							->setName( $t( "Adres" ) )
							->setDescription( $t( "Moet het adres van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askAddress )
							->addSetCallback( function ( $value ) {
								$this->askAddress = $value ?? $this->askAddress;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askAddress))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::AddressRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet het adres verplicht zijn?" ) )
									->setDefaultValue( $this->addressRequired )
									->addSetCallback( function ( $value ) {
										$this->addressRequired = $value ?? $this->addressRequired;
									})
							)->addClasses("pad-subgroup"),
						$askGender = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskGender->value )
							->setName( $t( "Geslacht" ) )
							->setDescription( $t( "Moet het geslacht van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askGender )
							->addSetCallback( function ( $value ) {
								$this->askGender = $value ?? $this->askGender;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askGender))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::GenderRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet het geslacht verplicht zijn?" ) )
									->setDefaultValue( $this->genderRequired )
									->addSetCallback( function ( $value ) {
										$this->genderRequired = $value ?? $this->genderRequired;
									})
							)->addClasses("pad-subgroup"),
						$askInitials = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskInitials->value )
							->setName( $t( "Geslacht" ) )
							->setDescription( $t( "Moet het geslacht van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askInitials )
							->addSetCallback( function ( $value ) {
								$this->askInitials = $value ?? $this->askInitials;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askInitials))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::InitialsRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet het geslacht verplicht zijn?" ) )
									->setDefaultValue( $this->initialsRequired )
									->addSetCallback( function ( $value ) {
										$this->initialsRequired = $value ?? $this->initialsRequired;
									})
							)->addClasses("pad-subgroup"),
						$askMaidenName = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskMaidenName->value )
							->setName( $t( "Meisjesnaam" ) )
							->setDescription( $t( "Moet de meisjesnaam van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askMaidenName )
							->addSetCallback( function ( $value ) {
								$this->askMaidenName = $value ?? $this->askMaidenName;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askMaidenName))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::MaidenNameRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de meisjesnaam verplicht zijn?" ) )
									->setDefaultValue( $this->maidenNameRequired )
									->addSetCallback( function ( $value ) {
										$this->maidenNameRequired = $value ?? $this->maidenNameRequired;
									})
							)->addClasses("pad-subgroup"),
						$askCallingName = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskCallingName->value )
							->setName( $t( "Roepnaam" ) )
							->setDescription( $t( "Moet de roepnaam van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askNickName )
							->addSetCallback( function ( $value ) {
								$this->askNickName = $value ?? $this->askNickName;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askCallingName))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::CallingNameRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de roepnaam verplicht zijn?" ) )
									->setDefaultValue( $this->nickNameRequired )
									->addSetCallback( function ( $value ) {
										$this->nickNameRequired = $value ?? $this->nickNameRequired;
									})
							)->addClasses("pad-subgroup"),
						$askPhoneNumber = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskPhoneNumber->value )
							->setName( $t( "Telefoonnummer" ) )
							->setDescription( $t( "Moet het telefoonnummer van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askPhoneNumber )
							->addSetCallback( function ( $value ) {
								$this->askPhoneNumber = $value ?? $this->askPhoneNumber;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askPhoneNumber))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::PhoneNumberRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet dit telefoonnummer verplicht zijn?" ) )
									->setDefaultValue( $this->phoneNumberRequired )
									->addSetCallback( function ( $value ) {
										$this->phoneNumberRequired = $value ?? $this->phoneNumberRequired;
									})
							)->addClasses("pad-subgroup"),
						$askDateOfBirth = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskDateOfBirth->value )
							->setName( $t( "Geboortedatum" ) )
							->setDescription( $t( "Moet de geboortedatum van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askDateOfBirth )
							->addSetCallback( function ( $value ) {
								$this->askDateOfBirth = $value ?? $this->askDateOfBirth;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askDateOfBirth))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::DateOfBirthRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de geboortedatum verplicht zijn?" ) )
									->setDefaultValue( $this->dateOfBirthRequired )
									->addSetCallback( function ( $value ) {
										$this->dateOfBirthRequired = $value ?? $this->dateOfBirthRequired;
									})
							)->addClasses("pad-subgroup"),
						$askPlaceOfBirth = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskPlaceOfBirth->value )
							->setName( $t( "Geboorteplaats" ) )
							->setDescription( $t( "Moet de geboorteplaats van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askPlaceOfBirth )
							->addSetCallback( function ( $value ) {
								$this->askPlaceOfBirth = $value ?? $this->askPlaceOfBirth;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askPlaceOfBirth))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::PlaceOfBirthRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de geboorteplaats verplicht zijn?" ) )
									->setDefaultValue( $this->placeOfBirthRequired )
									->addSetCallback( function ( $value ) {
										$this->placeOfBirthRequired = $value ?? $this->placeOfBirthRequired;
									})
							)->addClasses("pad-subgroup"),
						$askCompanyPosition = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskCompanyPosition->value )
							->setName( $t( "Functie" ) )
							->setDescription( $t( "Moet de bedrijfsfunctie van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askCompanyPosition )
							->addSetCallback( function ( $value ) {
								$this->askCompanyPosition = $value ?? $this->askCompanyPosition;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askCompanyPosition))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::CompanyPositionRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de bedrijfsfunctie verplicht zijn?" ) )
									->setDefaultValue( $this->companyPositionRequired )
									->addSetCallback( function ( $value ) {
										$this->companyPositionRequired = $value ?? $this->companyPositionRequired;
									})
							)->addClasses("pad-subgroup"),
						$askEmployeeNumber = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskEmployeeNumber->value )
							->setName( $t( "personeelsnummer" ) )
							->setDescription( $t( "Moet het personeelsnummer van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askEmployeeNumber )
							->addSetCallback( function ( $value ) {
								$this->askEmployeeNumber = $value ?? $this->askEmployeeNumber;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askEmployeeNumber))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::EmployeeNumberRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet het personeelsnummer verplicht zijn?" ) )
									->setDefaultValue( $this->employeeNumberRequired )
									->addSetCallback( function ( $value ) {
										$this->employeeNumberRequired = $value ?? $this->employeeNumberRequired;
									})
							)->addClasses("pad-subgroup"),
						$askCostCenterCode = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskCostCenterCode->value )
							->setName( $t( "Kostenplaats" ) )
							->setDescription( $t( "Moet de kostenplaats van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askCostCenterCode )
							->addSetCallback( function ( $value ) {
								$this->askCostCenterCode = $value ?? $this->askCostCenterCode;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askCostCenterCode))->equals()->value(true)
							)->addContents(
								(new BoolInput())
									->setIndex( StudentSettingsEnum::CostCenterCodeRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de kostenplaats verplicht zijn?" ) )
									->setDefaultValue( $this->costCenterCodeRequired )
									->addSetCallback( function ( $value ) {
										$this->costCenterCodeRequired = $value ?? $this->costCenterCodeRequired;
									})
							)->addClasses("pad-subgroup"),
						$askInternalReference = (new BoolInput())
							->setIndex( StudentSettingsEnum::AskInternalReference->value )
							->setName( $t( "Interne referentie" ) )
							->setDescription( $t( "Moet de interne referentie van de cursist gevraagd worden?" ) )
							->setDefaultValue( $this->askInternalReference )
							->addSetCallback( function ( $value ) {
								$this->askInternalReference = $value ?? $this->askInternalReference;
							}),
						(new BasicGroup())
							->addConditions(
								(new InputValueCondition($askInternalReference))->equals()->value(true)
							)->addContents(
								( new BoolInput() )
									->setIndex( StudentSettingsEnum::InternalReferenceRequired->value )
									->setName( $t( "Verplicht" ) )
									->setDescription( $t( "Moet de interne referentie verplicht zijn?" ) )
									->setDefaultValue( $this->internalReferenceRequired )
									->addSetCallback( function ( $value ) {
										$this->internalReferenceRequired = $value ?? $this->internalReferenceRequired;
									})
							)->addClasses("pad-subgroup"),
					),
				(new BoolInput())
					->setIndex( StudentSettingsEnum::AdditionalRemark->value )
					->setName( $t( "Opmerkingen vragen?" ) )
					->setDescription( $t( "Moet er een opmerking gevraagd worden?" ) )
					->setDefaultValue( $this->askRemark )
					->addSetCallback( function ( $value ) {
						$this->askRemark = $value ?? $this->askRemark;
					}),
				( new CollapsibleGroup() )
					->setHeader( $t( "Cursus opties" ) )
					->setDescription( $t( "Welke opties worden gegeven in het boekingsformulier bij cursist " .
					                      "wanneer deze beschikbaar zijn?" ) )
					->addContents(
						$askCode95 = (new BoolInput())
							->setIndex( StudentSettingsEnum::AllowCode95Booking->value )
							->setName( $t( "Code 95" ) )
							->setDescription( $t( "Moet de optie voor code 95 gegeven worden? Dit wordt alleen " .
							                      "gedaan wanneer dit beschikbaar is." ) )
							->setDefaultValue( $this->askCode95 )
							->addSetCallback( function ( $value ) {
								$this->askCode95 = $value ?? $this->askCode95;
							}),
						( new BasicGroup() )
							->addConditions(
								(new InputValueCondition($askCode95))->equals()->value(true)
							)
							->addContents(
								( new StringInput() )
									->setIndex( StudentSettingsEnum::Code95BookingDescription->value )
									->setName( $t( "Code 95 tekst" ) )
									->setDescription( $t("Tekst die wordt gebruikt voor de code 95 optie"))
									->setDefaultValue( $this->code95Text )
									->setPlaceholder( $t( "Cursus bevat code95, deze deelnemer ook meteen hiervoor aanmelden?" ) )
									->addSetCallback( function ( $value ) {
										$this->code95Text = $value ?? $this->code95Text;
									})
									->addValidator(
										new Required( $t( "Deze tekst is verplicht als de optie wordt gevraagd" ) )
									)
							)->addClasses("pad-subgroup"),
						$askSoob = (new BoolInput())
							->setIndex( StudentSettingsEnum::AllowSOOBBooking->value )
							->setName( $t( "SOOB" ) )
							->setDescription( $t( "Moet de optie voor Soob gegeven worden? Dit wordt alleen " .
							                      "gedaan wanneer dit beschikbaar is." ) )
							->setDefaultValue( $this->askSoob )
							->addSetCallback( function ( $value ) {
								$this->askSoob = $value ?? $this->askSoob;
							}),
						( new BasicGroup() )
							->addConditions(
								(new InputValueCondition($askSoob))->equals()->value(true)
							)->addContents(
								( new StringInput() )
									->setIndex( StudentSettingsEnum::SOOBBookingDescription->value )
									->setName( $t( "SOOB tekst" ) )
									->setDescription( $t("Tekst die wordt gebruikt voor de SOOB optie") )
									->setDefaultValue( $this->soobText )
									->setPlaceholder( $t( "Cursus bevat SOOB, deze deelnemer ook meteen hiervoor aanmelden?" ) )
									->addSetCallback( function ( $value ) {
										$this->soobText = $value ?? $this->soobText;
									})
									->addValidator(
										new Required( $t( "Deze tekst is verplicht als de optie wordt gevraagd" ) )
									)
							)->addClasses("pad-subgroup"),
					),
				( new BasicGroup() )
					->addConditions(
						( new InputValueCondition($askCostCenterCode))->equals()->value(true)
					)->addContents(
						( new StringInput() )
							->setIndex( StudentSettingsEnum::CostCenterCodeName->value )
							->setName( $t( "Kostenplaats tekst" ) )
							->setDescription( $t("De text die wordt gebruikt voor 'kostenplaats'"))
							->setDefaultValue( $this->costCenterCodeName )
							->setPlaceholder( $t( "Kostenplaats" ) )
							->addSetCallback( function ( $value ) {
								$this->costCenterCodeName = $value ?? $this->costCenterCodeName;
							})
							->addValidator(
								new Required( $t( "Deze tekst is verplicht als om de kostenplaats wordt gevraagd" ) )
							)
					)
			);
	}

	/**
	 * @return array{values:mixed[], subGroups:array[], subGroupAliases:string[]}
	 */
	public function getEnumMapping(): array {
		return [
			"values"          => [
				StudentSettingsEnum::AskGender->value => &$this->askGender,
				StudentSettingsEnum::GenderRequired->value => &$this->genderRequired,

				StudentSettingsEnum::AskInitials->value => &$this->askInitials,
				StudentSettingsEnum::InitialsRequired->value => &$this->initialsRequired,

				StudentSettingsEnum::AskPhoneNumber->value => &$this->askPhoneNumber,
				StudentSettingsEnum::PhoneNumberRequired->value => &$this->phoneNumberRequired,

				StudentSettingsEnum::AskPlaceOfBirth->value => &$this->askPlaceOfBirth,
				StudentSettingsEnum::PlaceOfBirthRequired->value => &$this->placeOfBirthRequired,

				StudentSettingsEnum::AskDateOfBirth->value => &$this->askDateOfBirth,
				StudentSettingsEnum::DateOfBirthRequired->value => &$this->dateOfBirthRequired,

				StudentSettingsEnum::AskMaidenName->value => &$this->askMaidenName,
				StudentSettingsEnum::MaidenNameRequired->value => &$this->maidenNameRequired,

				StudentSettingsEnum::AskEmployeeNumber->value => &$this->askEmployeeNumber,
				StudentSettingsEnum::EmployeeNumberRequired->value => &$this->employeeNumberRequired,

				StudentSettingsEnum::AskCostCenterCode->value => &$this->askCostCenterCode,
				StudentSettingsEnum::CostCenterCodeRequired->value => &$this->costCenterCodeRequired,

				StudentSettingsEnum::AskCompanyPosition->value => &$this->askCompanyPosition,
				StudentSettingsEnum::CompanyPositionRequired->value => &$this->companyPositionRequired,

				StudentSettingsEnum::AskInternalReference->value => &$this->askInternalReference,
				StudentSettingsEnum::InternalReferenceRequired->value => &$this->internalReferenceRequired,

				StudentSettingsEnum::AskCallingName->value => &$this->askNickName,
				StudentSettingsEnum::CallingNameRequired->value => &$this->nickNameRequired,

				StudentSettingsEnum::AskAddress->value => &$this->askAddress,
				StudentSettingsEnum::AddressRequired->value => &$this->addressRequired,

				StudentSettingsEnum::AdditionalRemark->value => &$this->askRemark,
				StudentSettingsEnum::AllowCode95Booking->value => &$this->askCode95,
				StudentSettingsEnum::AllowSOOBBooking->value => &$this->askSoob,
				StudentSettingsEnum::CostCenterCodeName->value => &$this->costCenterCodeName,
				StudentSettingsEnum::Code95BookingDescription->value => &$this->code95Text,
				StudentSettingsEnum::SOOBBookingDescription->value => &$this->soobText,
			],
			"subGroups"       => [],
			"subGroupAliases" => []
		];
	}

	public function isAskPhoneNumber(): bool {
		return $this->askPhoneNumber;
	}

	public function isPhoneNumberRequired(): bool {
		return $this->phoneNumberRequired;
	}

	public function isAskPlaceOfBirth(): bool {
		return $this->askPlaceOfBirth;
	}

	public function isPlaceOfBirthRequired(): bool {
		return $this->placeOfBirthRequired;
	}

	public function isAskDateOfBirth(): bool {
		return $this->askDateOfBirth;
	}

	public function isDateOfBirthRequired(): bool {
		return $this->dateOfBirthRequired;
	}

	public function isAskMaidenName(): bool {
		return $this->askMaidenName;
	}

	public function isMaidenNameRequired(): bool {
		return $this->maidenNameRequired;
	}

	public function isAskEmployeeNumber(): bool {
		return $this->askEmployeeNumber;
	}

	public function isEmployeeNumberRequired(): bool {
		return $this->employeeNumberRequired;
	}

	public function isAskCostCenterCode(): bool {
		return $this->askCostCenterCode;
	}

	public function isCostCenterCodeRequired(): bool {
		return $this->costCenterCodeRequired;
	}

	public function isAskCompanyPosition(): bool {
		return $this->askCompanyPosition;
	}

	public function isCompanyPositionRequired(): bool {
		return $this->companyPositionRequired;
	}

	public function isAskInternalReference(): bool {
		return $this->askInternalReference;
	}

	public function isInternalReferenceRequired(): bool {
		return $this->internalReferenceRequired;
	}

	public function isAskNickName(): bool {
		return $this->askNickName;
	}

	public function isNickNameRequired(): bool {
		return $this->nickNameRequired;
	}

	public function isAskAddress(): bool {
		return $this->askAddress;
	}

	public function isAddressRequired(): bool {
		return $this->addressRequired;
	}

	public function isAskRemark(): bool {
		return $this->askRemark;
	}

	public function isAskCode95(): bool {
		return $this->askCode95;
	}

	public function isAskSoob(): bool {
		return $this->askSoob;
	}

	public function getCostCenterCodeName(): string {
		return $this->costCenterCodeName;
	}

	public function getCode95Text(): string {
		return $this->code95Text;
	}

	public function getSoobText(): string {
		return $this->soobText;
	}

	public function isAskGender(): bool {
		return $this->askGender;
	}

	public function isGenderRequired(): bool {
		return $this->genderRequired;
	}

	public function isAskInitials(): bool {
		return $this->askInitials;
	}

	public function isInitialsRequired(): bool {
		return $this->initialsRequired;
	}
}