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

namespace Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Termine\TerminAbrechnen;

use Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Termine\HonorarRechnungPdf\Honorarrechnung as Honorarrechnung;

class SendAbrechnungUseCase extends \Kufer\Web\KuferTools\Dozent\KursUebersicht\EinzelKursUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new SendAbrechnungResponse());
  }

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

  public static function getToolSectionId()
  {
    return 4;
  }

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

    return true;
  }

  public function action()
  {
    if (!$this->isReadOnly()) {
      if ($this->saveDokument() && $this->setzeKurstagAbrechnungDatum()) {
        $readonly = true; 

        if ($this->sendMails()) {
          $mailsVersandt = true;
        } else {
          $mailsVersandt = false;
        }

        $this->response->success = true;
      } else {
        $this->response->success = false;
      }
    } else {
      $mailsVersandt = null;
      $readonly = false;
    }

    return $this->getResponse($readonly, $mailsVersandt);
  }

  private function isReadOnly()
  {
    return $this->request->isRefresh || !$this->alleKurstageStatusOk();
  }

  private function alleKurstageStatusOk()
  {
    $kurstage = $this->getKurstage();
    $user = $this->getUser();
    foreach ($kurstage as $kurstag) {
      if (
        $kurstag->dnr != $user->dnr
        || !isset($kurstag->rechnungStatus)
        || $kurstag->rechnungStatus != 1
        || \DateTimeOperations::isDateAfter($kurstag->datum, \DateTimeOperations::getDateNow())) {
        return false;
      }
    }

    return true;
  }

  private function saveDokument()
  {
    $datDoc = $this->getDatDocAry();
    try {
      return \DatDocAPI::sendAllgDokument2DMZ($datDoc, $this->getHonorarPdf()) === 'sendDone';
    } catch (\Exception $e) {
      \Logger::loggException($e, 100);

      return false;
    }
  }

  private function getDatDocAry()
  {
    $kurstage = $this->getKurstage();
    $user = $this->getUser();
    $datDoc = new \Dat_doc();
    $datDoc->knr = $kurstage[0]->knr;
    $datDoc->lfdnr = '';
    $datDoc->nr = $user->dnr;
    $datDoc->typ = 'V';
    $datDoc->pfaddok = '';
    $datDoc->pfadvorlage = $datDoc->pfaddok;
    $datDoc->datnamdok = '';
    $datDoc->datnamvorlage = '';
    $zeitstempel = \DateTimeOperations::getComparableDateTimeExact(\DateTimeOperations::getDateTimeNowExact(), '-', '_');
    $filename = $user->dnr . '_' . $kurstage[0]->knr . '_' . $zeitstempel . '_HR.pdf';
    $datDoc->name = \CodingOperations::convertSingleFileNameSpecialChars($filename);
    $datDoc->versandtvom = $user->getVarValue('name_vorname_ohne_komma');
    $datDoc->beschreibung = 'Honorarrechnungsstellung MVHS';
    $datDoc->info = 'Von Dozent ' . $user->getVarValue('name_vorname_ohne_komma') . ' zum Kurs ' . $kurstage[0]->knr;
    $datDoc->typtxt = 'PDF-Ablage';

    
    
    

    return array($datDoc);
  }

  private function setzeKurstagAbrechnungDatum()
  {
    $kurstage = $this->getKurstage();

    $kurstageOrig = unserialize(serialize($kurstage));
    array_map(function($kurstag) {$kurstag->rechnungseingang = \DateTimeOperations::getDateNow();}, $kurstage);

    if (\SessionOperations::isDmzBetrieb()) {
      $fields = array('rechnungseingang');
      $anzKurstage = count($kurstage);
      $kurstagTuples = array();
      for ($i = 0; $i < $anzKurstage; $i++) {
        $ktInfo = \KurstagAPI::getKurstag4Klassenbuch($kurstage[$i]->id);
        $kurstageOrig[$i]->rechnungseingang = $ktInfo->Rechnungseingang;
        $kurstagTuples[] = new \Tuple($kurstage[$i], $fields, $kurstageOrig[$i]);
      }

      $kursKorrekturAPI = new \KurskorrekturAPI();
      try {
        return in_array($kursKorrekturAPI->correctKurstage($kurstagTuples), array('sendDone', 'noCorrection'));
        
      } catch (\Exception $e) {
        \Logger::loggException($e, 100);

        return false;
      }
    }

    return false;
  }

  private function getDozent()
  {
    return $this->session->getCurrentWebToolsDozent();
  }

  private function getHonorarPdf()
  {
    static $pdf = null;
    if (is_null($pdf)) {
      $kurs = $this->getKursCached();
      $dozent = $this->getDozent();

      
      $honRechnung = new Honorarrechnung($dozent, $kurs, $this->request);
      $pdf = $honRechnung->getAsString();
    }

    return $pdf;
  }

  private function getKursCached()
  {
    static $kurs = null;
    if (is_null($kurs)) {
      $kurs = $this->getKurs($this->request->knr);
    }

    return $kurs;
  }

  
  private function sendMails()
  {
    $user = $this->getUser();
    
    $mailAnMaAry = array('VerwMa' => $this->toolSettings->stornoBenachrichtigungsMailAnVerwMa,
                         'PlanMa' => $this->toolSettings->stornoBenachrichtigungsMailAnPlanMa);
    $kurs = $this->getKursCached();
    $pageIdReiterSeite = 334; 
    $mailAdressAry = \ToolsAPI::getEmailAdressForKursMA($kurs, $this->getToolId(), $pageIdReiterSeite, $mailAnMaAry);
    $dozent = $this->getDozent();
    $senderEmailData = \ToolsAPI::getSenderEmailAddressAndName($dozent);

    $honRechnungPdfName = 'Honorarrechnung Dozent ' . $user->name . ' ' . $user->vorname . ' Kurs ' . $kurs->id . '.pdf';
    $honRechnungPdf = $this->getHonorarPdf();
    $emailAttachment = new \EMailAttachment();
    $emailAttachment->filename = $honRechnungPdfName;
    $emailAttachment->content = $honRechnungPdf;

    $subject = 'neue Honorarrechnung von ' . $user->name . ' ' . $user->vorname . ' zum Kurs ' . $kurs->id;
    $content = 'Der Dozent ' . $user->name . ', ' . $user->vorname . ' hat zum Kurs ' . $kurs->kurzbez . '(' . $kurs->id . ') eine Abrechnung eingereicht. '
      . 'Sie finden diese Abrechnung zum einem im Anhang dieser E-Mail als auch bei den Dokumenten des Dozenten in KuferSQL.';

    $result = false;
    foreach ($mailAdressAry as $mailAdress) {
      $smtp = new \smtpMailTools();
      $smtp->setVar2Value('to', $mailAdress);
      $smtp->setVar2Value('from', $senderEmailData['email']);
      $smtp->SetVar2Value('sendername', $senderEmailData['name']);
      $smtp->SetVar2Value('reply', $senderEmailData['reply']);
      $smtp->SetVar2Value('replyname', $senderEmailData['replyname']);
      $smtp->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
      $smtp->SetVar2Value('doNotSplitHTMLBody', true);
      $smtp->addAttachment($emailAttachment);

      $smtp->setVar2Value('subject', $subject);
      $smtp->setVar2Value('body', $content);

      if ($smtp->sendMail()) {
        $result |= true;
      }
    }

    return $result;
  }

  protected function getResponse($pReadonly, $pMailsVersandt)
  {
    $this->handleResponseStrategies();
    $this->response->knr = $this->request->knr;
    $this->response->kursTagIds = $this->request->kursTagIds;
    $this->response->kursTagIdsStr = $this->request->kursTagIdsStr;
    $this->response->readonly = $pReadonly;
    $this->response->mailsVersandt = $pMailsVersandt;

    if (!$this->request->isRefresh) {
      $this->response->abrechnung = $this->request->abrechnung;
      $this->response->honorarSatz1 = $this->request->honorarSatz1;
      $this->response->honorarSatz2 = $this->request->honorarSatz2;
      $this->response->honorarSatz3 = $this->request->honorarSatz3;
      $this->response->stundenAnzahl1 = $this->request->stundenAnzahl1;
      $this->response->stundenAnzahl2 = $this->request->stundenAnzahl2;
      $this->response->stundenAnzahl3 = $this->request->stundenAnzahl3;
      $this->response->honorarBetrag1 = $this->request->honorarBetrag1;
      $this->response->honorarBetrag2 = $this->request->honorarBetrag2;
      $this->response->honorarBetrag3 = $this->request->honorarBetrag3;
      $this->response->honorarGesamt = $this->request->honorarGesamt;
      $this->response->iban = $this->request->iban;
      $this->response->bic = $this->request->bic;
      $this->response->bankbez = $this->request->bankbez;
      $this->response->steuernr = $this->request->steuernr;
      $this->response->bemerkung = $this->request->bemerkung;
    }

    return $this->response;
  }

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

  private function areKurstageFromKurs()
  {
    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if ($kurstag->kurs->id != $this->request->knr) {
        return false;
      }
    }

    return true;
  }

  private function areKurstageAllowed()
  {
    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if ($kurstag->nodoztool) {
        return false;
      }
    }

    return true;
  }

  private function getKurstage()
  {
    $kthelper = new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozentenKurstage($this->toolSettings, $this->getUser());

    return $kthelper->getDatamoduleByIds($this->request->kursTagIds);
  }
}

