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

namespace Kufer\KuferTools\Utils\Kurstag\KurstagMedien;

abstract class ZusaetzlicheMedienMail
{
  
  public function sendMailToEinrichtung($kurstagMitMedienZus, $pUser, $mailAnVerwMa)
  {
    
    if ($kurstagMitMedienZus->medien_zus != '' && !\SessionOperations::getVarValueWTIntern('kursplanung_medien_zus_submit_success_' . $kurstagMitMedienZus->id, false)) {
      \SessionOperations::setVarValueWTIntern('kursplanung_medien_zus_' . $kurstagMitMedienZus->id, $kurstagMitMedienZus->medien_zus);

      $sprachsettings = new \SprachSettingsObject();
      $emailSubject = 'Zusätzlich benötigte Medien zu ' . $sprachsettings->Kurs['Singular_mit_Artikel']['Dativ'] . ' ' . $kurstagMitMedienZus->kurs->getVarValue('kurzbez_titel');
      $emailText = $this->getEMailText4MedienZus($kurstagMitMedienZus, $pUser);

      $email = new \Kufer\Mail\EMail\EMailPlaintext($emailSubject, $emailText);
      $email->addKuferToolsFooter('Zusätzlich benötigte Medien für einen Kurstag', $pUser, $kurstagMitMedienZus);

      $recipientSettings = new \Kufer\Mail\Sender\Settings\Recipient\Einrichtung\EMailEinrichtungRecipientToolsKursSettings($kurstagMitMedienZus->kurs);
      $recipientSettings
        ->setSettingMailToVerwaltendenMitarbeiter($mailAnVerwMa);
      $emailSender = \Kufer\Mail\Sender\EMailSenderFactory::create();
      $sendMailResult = $this->sendMail($emailSender, $email, $recipientSettings);

      if ($sendMailResult->hasSentAllMails()) {
        \SessionOperations::setVarValueWTIntern('kursplanung_medien_zus_submit_success_' . $kurstagMitMedienZus->id, true);

        return true;
      } else {
        return false;
      }
    }
    
    
    return false;
  }

  
  private function getEMailText4MedienZus($pKurstag, $user)
  {
    $dbwKurstagMedien = new \DBWorkKurstagMedien(1, true);
    $medienAry = $dbwKurstagMedien->getMedienAryFromMedienStr($pKurstag->medien_zus, $pKurstag->id);
    $result = $this->_getUserNotice4Email($pKurstag, $user);

    foreach ($medienAry as $medium) {
      $result .= $medium->medium . ' ' . $medium->bemerkung;
      $result = rtrim($result); 
      $result .= "\n";
    }

    return $result;
  }

  private function _getUserNotice4Email($pKurstag, $user)
  {
    $userNotice = $this->getSenderBezeichnung() . ' ' . $user->name . ' ' . $user->vorname . ' benötigt zum Kurs ' . $pKurstag->knr . ' (' . $pKurstag->kurs->getVarValue('kurzbez_titel') . ') ';
    $userNotice .= 'zum Kurstag am ' . $pKurstag->datum . ' um ' . $pKurstag->zeit_beg . ' zusätzlich noch folgende weitere Medien:' . "\n\n";

    return $userNotice;
  }

  abstract protected function sendMail($emailSender, $email, $recipientSettings);

  abstract protected function getSenderBezeichnung();
}

class ZusaetzlicheMedienMailDozent extends ZusaetzlicheMedienMail
{
  private $dozent;

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

  protected function sendMail($emailSender, $email, $recipientSettings)
  {
    return $emailSender->sendFromDozentToEinrichtung($email, $this->dozent, $recipientSettings);
  }

  protected function getSenderBezeichnung()
  {
    return 'Dozent';
  }
}

class ZusaetzlicheMedienMailMitarbeiter extends ZusaetzlicheMedienMail
{
  private $mitarbeiter;

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

  protected function sendMail($emailSender, $email, $recipientSettings)
  {
    return $emailSender->sendFromMitarbeiterToEinrichtung($email, $this->mitarbeiter, $recipientSettings);
  }

  protected function getSenderBezeichnung()
  {
    return 'Mitarbeiter';
  }
}

class ZusaetzlicheMedienMailVeranstalter extends ZusaetzlicheMedienMail
{
  private $veranstalter;

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

  protected function sendMail($emailSender, $email, $recipientSettings)
  {
    return $emailSender->sendFromDozentToEinrichtung($email, $this->veranstalter, $recipientSettings);
  }

  protected function getSenderBezeichnung()
  {
    return 'Veranstalter';
  }
}