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

namespace Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\Termine\TermineLoeschen;

use Kufer\Web\KuferTools\Utils\EmailVorbelegen;

abstract class TermineLoeschenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\KurstageUseCase
{
  public const SUCCESS_TERMINE_GELOESCHT = 1;
  public const ERROR_TERMINE_ANZAHL_NULL = 2;
  public const ERROR_TERMINE_UEBERTRAGUNG = 3;
  public const SENT_ERROR = 4;
  public const ERROR_DOPPELT_ABSENDEN = 'DoppeltVersandt';

  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new TermineLoeschenResponse());
  }

  public function action()
  {
    $eintraegeGeloescht = false;

    if (!$this->request->isRefresh) {
      $statusCode = $this->handleTermineDelete($this->request->ktIds);
      if ($statusCode == self::SUCCESS_TERMINE_GELOESCHT) {
        $eintraegeGeloescht = true;
      }
    } else {
      $statusCode = self::ERROR_DOPPELT_ABSENDEN;
    }

    return $this->getResponse($this->request->knr, $statusCode, $eintraegeGeloescht);
  }

  
  protected function postSuccessTerminLoeschen(array $kurstage, array $altPasstKursZuKurstage): ?int
  {
    return null;
  }

  protected function setSessionVarsForMailAnTn(array $pKurstage): void
  {
    EmailVorbelegen\EmailVorbelegenKurstage::setSessionVars($pKurstage);
  }

  protected function sendeBenachrichtigungEmailTermindaten(array $pOrigKurstage): void
  {
    
    
  }

  
  private function handleTermineDelete($zuLoeschendeTerminIDs)
  {
    $dbwKT = new \DBWorkKurseTage();

    $loeschbareTermineIDs = $dbwKT->getKurstageCountFromIDs($zuLoeschendeTerminIDs);
    $anzahlLoeschbareTermine = count($loeschbareTermineIDs);

    if ($anzahlLoeschbareTermine == 0) {
      return self::ERROR_TERMINE_ANZAHL_NULL;
    }

    $apiStatus = '';

    try {
      $kurstage = $dbwKT->getKurstageByIds($loeschbareTermineIDs);
      $altPasstKursZuKurstage = \PasstKursZuKurstageAPI::passenKursdatenZuKurstagen($kurstage[0]->knr);

      if (\SessionOperations::isReplikat()) {
        $korrekturAPI = new \KurskorrekturAPI();
        $correctFields = array();
        $correctFields[] = 'knr';
        $kurstagPaarAry = array();

        foreach ($loeschbareTermineIDs as $terminID) {
          $kurstag = $dbwKT->getKurstag($terminID);
          $kurstagPaarAry[] = new \Tuple($kurstag, $correctFields, $kurstag);
        }

        $apiStatus = $korrekturAPI->correctKurstage($kurstagPaarAry, 'delete');
      }

      if ($apiStatus === 'nichtAktiviert') {
        throw new \Exception('Die DMZ ist nicht aktiviert');
      }

      foreach ($loeschbareTermineIDs as $terminID) {
        $dbwKT->deleteKurstag($terminID);
      }

      $statusCode = self::SUCCESS_TERMINE_GELOESCHT;
      $this->setSessionVarsForMailAnTn($kurstage);

      $this->sendeBenachrichtigungEmailTermindaten($kurstage);

      $statusCode = $this->postSuccessTerminLoeschen($kurstage, $altPasstKursZuKurstage) ?? $statusCode;
    } catch (\Exception $e) {
      \Logger::logg('Löschen von Kurstagen - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
      $statusCode = self::ERROR_TERMINE_UEBERTRAGUNG;
    }

    return $statusCode;
  }

  protected function getResponse($pKnr, $pStatusCode, $pEintraegeGeloescht)
  {
    $this->response->knr = $pKnr;
    $this->response->statusCode = $pStatusCode;
    $this->response->eintraegeGeloescht = $pEintraegeGeloescht;

    return $this->response;
  }
}

class TermineLoeschenRequest extends \Kufer\Web\KuferTools\Basis\UseCase\XsrfRequest
{
  public $knr;
  public $ktIds;
}

class TermineLoeschenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $knr;
  public $statusCode;
  public $eintraegeGeloescht;
}