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

namespace Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\Teilnehmer\SammelEinzelBearbeitung;

use Kufer\Web\KuferTools\Basis\UseCase\EinzelKursUseCase;
use Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen;
use Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseWssSammelEinzelnFormularStrategy;

abstract class SammelEinzelBearbeitungFormularUseCase extends EinzelKursUseCase
{
  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new SammelEinzelBearbeitungFormularResponse());
  }

  public function hasAccess($pToolsectionId = null)
  {
    if (is_null($this->request->belegungen) && !is_array($this->request->belids)) {
      return false;
    }

    if (!parent::hasAccess($pToolsectionId)) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $alleIds = $this->getBelegungenIdsOhneFilter();
    $this->request->belids = array_intersect($this->request->belids, $alleIds);

    $this->handleResponseStrategies();

    $this->response->kurs = $this->getKurs($this->getRequestedId());

    $this->response->referer = $this->getBackLink();
    $this->response->refererLabel = $this->getBackButtonLabel();
    $this->response->status = $this->request->status;

    return $this->response;
  }

  protected function getBackLink(): string
  {
    return 'index.php?tool_id=' . static::getToolId() . '&action=kursdetails&knr=' . $this->request->knr . '#reiterTeilnehmer';
  }

  protected function getBackButtonLabel(): string
  {
    return 'Zurück';
  }

  abstract public static function getDescriptionToolSectionId(): int;

  abstract public static function getFormToolSectionId(): int;

  protected function getResponseStrategies()
  {
    return array_merge(
      parent::getResponseStrategies(),
      array(
        new ResponseMitRahmen($this),
        new ResponseWssSammelEinzelnFormularStrategy(
          $this,
          $this->getDescriptionToolSectionId(),
          $this->getFormToolSectionId(),
          $this->getBelegungen()
        ),
        new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseWithToolSettings($this)
      )
    );
  }

  protected function getBelegungen(): array
  {
    if (!is_null($this->request->belegungen)) {
      return $this->request->belegungen;
    }

    return $this->getBelegungsHelper($this->getKurs($this->getRequestedId()))->getDatamoduleByIds($this->getBelegungenIds());
  }

  
  protected function getBelegungenIds(): array
  {
    if (!is_null($this->request->belegungen)) {
      return \ArrayOperations::mapAttribut($this->request->belegungen, 'id');
    }

    if (empty($this->request->belids)) {
      return $this->getBelegungenIdsOhneFilter();
    }

    return $this->request->belids;
  }

  
  protected function getBelegungenIdsOhneFilter(): array
  {
    return $this->getBelegungsHelper($this->getKurs($this->getRequestedId()))->getIdsOhneFilter();
  }

  protected function getBelegungsHelper(\Kurs $kurs): \Kufer\Web\KuferTools\Utils\DatamodulHelper\Belegungen\BelegungsHelper
  {
    return new \Kufer\Web\KuferTools\Utils\DatamodulHelper\Belegungen\ReiterTeilnehmerBelegungen(
      $this->toolSettings,
      $this->request,
      $kurs->id,
      \ToolSettingsAPI::getToolSettings(0)->allowKinder5InTeilnehmerReiter ?? false
    );
  }
}

class SammelEinzelBearbeitungFormularRequest
{
  public $knr;
  public $belids; 
  public $status; 
  public $belegungen; 
}

class SammelEinzelBearbeitungFormularResponse extends \Kufer\Web\KuferTools\Utils\ResponseStrategies\SammelEinzelnFormularResponse
{
  public $kurs;
  public $referer;
  public $refererLabel;
  public $status;
  public $menuPunkte;
  public $user;
}