<?php

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

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

class MailOptions extends OptionGroup implements ComponentRegistryShortCut {
	private const NAME = 'Mail Opties';
	private const DESCRIPTION = 'Opties voor de mails die mogelijk na een boeking gestuurd kunnen worden';

	private const STUDENT_MAIL_CONTENTS_DEFAULT =
		"Hallo {naam},\n" .
		"\n" .
		"Er is een aanmelding binnengekomen voor de cursus: {cursus} met startdatum: {startdatum}.\n" .
		"Deze aanmelding voor de cursus/opleiding is bij ons binnengekomen en moet nog worden verwerkt.\n" .
		"Zodra wij deze hebben verwerkt krijg je nog een definitieve bevestiging per E-mail.\n" .
		"\n" .
		"Met vriendelijke groet,\n" .
		"\n" .
		"-- \n" .
		"{website}\n";

	private const STUDENT_MAIL_CONTENTS_DESCRIPTION =
		"Mail die wordt gestuurd na het boeken, indien hierboven op 'ja' staat.<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} = Voor en achternaam</li>
            <li>{voornaam} = Voornaam</li>
            <li>{achternaam} = Achternaam</li>
            <li>{website} = Titel/naam van deze website</li>
            <li>{idealtransactieid} = TransactieID van iDeal indien betalingen actief</li>
            <li>{padboekingid} = BoekingID vanuit Planaday als boeking is gelukt</li>
            <li>{betaald} = Melding of betaling is gelukt</li>
            <li>{bedrag} = Afgerekende bedrag</li>
        </ul><br/>
        <i><strong>Tip: gebruik hier geen plugins of shortcodes oid.</strong></i>";

	private const COMPANY_MAIL_CONTENTS_DESCRIPTION =
		"Mail die wordt gestuurd na het boeken, indien hierboven op 'ja' staat.<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>{bedrijfsnaam} = Bedrijfsnaam</li>
            <li>{studenteninfo} = Lijst met aangemelde cursisten</li>
            <li>{betaalinfo} = Informatie over betaling</li>
            <li>{website} = Titel/naam van deze website</li>
            <li>{padboekingid} = BoekingID vanuit Planaday als boeking is gelukt</li>
            <li>{betaald} = Melding of betaling is gelukt</li>
            <li>{bedrag} = Afgerekende bedrag</li>
        </ul>
        <br/>
        <i><strong>Tip: gebruik hier geen plugins of shortcodes oid.</strong></i>";

	
	/** @var BoolOption<bool>  */
	private $studentToggle;
	
	/** @var TextOption<string>  */
	private $studentContents;
	
	/** @var BoolOption<bool>  */
	private $companyToggle;
	
	/** @var TextOption<null>  */
	private $companyContents;
	
	/** @var BoolOption<bool>  */
	private $adminToggle;
	
	/** @var StringOption<null>  */
	private $adminAddress;

	public function __construct( string $index, array $data ) {
		$this->studentToggle = new BoolOption(
			MailOptionsEnum::MAIL_STUDENT,
			'Cursist mailen?',
			'Moet cursist een mail krijgen dat aanmelding wel/niet is gelukt?',
			$data[ MailOptionsEnum::MAIL_STUDENT ] ?? null,
			false
		);

		$this->studentContents = new TextOption(
			MailOptionsEnum::MAIL_STUDENT_CONTENTS,
			'Mail tekst naar cursist',
			self::STUDENT_MAIL_CONTENTS_DESCRIPTION,
			$data[ MailOptionsEnum::MAIL_STUDENT_CONTENTS ] ?? null,
			self::STUDENT_MAIL_CONTENTS_DEFAULT
		);

		$this->companyToggle = new BoolOption(
			MailOptionsEnum::MAIL_COMPANY,
			'Bedrijf mailen?',
			'Moet bedrijf een mail krijgen dat aanmelding wel/niet is gelukt?',
			$data[ MailOptionsEnum::MAIL_COMPANY ] ?? null,
			false
		);

		$this->companyContents = new TextOption(
			MailOptionsEnum::MAIL_COMPANY_CONTENTS,
			'Mail tekst naar bedrijf',
			self::COMPANY_MAIL_CONTENTS_DESCRIPTION,
			$data[ MailOptionsEnum::MAIL_COMPANY_CONTENTS ] ?? null,
			null
		);

		$this->adminToggle = new BoolOption(
			MailOptionsEnum::MAIL_ADMIN,
			'Zelf aanmelding ook ontvangen?',
			'wilt u mails krijgen dat aanmeldingen wel/niet zijn gelukt?',
			$data[ MailOptionsEnum::MAIL_ADMIN ] ?? null,
			false
		);

		$this->adminAddress = new StringOption(
			MailOptionsEnum::ADMIN_ADDRESS,
			'E-mail adres',
			'E-mailadres waar u aanmeldingen op wilt ontvangen.',
			$data[ MailOptionsEnum::ADMIN_ADDRESS ] ?? null,
			null
		);

		$layout = [
			new OptionGroup(
				null,
				'Studenten mail',
				'Stuur een mail naar de cursisten van de boeking.',
				[
					$this->studentToggle,
					$this->studentContents
				]
			),
			new OptionGroup(
				null,
				'Bedrijven mail',
				'Stuur een mail naar het bedrijf van de boeking.',
				[
					$this->companyToggle,
					$this->companyContents
				]
			),
			new OptionGroup(
				null,
				'Admin mail',
				'E-mail waar u eventueel aanmeldingen op wilt ontvangen.<br/>' .
				'Ook als een boeking door wat dan ook niet lukt, krijgt u als opleider een mail met alle details.<br/>',
				[
					$this->adminToggle,
					$this->adminAddress
				]
			)
		];

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

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

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

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

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

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

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

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