class SendAbrechnungRequest
{
  public $knr;
  public $kursTagIds;
  public $isRefresh;
  public $isXsrfOk;

  
  public $abrechnung;
  public $honorarSatz1;
  public $honorarSatz2;
  public $honorarSatz3;
  public $stundenAnzahl1;
  public $stundenAnzahl2;
  public $stundenAnzahl3;
  public $honorarBetrag1;
  public $honorarBetrag2;
  public $honorarBetrag3;
  public $honorarGesamt;
  public $iban;
  public $bic;
  public $bankbez;
  public $steuernr;
  public $kursTagIdsStr;
  public $bemerkung;
}

class SendAbrechnungResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $knr;
  public $kursTagIds;
  public $kursTagIdsStr;
  public $readonly;
  public $mailsVersandt;

  public $user;
  public $menuBar;

  
  public $abrechnung;
  public $honorarSatz1;
  public $honorarSatz2;
  public $honorarSatz3;
  public $stundenAnzahl1;
  public $stundenAnzahl2;
  public $stundenAnzahl3;
  public $honorarBetrag1;
  public $honorarBetrag2;
  public $honorarBetrag3;
  public $honorarGesamt;
  public $iban;
  public $bic;
  public $bankbez;
  public $steuernr;
  public $bemerkung;

  
  public $success;
}