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

namespace Kufer\Web\KuferTools\Teilnehmer\Punkte\BestaetigePunkte;

class BestaetigePunkteUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public const PUNKTE_BESTAETIGEN_ERFOLGREICH = 'punkteBestaetigenErfolgreich';
  public const PUNKTE_BESTAETIGEN_UND_KURSANMELDUNG_ERFOLGREICH = 'punkteBestaetigenUndKursanmeldungErfolgreich';
  public const PUNKTE_BESTAETIGEN_FEHLER = 'punkteBestaetigenFehler';
  public const PUNKTE_BESTAETIGEN_UNGUELTIGER_ANMELDESTATUS_FEHLER = 'punkteBestaetigenUngueltigerAnmeldestatusFehler';
  public const PUNKTE_BESTAETIGEN_KURS_NICHT_EXTERN_UND_HAT_GEBUEHR_FEHLER = 'punkteBestaetigenKursNichtExternUndHatGebuehrFehler';
  public const PUNKTE_BESTAETIGEN_KURSENDE_NICHT_ERREICHT_FEHLER = 'punkteBestaetigenKursendeNichtErreichtFehler';
  public const PUNKTE_BESTAETIGEN_DMZ_FEHLER = 'punkteBestaetigenDmzFehler';

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

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

  public static function getToolSectionId()
  {
    return 357;
  }

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

    return true;
  }

  public function action()
  {
    if (\SessionOperations::isDmzBetrieb()) {
      $this->bestaetigePunkte();
    } else {
      \Logger::logg('Wie sollen denn die Punkte über die DMZ bestätigt werden, wenn die DMZ nicht richtig konfiguriert ist?', 500);
      $this->response->statusCode = self::PUNKTE_BESTAETIGEN_DMZ_FEHLER;
    }

    return $this->response;
  }

  protected function bestaetigePunkte()
  {
    $dbwBelegung = new \DBWorkBelegung();
    $belApi = new \BelegungAPI();
    $user = $this->getUser();

    if ($this->request->belegId > 0) {
      
      $belegung = $dbwBelegung->getBelegung($this->request->belegId);
      if (\BelegungOperations::isPunkteBestaetigenAllowed($belegung)) {
        try {
          $belApi->codeFuerBelegungEintragen($this->request->code, $this->request->belegId);
          
          $belegung->pkt_ok_stat = true;
          $belegung->pkt_ok_am = \DateTimeOperations::getDateNow();
          $belegung->pkt_ok_von = \SessionOperations::getCurrentWebToolsUserKennung();
          $dbwBelegung->updateBelegung($belegung, true);
          $this->response->statusCode = self::PUNKTE_BESTAETIGEN_ERFOLGREICH;
        } catch (\Exception $e) {
          \Logger::logg('Fehler beim Punkte bestätigen: ' . $e->getMessage(), 200);
          $this->response->statusCode = self::PUNKTE_BESTAETIGEN_FEHLER;
          
          if ($e instanceof \AbgleichApiException) {
            if ($e->errorType == \AbgleichApiResult::KURS_CODE_UNGUELTIGER_ANMELDESTATUS) {
              $this->response->statusCode = self::PUNKTE_BESTAETIGEN_UNGUELTIGER_ANMELDESTATUS_FEHLER;
            }
          }
        }
      } else {
        $this->response->statusCode = self::PUNKTE_BESTAETIGEN_KURSENDE_NICHT_ERREICHT_FEHLER;
      }
    } else {
      

      try {
        $dmzResult = $belApi->codeFuerNeueBelegung($this->request->code, $user->tnr);
        

        $belegung = $dbwBelegung->getNewObject();
        $belegung->knr = $dmzResult->reason;
        $belegung->tnr = $user->tnr;
        $belegung->anm_datum = \DateTimeOperations::getDateNow();
        $belegung->bemerkung = 'Eintrag aus dem Web generiert (online) - Punkte - Code Eingabe';
        $belegung->pkt_ok_stat = true;
        $belegung->pkt_ok_am = \DateTimeOperations::getDateNow();
        $belegung->pkt_ok_von = \SessionOperations::getCurrentWebToolsUserKennung();
        $dbanmeldung = new \DBWorkAnmeldungReservierung(1, true);
        $dbanmeldung->Anmeldung($belegung, $user->id, 'P');
        $this->response->statusCode = self::PUNKTE_BESTAETIGEN_UND_KURSANMELDUNG_ERFOLGREICH;
      } catch (\Exception $e) {
        \Logger::logg('Fehler beim Punkte bestätigen: ' . $e->getMessage(), 200);
        $this->response->statusCode = self::PUNKTE_BESTAETIGEN_FEHLER;
        
        if ($e instanceof \AbgleichApiException) {
          if ($e->errorType == \AbgleichApiResult::KURS_CODE_UNGUELTIGER_ANMELDESTATUS) {
            $this->response->statusCode = self::PUNKTE_BESTAETIGEN_UNGUELTIGER_ANMELDESTATUS_FEHLER;
          } elseif ($e->errorType == \AbgleichApiResult::KURS_CODE_KURS_NICHT_EXTERN_UND_HAT_GEBUEHR) {
            $this->response->statusCode = self::PUNKTE_BESTAETIGEN_KURS_NICHT_EXTERN_UND_HAT_GEBUEHR_FEHLER;
          }
        }
      }
    }
  }
}

class BestaetigePunkteRequest
{
  public $codeBelegId;
  public $code;
  public $belegId;
}

class BestaetigePunkteResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $statusCode;
}