<?php

namespace Planaday\Entities\Booking\DTO;

use ArrayAccess;
use Countable;
use DateTime;
use Planaday\Entities\DatabaseID;
use Planaday\Utility\DataGrouping\Map;
use Traversable;

class BookingStudent {
	use DatabaseID;

	protected ?string $gender = null;
	protected ?string $initials = null;
	protected string $firstName = '';
	protected ?string $nickName = null;
	protected ?string $prefix = null;
	protected string $lastName = '';
	protected ?string $maidenName = null;
	protected ?Address $address = null;
	protected string $email = '';
	protected ?string $phoneNumber = null;
	protected ?DateTime $dateOfBirth = null;
	protected ?string $placeOfBirth = null;
	protected ?string $companyPosition = null;
	protected ?string $costCenterCode = null;
	protected ?string $employeeNumber = null;
	protected ?string $internalReference = null;
	protected ?string $remark = null;
	protected ?bool $stapRegulation = null;
	protected ?bool $isContact = null;
	protected ?bool $processCode95 = null;
	protected ?bool $processSoob = null;
	/** @var ArrayAccess<int, string|string[]>&Traversable<int, string|string[]>&Countable */
	protected ArrayAccess&Traversable&Countable $extraFields;

	public function __construct() {
		$this->extraFields = new Map();
	}

	public function setGender( ?string $gender ): self {
		$this->gender = $gender;

		return $this;
	}

	public function setInitials( ?string $initials ): self {
		$this->initials = $initials;

		return $this;
	}

	public function setFirstName( string $firstName ): self {
		$this->firstName = $firstName;

		return $this;
	}

	public function setNickName( ?string $nickName ): self {
		$this->nickName = $nickName;

		return $this;
	}

	public function setPrefix( ?string $prefix ): self {
		$this->prefix = $prefix;

		return $this;
	}

	public function setLastName( string $lastName ): self {
		$this->lastName = $lastName;

		return $this;
	}

	public function setMaidenName( ?string $maidenName ): self {
		$this->maidenName = $maidenName;

		return $this;
	}

	public function setAddress( Address $address ): self {
		$this->address = $address;

		return $this;
	}

	public function setEmail( string $email ): self {
		$this->email = $email;

		return $this;
	}

	public function setPhoneNumber( ?string $phoneNumber ): self {
		$this->phoneNumber = $phoneNumber;

		return $this;
	}

	public function setDateOfBirth( ?DateTime $dateOfBirth ): self {
		$this->dateOfBirth = $dateOfBirth;

		return $this;
	}

	public function setPlaceOfBirth( ?string $placeOfBirth ): self {
		$this->placeOfBirth = $placeOfBirth;

		return $this;
	}

	public function setCompanyPosition( ?string $companyPosition ): self {
		$this->companyPosition = $companyPosition;

		return $this;
	}

	public function setCostCenterCode( ?string $costCenterCode ): self {
		$this->costCenterCode = $costCenterCode;

		return $this;
	}

	public function setEmployeeNumber( ?string $employeeNumber ): self {
		$this->employeeNumber = $employeeNumber;

		return $this;
	}

	public function setInternalReference( ?string $internalReference ): self {
		$this->internalReference = $internalReference;

		return $this;
	}

	public function setRemark( ?string $remark ): self {
		$this->remark = $remark;

		return $this;
	}

	public function setStapRegulation( ?bool $stapRegulation ): self {
		$this->stapRegulation = $stapRegulation;

		return $this;
	}

	public function setIsContact( ?bool $isContact ): self {
		$this->isContact = $isContact;

		return $this;
	}

	public function setProcessCode95( ?bool $processCode95 ): self {
		$this->processCode95 = $processCode95;

		return $this;
	}

	public function setProcessSoob( ?bool $processSoob ): self {
		$this->processSoob = $processSoob;

		return $this;
	}

	/**
	 * @param ArrayAccess<int, string|string[]>&Traversable<int, string|string[]>&Countable $extraFields
	 *
	 * @return $this
	 */
	public function setExtraFields( Countable&Traversable&ArrayAccess $extraFields ): self {
		$this->extraFields = $extraFields;

		return $this;
	}

	public function getGender(): ?string {
		return $this->gender;
	}

	public function getInitials(): ?string {
		return $this->initials;
	}

	public function getFirstName(): string {
		return $this->firstName;
	}

	public function getNickName(): ?string {
		return $this->nickName;
	}

	public function getPrefix(): ?string {
		return $this->prefix;
	}

	public function getLastName(): string {
		return $this->lastName;
	}

	public function getMaidenName(): ?string {
		return $this->maidenName;
	}

	public function getAddress(): Address {
		return $this->address ?? new Address();
	}

	public function getEmail(): string {
		return $this->email;
	}

	public function getPhoneNumber(): ?string {
		return $this->phoneNumber;
	}

	public function getDateOfBirth(): ?DateTime {
		return $this->dateOfBirth;
	}

	public function getPlaceOfBirth(): ?string {
		return $this->placeOfBirth;
	}

	public function getCompanyPosition(): ?string {
		return $this->companyPosition;
	}

	public function getCostCenterCode(): ?string {
		return $this->costCenterCode;
	}

	public function getEmployeeNumber(): ?string {
		return $this->employeeNumber;
	}

	public function getInternalReference(): ?string {
		return $this->internalReference;
	}

	public function getRemark(): ?string {
		return $this->remark;
	}

	public function isStapRegulation(): ?bool {
		return $this->stapRegulation;
	}

	public function isContact(): ?bool {
		return $this->isContact;
	}

	public function isProcessCode95(): ?bool {
		return $this->processCode95;
	}

	public function isProcessSoob(): ?bool {
		return $this->processSoob;
	}

	/**
	 * @return ArrayAccess<int, string|string[]>&Traversable<int, string|string[]>&Countable
	 */
	public function getExtraFields(): ArrayAccess&Traversable&Countable {
		return $this->extraFields;
	}
}