<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

namespace Kufer\Web\KuferTools\Mitarbeiter\DozentenInfo\SammelEMail;

use Kufer\Mail\Address\EMailAddress;
use Kufer\Mail\Address\IEMailAddress;
use Kufer\Mail\EMail\IEMail;
use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Mail\Sender\Result\EMailSentResult;
use Kufer\Mail\Sender\Settings\Sender\Einrichtung\IEMailEinrichtungSenderSettings;
use Kufer\Mail\Sender\Settings\Sender\Person\EMailTransformSenderTools;

class SendSammelEMailUseCase extends \Kufer\Web\KuferTools\Basis\DozentenInfo\SammelEMail\SendSammelEMailUseCase
{
  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess($pToolSectionId)) {
      return false;
    }

    if (!\CleanOperations::isInt($this->request->email_num) || $this->request->email_num > 2 || $this->request->email_num < 0) {
      return false;
    }

    return true;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_DOZENTENINFO_MA;
  }

  public static function getToolSectionId()
  {
    return 54;
  }

  protected function sendMail(IEMail $email, array $dozenten): EMailSentResult
  {
    $tool0Settings = \ToolSettingsAPI::getToolSettings(0);
    $emailAnDozentSenderMultiple = $this->toolSettings->emailAnDozentSenderMultiple && $tool0Settings->absenderMitarbeiterAnDozent === 'Person';
    $fnTransform = !$emailAnDozentSenderMultiple ? null : function() {
      return new class($this->request->email_num) extends EMailTransformSenderTools {
        public $email_num;

        public function __construct($email_num)
        {
          $this->email_num = $email_num;
        }

        public function getSenderForMitarbeiterToDozent(\BASysBenutzer $mitarbeiter, IEMailEinrichtungSenderSettings $senderSettings): IEMailAddress
        {
          $result = parent::getSenderForMitarbeiterToDozent($mitarbeiter, $senderSettings);
          if ($result != $mitarbeiter) {
            return $result; 
          }

          return $this->getSenderTo($mitarbeiter, $senderSettings);
        }

        public function getReplyToForMitarbeiterToDozent(\BASysBenutzer $mitarbeiter, IEMailEinrichtungSenderSettings $senderSettings): IEMailAddress
        {
          $result = parent::getReplyToForMitarbeiterToDozent($mitarbeiter, $senderSettings);
          if ($result != $mitarbeiter) {
            return $result; 
          }

          return $this->getSenderTo($mitarbeiter, $senderSettings);
        }

        protected function getSenderTo(\BASysBenutzer $mitarbeiter, IEMailEinrichtungSenderSettings $senderSettings): IEMailAddress
        {
          $valid = \ValidierungWB::getInstance();
          switch ($this->email_num) {
            default:
            case '0':
              return $mitarbeiter;
            case '1':
              if (!$valid->isValidVar('email', $mitarbeiter->email2)) {
                return $mitarbeiter;
              } else {
                return new EMailAddress($mitarbeiter->getEMailName(), $mitarbeiter->email2);
              }
              
            case '2':
              if (!$valid->isValidVar('email', $mitarbeiter->email3)) {
                return $mitarbeiter;
              } else {
                return new EMailAddress($mitarbeiter->getEMailName(), $mitarbeiter->email3);
              }
          }
        }
      };
    };

    $sender = EMailSenderFactory::create($fnTransform);

    return $sender->sendFromMitarbeiterToDozent($email, \SessionOperations::getCurrentWebToolsMitarbeiter(), $dozenten);
  }
}