<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

declare(strict_types = 1);

namespace Kufer\Mail\Sender\Settings\Recipient\Einrichtung;

abstract class EMailEinrichtungRecipientWebMitarbeiterSettings extends EMailEinrichtungRecipientWebSettings
{
  
  protected $sendToVerwaltendenMitarbeiter = false;

  
  protected $sendToPlanendenMitarbeiter = false;

  
  protected $sendToEinrichtung;

  
  protected $cacheVerwaltendenMitarbeiter;

  
  protected $cachePlanendenMitarbeiter;

  public function setSettingMailToPlanendenMitarbeiter(?bool $sendToPlanendenMitarbeiter): self
  {
    $this->sendToPlanendenMitarbeiter = $sendToPlanendenMitarbeiter;

    return $this;
  }

  public function setSettingMailToVerwaltendenMitarbeiter(?bool $sendToVerwaltendenMitarbeiter): self
  {
    $this->sendToVerwaltendenMitarbeiter = $sendToVerwaltendenMitarbeiter;

    return $this;
  }

  public function setSettingsVhsEMail(?string $customVhsAddress)
  {
    $this->customAddress = $customVhsAddress;
  }

  
  public function setSettingMailToEinrichtung(?bool $sendToEinrichtung): self
  {
    $this->sendToEinrichtung = $sendToEinrichtung;

    return $this;
  }

  
  public function shouldSendToEinrichtung(): bool
  {
    if ($this->sendToEinrichtung === false) {
      return false;
    }

    if (!$this->sendToPlanendenMitarbeiter && !$this->sendToVerwaltendenMitarbeiter) {
      return true;
    }

    if (!\is_null($this->sendToEinrichtung)) {
      
      return $this->sendToEinrichtung;
    }

    $maPlanend = $this->getPlanendenMitarbeiter();
    $maVerwaltend = $this->getVerwaltendenMitarbeiter();

    $valid = \ValidierungWB::getInstance();

    $maPlanendEMailSet = \is_null($maPlanend) ? false : ($maPlanend->email != '' && $valid->isValidVar('email', $maPlanend->email));
    $maVerwaltendEMailSet = \is_null($maVerwaltend) ? false : ($maVerwaltend->email != '' && $valid->isValidVar('email', $maVerwaltend->email));

    if ($this->sendToPlanendenMitarbeiter && $this->sendToVerwaltendenMitarbeiter) {
      return !$maPlanendEMailSet && !$maVerwaltendEMailSet;
    }

    if ($this->sendToPlanendenMitarbeiter) {
      return !$maPlanendEMailSet;
    }

    if ($this->sendToVerwaltendenMitarbeiter) {
      return !$maVerwaltendEMailSet;
    }

    return true;
  }

  abstract public function getVerwaltendenMitarbeiter(): ?\BASysBenutzer;

  abstract public function getPlanendenMitarbeiter(): ?\BASysBenutzer;

  public function getEinrichtungRecipient(): array
  {
    $result = array();
    if ($this->shouldSendToEinrichtung()) {
      $result[] = $this->getEinrichtungBaseRecipient();
    }

    $valid = \ValidierungWB::getInstance();

    if ($this->sendToPlanendenMitarbeiter) {
      $maPlanend = $this->getPlanendenMitarbeiter();
      if (!\is_null($maPlanend) && $maPlanend->email != '' && $valid->isValidVar('email', $maPlanend->email)) {
        $result[] = $maPlanend;
      }
    }


    if ($this->sendToVerwaltendenMitarbeiter) {
      $maVerwaltend = $this->getVerwaltendenMitarbeiter();
      if (!\is_null($maVerwaltend) && $maVerwaltend->email != '' && $valid->isValidVar('email', $maVerwaltend->email)) {
        $result[] = $maVerwaltend;
      }
    }

    return $result;
  }

  public const RECIPIENT_EINRICHTUNG = 'Einrichtung';
  public const RECIPIENT_PLANENDER_MITARBEITER = 'planenden MitarbeiterIn des Kurses';
  public const RECIPIENT_VERWALTENDER_MITARBEITER = 'verwaltenden MitarbeiterIn des Kurses';

  public function getEinrichtungRecipientPositionNames(): array
  {
    $result = array();
    if ($this->shouldSendToEinrichtung()) {
      $result[] = self::RECIPIENT_EINRICHTUNG;
    }

    if ($this->sendToPlanendenMitarbeiter) {
      $maPlanend = $this->getPlanendenMitarbeiter();
      if (!\is_null($maPlanend) && $maPlanend->email != '') {
        $result[] = self::RECIPIENT_PLANENDER_MITARBEITER;
      }
    }


    if ($this->sendToVerwaltendenMitarbeiter) {
      $maVerwaltend = $this->getVerwaltendenMitarbeiter();
      if (!\is_null($maVerwaltend) && $maVerwaltend->email != '') {
        $result[] = self::RECIPIENT_VERWALTENDER_MITARBEITER;
      }
    }

    return $result;
  }
}