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

namespace Kufer\Web\KuferTools\Ausgaben\SammelEMail\AnTeilnehmer;

use Kufer\Mail\EMail\IEMail;
use Kufer\Mail\Sender\IEMailSender;
use Kufer\Mail\Sender\Result\EMailSentResult;

abstract class SendSammelEMailUseCase extends \Kufer\Web\KuferTools\Ausgaben\SammelEMail\SendSammelEMailUseCase
{
  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new SendSammelEMailResponse());
  }

  protected function getAttachments(): array
  {
    return \array_merge(parent::getAttachments(), $this->request->uploadFiles ?? array());
  }

  
  protected function getTeilnehmer(): array
  {
    assert(isset($this->request->belegungNummern));

    if (!empty($this->request->knr) && count($this->request->belegungNummern) > 0) {
      $dbwTeilnehmer = new \DBWorkTeilnehmer();

      return $dbwTeilnehmer->getTeilnehmerByBelegAry($this->sendPreparer->getBelegungenIds($this->request->knr, $this->request->belegungNummern, $this->toolSettings->tnstatus));
    } else {
      \Logger::logg(' Fehler im EmailSender: Kursnummer oder Belegungsnummern nicht besetzt. ', 41);

      throw new \Exception('Es wurde kein  Teilnehmer ausgewählt.');
    }
  }

  protected function isUploadFault(): bool
  {
    if (isset($this->uploadFiles)) {
      return \KontaktUserAPI::checkUploadStatus($this->uploadFiles) != '';
    } 

    return false;
  }

  
  protected function deleteUploadFiles(): void
  {
    \UploadOperations::delUploadedFiles($this->request->uploadFiles);
  }

  protected function setEmailStatusReponseFromTeilnehmerResult(EMailSentResult $result): void
  {
    foreach ($result->getRecipients() as $recipient) {
      
      $tn = $recipient->getRecipient();
      $this->response->sendMailStatus[$tn->id] = $recipient->isError() ? self::EMAILVERSAND_FEHLER_BEIM_VERSENDEN : self::EMAILVERSAND_SUCCESS;
    }
  }

  
  abstract protected function getSenderPosition(): string;

  abstract protected function getSenderPerson(): \Personn;

  protected function sendEMail(IEMailSender $sender, IEMail $mail): EMailSentResult
  {
    $result = parent::sendEMail($sender, $mail);
    $teilnehmer = $this->getTeilnehmer();
    $this->response->teilnehmer = $teilnehmer;
    $resultDozentenEmail = \call_user_func(
      array($sender, 'sendFrom' . $this->getSenderPosition() . 'ToTeilnehmer'),
      $mail,
      $this->getSenderPerson(),
      $teilnehmer
    );
    $this->setEmailStatusReponseFromTeilnehmerResult($resultDozentenEmail);
    $result = $result->merge($resultDozentenEmail);

    if ($this->shouldSaveEMailAnTeilnehmerInDokumentenverwaltung()) {
      $this->response->saveTeilnehmer = true;
      $documentManagerBuilder = new \Kufer\Web\KuferTools\Utils\Builder\EMailDokumentenverwaltungBuilder(
        $mail->getSubject(),
        $mail->getContent(),
        $mail->getContentType() == \Kufer\Mail\EMail\IEMail::TYPE_HTML
      );
      $this->transformDocumentManagerBuilder($documentManagerBuilder
        ->addKontakte(\array_map(function(\Kufer\Mail\Sender\Result\EMailSentRecipient $recipient) {
          return $recipient->getRecipient();
        }, \array_merge($resultDozentenEmail->getSuccess(), $resultDozentenEmail->getWarnings())))
        ->setKurs($this->kurs->id)
        ->setInfo('Aus den KuferTools versendet')
        ->setVersandtVomCurrentMitarbeiter())
        ->commit();

      $documentManagerBuilder = new \Kufer\Web\KuferTools\Utils\Builder\EMailDokumentenverwaltungBuilder(
        'Nicht versendet: ' . $mail->getSubject(),
        $mail->getContent(),
        $mail->getContentType() == \Kufer\Mail\EMail\IEMail::TYPE_HTML
      );
      $this->transformDocumentManagerBuilder($documentManagerBuilder
        ->addKontakte(\array_map(function(\Kufer\Mail\Sender\Result\EMailSentRecipient $recipient) {
          return $recipient->getRecipient();
        }, $resultDozentenEmail->getErrors()))
        ->setKurs($this->kurs->id)
        ->setInfo('Fehlerhafter Versandt aus den KuferTools')
        ->setVersandtVomCurrentMitarbeiter())
        ->commit();
    }

    return $result;
  }

  protected function transformDocumentManagerBuilder(\Kufer\Web\KuferTools\Utils\Builder\EMailDokumentenverwaltungBuilder $documentManagerBuilder): \Kufer\Web\KuferTools\Utils\Builder\EMailDokumentenverwaltungBuilder
  {
    return $documentManagerBuilder;
  }

  protected function shouldSaveEMailAnTeilnehmerInDokumentenverwaltung(): bool
  {
    return false;
  }
}