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

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

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()) {
      try {
        $this->setzeKurstagAbrechnung();
        $this->response->isAbgesandt = true;
        $this->response->success = true;
      } catch (\Exception $e) {
        \Logger::logg('DMZ-Fehler Sende Termin Abrechnen: ' . $e->getMessage(), 642);
        $this->response->isAbgesandt = true;
        $this->response->success = false;
      }
    } else {
      $this->response->isAbgesandt = false;
    }

    return $this->getResponse();
  }

  private function setzeKurstagAbrechnung()
  {
    $kurstage = $this->getKurstage();
    $zuSetzendeKurstage = $this->zuSetzendeKurstage($kurstage);
    $zuSperrendeKurstage = $this->zuSperrendeKurstage($kurstage);

    if (count($zuSetzendeKurstage) > 0 || count($zuSperrendeKurstage) > 0) {
      $this->sendeKurstageAnDmz($zuSetzendeKurstage, $zuSperrendeKurstage);
    }
  }

  private function zuSetzendeKurstage($kurstage)
  {
    $abzurechnendeKurstage = $this->request->abzurechnendeKurstage;

    return array_filter($kurstage, function($kurstag) use ($abzurechnendeKurstage) {
      return in_array($kurstag->id, $abzurechnendeKurstage) && $kurstag->rechnungStatus == 12;
    });
  }

  private function zuSperrendeKurstage($kurstage)
  {
    $zuruekzunehmendeKurstage = $this->request->zuruekzunehmendeKurstage;

    return array_filter($kurstage, function($kurstag) use ($zuruekzunehmendeKurstage) {
      return in_array($kurstag->id, $zuruekzunehmendeKurstage) && $kurstag->rechnungStatus == 13;
    });
  }

  private function sendeKurstageAnDmz($zuSetzendeKurstage, $zuSperrendeKurstage)
  {
    

    $zuSetzendeKurstageNode = new \XMLNode('zu_setzende_kurstage');
    foreach ($zuSetzendeKurstage as $kurstag) {
      $kurstageNode = new \XMLNode('kurstage');
      $kurstageNode->addChild(new \XMLNode('id', $kurstag->id));
      $zuSetzendeKurstageNode->addChild($kurstageNode);
    }

    $zuSperrendeKurstageNode = new \XMLNode('zu_sperrende_kurstage');
    foreach ($zuSperrendeKurstage as $kurstag) {
      $kurstageNode = new \XMLNode('kurstage');
      $kurstageNode->addChild(new \XMLNode('id', $kurstag->id));
      $zuSperrendeKurstageNode->addChild($kurstageNode);
    }

    $messageNode = new \XMLNode('honorarabnahme_fuer_kurstage');
    $messageNode->addChild($zuSetzendeKurstageNode);
    $messageNode->addChild($zuSperrendeKurstageNode);
    
    $messageNode->addChild(new \XMLNode('dnr', \SessionOperations::getCurrentWebToolsUser()->dnr));

    $nutzlast = new \Nutzlast($messageNode);

    $abgleichAPI = new \AbgleichAPI();
    $abgleichAPI->sendeNachricht(
      \AbgleichAPI::ERSTELLE_ODER_AKTUALISIERE_HONORAR_ABNAHMEN_FUER_KURSTAGE,
      $nutzlast
    );
  }

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

  protected function getResponse()
  {
    $this->handleResponseStrategies();
    $this->response->knr = $this->request->knr;
    $this->response->kursTagIds = $this->request->kursTagIds;
    $this->response->kursTagIdsStr = $this->request->kursTagIdsStr;

    return $this->response;
  }

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

  private function areKurstageFromKurs()
  {
    $kthelper = new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozKurstageZuKurs($this->toolSettings, $this->getUser(), $this->request, $this->getKurs($this->request->knr));
    
    
    $KurstagIds = $kthelper->getIdsOhneFilter();

    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if (!in_array($kurstag->id, $KurstagIds)) {
        return false;
      }
    }

    return true;
  }

  private function areKurstageAllowed()
  {
    $kurstage = $this->getKurstage();
    $zuSetzendeKurstage = $this->zuSetzendeKurstage($kurstage);
    $zuSperrendeKurstage = $this->zuSperrendeKurstage($kurstage);
    $zuAenderndeKurstage = array_merge($zuSetzendeKurstage, $zuSperrendeKurstage);

    
    foreach ($zuAenderndeKurstage as $kurstag) {
      if ($kurstag->nodoztool) {
        \Logger::logg('Sende Termine abrechnen: Ein Kurstag soll nicht vom Dozenten einsehbar sein. Kurs: ' . $kurstag->knr . ' Kurstag: ' . $kurstag->id, 417);

        return false;
      }

      if ($kurstag->dnr != \SessionOperations::getCurrentWebToolsDozent()->id) {
        \Logger::logg('Sende Termine abrechnen: Ein Kurstag gehört nicht zum Dozenten. Kurs: ' . $kurstag->knr . ' Kurstag: ' . $kurstag->id, 418);

        return false;
      }

      
      
      if ($kurstag->rechnungStatus != 12 && $kurstag->rechnungStatus != 13 && !is_null($kurstag->rechnungStatus)) {
        \Logger::logg('Sende Termine abrechnen: Ein Kurstag hat einen nicht abrechenbaren Status. Kurs: ' . $kurstag->knr . ' Kurstag: ' . $kurstag->id . ' Status: ' . $kurstag->rechnungStatus, 419);

        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);
  }
}