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

namespace Kufer\Web\KuferTools\Basis\TeilnehmerInfo\SammelEMail;

use Kufer\Mail\Sender\Result\EMailSentStatusCode;

abstract class SendSammelEMailUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public const EMAILVERSAND_SUCCESS = 0;
  public const EMAILVERSAND_FEHLER_BEIM_VERSENDEN = 1;
  public const EMAILVERSAND_UNGUELTIGE_ODER_LEERE_EMAIL = 2;
  public const EMAILVERSAND_STANDBY = 3;

  public function __construct($request)
  {
    parent::__construct($request, new SendSammelEMailResponse());
  }

  public function hasAccess($pToolSectionId = null)
  {
    
    
    if (!parent::hasAccess()) {
      return false;
    }
    
    
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  
  public function getTeilnehmer()
  {
    
    

    
    if (is_array($this->request->tnNummern) && count($this->request->tnNummern) > 0 && count($this->request->tnNummern) == 1) {
      
      $dbwTn = new \DBWorkTeilnehmer(1, true);

      return $dbwTn->getTeilnehmByIdArray($this->request->tnNummern);
    } else {
      \Logger::logg(' Fehler im EmailSender: TeilnehmerNummern nicht besetzt. ', 41);

      throw new \Exception('Fehler beim Versenden der EMail an die Teilnehmer');
    }
  }

  public function setStatusFromMailSentResult(\Kufer\Mail\Sender\Result\EMailSentResult $sentResult)
  {
    foreach ($sentResult->getRecipients() as $recipient) {
      if (!($recipient->getRecipient() instanceof \Teilnehmer)) {
        continue;
      }

      switch ($recipient->getStatusCode()) {
        case EMailSentStatusCode::SUCCESSFULL:
        case EMailSentStatusCode::WARNING_EMAIL_SENDER_NOT_FOUND:
          $status = self::EMAILVERSAND_SUCCESS;
          break;
        case EMailSentStatusCode::FAILURE_EMAIL_NOT_FOUND:
          $status = self::EMAILVERSAND_UNGUELTIGE_ODER_LEERE_EMAIL;
          break;
        default:
          $status = self::EMAILVERSAND_FEHLER_BEIM_VERSENDEN;
          break;
      }

      $this->response->sendMailStatus[$recipient->getRecipient()->id] = $status;
    }
  }

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

  public function action()
  {
    $errorMessage = '';
    $teilnehmer = array();
    try {
      
      $teilnehmer = $this->getTeilnehmer();

      if ($this->hasUploadError()) {
        $this->response->uploadFailed = true;
      }
      
      elseif ($this->request->isRefresh) {
        $this->response->doppeltSenden = true;
      }
      
      else {
        
        $sentResult = $this->sendMail($this->createEMail(), $teilnehmer);
        $this->setStatusFromMailSentResult($sentResult);
      }
    } catch (\Exception $e) {
      $errorMessage = $e->getMessage();
      \Logger::logg(' Fehler beim Versenden der Sammel E-Mail. ' . $errorMessage, 41);
    }

    return $this->getResponse($errorMessage, $teilnehmer);
  }

  
  protected function getResponse($pErrorMessage, $teilnehmer)
  {
    $this->handleResponseStrategies();
    $this->response->errorMessage = $pErrorMessage;
    $this->response->teilnehmer = $teilnehmer;
    $this->response->backLink = \Kufer\Web\KuferTools\Utils\Referrer::getReferrerFromSession($this->getToolId(), 'index.php?tool_id=' . $this->getToolId(), 'sammel_email');
    $this->response->backButtonLabel = \Kufer\Web\KuferTools\Utils\Referrer::getReferrerLabelFromSession($this->getToolId(), 'Zurück', 'sammel_email');

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
        new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this)
    );
  }

  protected function createEMail(): \Kufer\Mail\EMail\IEMail
  {
    return new \Kufer\Mail\EMail\EMailPlaintext($this->request->emailBetreff, $this->request->emailBody);
  }

  abstract protected function sendMail(\Kufer\Mail\EMail\IEMail $email, array $teilnehmer): \Kufer\Mail\Sender\Result\EMailSentResult;
}