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

namespace Kufer\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Vertrag\VertragMail;

class VertragMail
{
  protected $user;
  protected $kurs;
  
  protected $bemerkung;

  public function __construct($kurs, $bemerkung = '')
  {
    $this->kurs = $kurs;
    $this->bemerkung = $bemerkung;
    $this->user = \SessionOperations::getCurrentWebToolsUser();
  }

  public function sendMails($getMailPresenterInstanceFunction)
  {
    $dozent = \SessionOperations::getCurrentWebToolsDozent();
    $attachment = $this->getEmailAttachment($dozent);
    $mailPresenter = $this->getMailPresenter($getMailPresenterInstanceFunction, is_null($attachment));

    $attachments = array();
    if (!is_null($attachment)) {
      $attachments[] = new \Kufer\Mail\Attachment\EMailAttachmentCustom($attachment->filename, $attachment->content, $attachment->contentType);
    }

    $email = new \Kufer\Mail\EMail\EMailHTML($mailPresenter->getSubject(), $mailPresenter->getBody(), $attachments);

    $toolSettings = \ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_KURSUEBERSICHT_DOZ);
    $recipientSettings = new \Kufer\Mail\Sender\Settings\Recipient\Einrichtung\EMailEinrichtungRecipientToolsKursSettings($this->kurs);
    $recipientSettings
      ->setSettingMailToPlanendenMitarbeiter($toolSettings->vertragEMailAnPlanendenMa)
      ->setSettingMailToVerwaltendenMitarbeiter($toolSettings->vertragEMailAnVerwaltendenMa)
      ->setSettingMailToEinrichtung($toolSettings->vertragEMailAnEinrichtung ? true : null)
      ->setSettingsVhsEMail($toolSettings->vertragEMailEinrichtungAlternative);

    $sender = \Kufer\Mail\Sender\EMailSenderFactory::create();
    $emailResult = $sender->sendFromDozentToEinrichtung($email, $dozent, $recipientSettings);

    return $emailResult->hasSentAnyMails();
  }

  private function getEmailAttachment($dozent)
  {
    if (\DBWorkBASysSettings::isUnnaVhs()) {
      return null;
    }

    
    if (PRAESENTATION) {
      return $this->getEmailAttachmentDemo($dozent);
    } elseif (\DBWorkBASysSettings::isGilchingVhs()) {
      return $this->getEmailAttachmentGilchingVHS($dozent);
    } elseif (\DBWorkBASysSettings::isHeleneWeberHaus()) {
      return $this->getEmailAttachmentHeleneWeberHaus($dozent);
    }

    try {
      $datei = \DatDocAPI::getKursVertragFromDmz($dozent->id, $this->kurs->id);
      
      $vertragPdf = base64_decode($datei->ContentBase64);
      $fileparts = \FSOperations::getFileParts($datei->DateiName);
      $filename = 'Vertrag von Dozent ' . $this->user->name . ' ' . $this->user->vorname . ' Kurs ' . $this->kurs->id . '.' . $fileparts['extension'];

      return new \EMailAttachment($filename, $vertragPdf);
    } catch (\Exception $e) {
      \Logger::logg('Vertrag Akzeptieren E-Mail an Mitarbeiter - Fehler beim Hochladen des Vertrags: ' . $e->getMessage(), 200);

      return null;
    }
  }

  private function getEmailAttachmentDemo($dozent)
  {
    $vertrag = new \Kufer\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Demo\VertragPdf\Vertrag($this->kurs, $dozent);
    $datei = $vertrag->getFile();
    $filename = 'Vertrag von Dozent ' . $this->user->name . ' ' . $this->user->vorname . ' Kurs ' . $this->kurs->id . '.pdf';

    return new \EMailAttachment($filename, $datei);
  }

  private function getEmailAttachmentGilchingVHS($dozent)
  {
    $vertrag = new \Kufer\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\GilchingVhs\VertragPdf\Vertrag($this->kurs, $dozent);
    $datei = $vertrag->getFile();
    $filename = 'Vertrag von Dozent ' . $this->user->name . ' ' . $this->user->vorname . ' Kurs ' . $this->kurs->id . '.pdf';

    return new \EMailAttachment($filename, $datei);
  }

  private function getEmailAttachmentHeleneWeberHaus($dozent)
  {
    $vertrag = new \Kufer\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\HeleneWeberHaus\VertragPdf\Vertrag($this->kurs, $dozent);
    $datei = $vertrag->getFile();
    $filename = 'Vertrag von Dozent ' . $this->user->name . ' ' . $this->user->vorname . ' Kurs ' . $this->kurs->id . '.pdf';

    return new \EMailAttachment($filename, $datei);
  }

  private function getMailPresenter($getMailPresenterInstanceFunction, $attachmentError)
  {
    $emailData = new \stdClass();
    $emailData->kurs = $this->kurs;
    $emailData->attachmentError = $attachmentError;
    $emailData->bemerkung = $this->bemerkung;

    return call_user_func($getMailPresenterInstanceFunction, $emailData);
  }
}