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

namespace Kufer\Web\KuferTools\Teilnehmer\Visitenkarten\NeueVisitenkarteErstellen\NeueVisitenkarteErstellenSpeichern;

class InsertVisitenkarteUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public const VISITENKARTE_ERSTELLEN_INSERT_SUCCESS = 'visitenkarteInsertSuccess';
  public const VISITENKARTE_ERSTELLEN_BROWSER_REFRESH = 'visitenkarteErstellenBrowserRefresh';

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

  public static function getToolSectionId()
  {
    return 496;
  }

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

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

    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  public function action()
  {
    if (!$this->request->isRefresh) {
      $statusCode = $this->getStatusCodeAfterInsertVisitenkarte();
      $neueVisitenkarteId = $this->response->visitenkarteId;
      \SessionOperations::setVarValueWTIntern('neueVisitenkarteId', $neueVisitenkarteId);
    } else {
      $statusCode = self::VISITENKARTE_ERSTELLEN_BROWSER_REFRESH;
      $neueVisitenkarteId = \SessionOperations::getVarValueWTIntern('neueVisitenkarteId');
    }

    return $this->getResponse($statusCode, $neueVisitenkarteId);
  }

  protected function getResponse($pStatusCode, $pNeueVisitenkarteId)
  {
    $this->response->statusCode = $pStatusCode;
    $this->response->visitenkarteId = $pNeueVisitenkarteId;

    return $this->response;
  }

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

  private function getDbwVisitenkartenWeb()
  {
    return \DBWorkVisitenkartenWeb::getDefaultInstance(1, true);
  }

  private function getDbwFachgebiete()
  {
    return \DBWorkFachgebieteVisitenkartenWeb::getDefaultInstance(1, true);
  }

  private function getStatusCodeAfterInsertVisitenkarte()
  {
    $statusCode = -1;
    if (\RequestOperations::getMethod() == 'post') {
      $statusCode = $this->getHandleInsertVisitenkarte();
    }

    return $statusCode;
  }

  private function getHandleInsertVisitenkarte()
  {
    $tnr = \SessionOperations::getCurrentWebToolsUser()->tnr;

    $dbWorkVisitenkartenWeb = $this->getDbwVisitenkartenWeb();
    $visitenkarte = $dbWorkVisitenkartenWeb->getNewObject();

    if (\RequestOperations::getVarValue('action') === 'neueErstellteVisitenkarteSpeichern') {
      $VisitenkarteId = $dbWorkVisitenkartenWeb->insertVisitenkarte($visitenkarte, false);
      $visitenkarte->tnr = $tnr;
      $this->response->visitenkarteId = $VisitenkarteId;
      $changeVisitenkarte = $this->request->wssHandler->getChangedDm(
        $this->toolSettings,
        $visitenkarte,
        $this->request->columnValues
      );

      if (\PostOperations::isDefined('visitenkartenWeb_fachgebiete')) {
        $count = count($changeVisitenkarte->fachgebiete);

        for ($i = 0; $i < $count; $i++) {
          $changeVisitenkarte->fachgebiete[$i]->web_visitenkarte_id = $VisitenkarteId;
        }
        $this->getInsertFachgebiete($changeVisitenkarte);
      }
      $dbWorkVisitenkartenWeb->updateVisitenkarte($changeVisitenkarte);

      $statusCode = self::VISITENKARTE_ERSTELLEN_INSERT_SUCCESS;
    }

    return $statusCode;
  }

  private function getInsertFachgebiete($pVisitenkarte)
  {
    $dbwFachgebiet = $this->getDbwFachgebiete();

    foreach ($pVisitenkarte->fachgebiete as $fachgebiet) {
      $dbwFachgebiet->insertFachgebiet($fachgebiet);
    }
  }
}

class InsertVisitenkarteUebersichtRequest
{
  public $columnValues;
  public $wssHandler;
  public $isRefresh;
  public $isXsrfOk;
}

class InsertVisitenkarteUebersichtResponse
{
  public $statusCode;
  public $visitenkarteId;
}