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

namespace Kufer\Web\KuferTools\Basis\TeilnehmerInfo\Detailsreiter\BelegteKurse\AbmeldenDialog;

abstract class AbmeldenDialogUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\EinzelTeilnehmerUseCase
{
  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new AbmeldenDialogResponse());
  }

  public function action()
  {
    $this->handleResponseStrategies();

    $belegungen = $this->getBelegungen();
    foreach ($belegungen as $belegung) {
      $belegung->stornoShowAustrittFeld = $this->toolSettings->stornoShowAustrittFeld;
    }
    $teilnehmer = $this->getTeilnehmer();

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

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

  protected function getResponse($belegungen, $teilnehmer)
  {
    $this->response->columns = $this->getAbmeldenColumns($belegungen);
    $this->response->belegungen = $belegungen;
    $this->response->teilnehmer = $teilnehmer;

    return $this->response;
  }

  
  protected function getBelegungen()
  {
    static $belegungen = null;
    if (is_null($belegungen)) {
      $dbwBelegung = new \DBWorkBelegung(1, true);
      $kursHelper = \Kufer\Web\KuferTools\Utils\DatamodulHelper\Kurse\KursHelperFactory::getKursHelperByToolID($this->getToolIdKursuebersicht(), \ToolSettingsAPI::getToolSettings($this->getToolIdKursuebersicht()));
      $knrsImToolKursuebersicht = $kursHelper->getIdsMitFilter($this->getToolIdKursuebersicht(), null, null, false);

      $belegungen = $dbwBelegung->getBelegungenByIds($this->request->belegungIds);
      $belegungen = (new \Kufer\Web\Classes\Stream\ArrayStream($belegungen))
        ->filter(static function(\Belegung $belegung) use ($knrsImToolKursuebersicht): bool {
          
          return in_array($belegung->knr, $knrsImToolKursuebersicht);
        })
        ->filter(function(\Belegung $belegung): bool {
          
          return $belegung->tnr == $this->request->tnr;
        })
        ->toArray();
    }

    return $belegungen;
  }

  
  protected function getAbmeldenColumns($pBelegungArray): array
  {
    $columnsArray = array();

    $columnKnr = new \Column();
    $columnKnr->fieldname = 'id';
    $columnKnr->fieldgroup = 'Kursstamm Allgemeines';
    $columnKnr->datamodul = 'kurs';
    $columnKnr->canedit = false;
    $columnKnr->responsive = 'W';
    $columnKnr->title = 'Kursnummer';
    array_push($columnsArray, $columnKnr);

    $columnTitel = new \Column();
    $columnTitel->fieldname = 'kurzbez_titel';
    $columnTitel->fieldgroup = 'Kursstamm Allgemeines';
    $columnTitel->datamodul = 'kurs';
    $columnTitel->canedit = false;
    $columnTitel->responsive = 'W';
    $columnTitel->title = 'Titel';
    array_push($columnsArray, $columnTitel);

    $columnStatus = new \Column();
    $columnStatus->fieldname = 'status';
    $columnStatus->fieldgroup = 'Belegung Allgemeines';
    $columnStatus->datamodul = 'belegung';
    $columnStatus->canedit = false;
    $columnStatus->responsive = 'W';
    $columnStatus->title = 'Status';
    array_push($columnsArray, $columnStatus);

    $columnStatus = new \Column();
    $columnStatus->fieldname = 'storno_status';
    $columnStatus->fieldgroup = 'Belegung Allgemeines';
    $columnStatus->datamodul = 'belegung';
    $columnStatus->canedit = true;
    $columnStatus->responsive = 'W';
    $columnStatus->title = 'Storno-Status';
    array_push($columnsArray, $columnStatus);

    $columnStornoGrund = new \Column();
    $columnStornoGrund->fieldname = 'storno_grund';
    $columnStornoGrund->fieldgroup = 'Belegung Allgemeines';
    $columnStornoGrund->datamodul = 'belegung';
    $columnStornoGrund->canedit = true;
    $columnStornoGrund->responsive = 'W';
    $columnStornoGrund->title = 'Stornierungsgrund';
    array_push($columnsArray, $columnStornoGrund);

    if (count($pBelegungArray) > 0) {
      foreach ($pBelegungArray as $belegung) {
        if ($this->toolSettings->stornoShowAustrittFeld || \APIGebuehren::hasKursFortlaufendeGebuehren($belegung->kurs->id)) {
          $columnAustritt = new \Column();
          $columnAustritt->fieldname = 'austritt_storno';
          $columnAustritt->fieldgroup = 'Belegung Allgemeines';
          $columnAustritt->datamodul = 'belegung';
          $columnAustritt->canedit = true;
          $columnAustritt->responsive = 'W';
          $columnAustritt->title = 'Austritt';
          array_push($columnsArray, $columnAustritt);
          break;
        }
      }
    }

    return $columnsArray;
  }

  
  abstract protected function getMainReiterId(): int;

  protected function getMainReiterIdSection(): int
  {
    return 2;
  }

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

    
    if (!$this->isRechtAllowed($this->getMainReiterId() . '.1.' . $this->getMainReiterIdSection())) {
      return false;
    }

    return true;
  }

  abstract protected function getToolIdKursuebersicht();
}

class AbmeldenDialogRequest
{
  public $belegungIds;
  public $tnr;
  public $tguid;
}

class AbmeldenDialogResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $toolSection;
  public $toolSettings;
  public $kurs;
  public $belegungen;
  public $termine;
  public $columns;
  public $teilnehmer;
}