<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

namespace Kufer\Web\KuferTools\Teilnehmer\Visitenkarten\VisitenkartenDetails\VisitenkartenDetailsSpeichern;

class VisitenkartenDetailsSpeichernUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  public const VISITENKARTE_BEARBEITEN_SUCCESS = 'visitenkarteBearbeitenSuccess';
  public const VISITENKARTE_BEARBEITEN_INFO_NO_CHANGE = 'visitenkarteBearbeitenInfoNoChange';
  public const VISITENKARTE_BEARBEITEN_REFRESH = 'visitenkarteBearbeitenBrowserRefresh';

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

  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;
    }

    $dbWorkVisitenkarten = $this->getDbwVisitenkartenWeb();
    if ($this->request->visitenkarteId != '') {
      $visitenkarte = $dbWorkVisitenkarten->getVisitenkarteByIdAndTnr($this->request->visitenkarteId, $this->getUser()->tnr);
    }

    if (!isset($visitenkarte->id)) {
      return false;
    }

    return true;
  }

  public function action()
  {
    if (!$this->request->isRefresh) {
      $statusCode = $this->updateVisitenkarte();
    } else {
      $statusCode = self::VISITENKARTE_BEARBEITEN_REFRESH;
    }

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

  protected function getResponse($pStatusCode)
  {
    $this->handleResponseStrategies();
    $this->response->statusCode = $pStatusCode;

    return $this->response;
  }

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

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

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

  
  private function getVisitenkarte()
  {
    $dbWorkVisitenkartenWeb = $this->getDbwVisitenkartenWeb();
    $visitenkarteId = $this->request->visitenkarteId;

    return $dbWorkVisitenkartenWeb->getVisitenkarteById($visitenkarteId);
  }

  private function updateVisitenkarte()
  {
    $dbwVisitenkarte = $this->getDbwVisitenkartenWeb();
    $origVisitenkarte = $this->getVisitenkarte();

    $changedVisitenkarte = $this->request->wssHandler->getChangedDm($origVisitenkarte, $this->request->columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origVisitenkarte, $this->request->columnValues);
    if (count($changedFields) === 0) {
      
      $statusCode = self::VISITENKARTE_BEARBEITEN_INFO_NO_CHANGE;
    } else {
      $dbwVisitenkarte->updateVisitenkarte($changedVisitenkarte);
      if (in_array('fachgebiete', $changedFields)) {
        $this->updateFachgebiete($origVisitenkarte, $changedVisitenkarte);
      }
      $statusCode = self::VISITENKARTE_BEARBEITEN_SUCCESS;
    }

    return $statusCode;
  }

  private function updateFachgebiete($pOrigVisitenkarte, $pVisitenkarte)
  {
    $dbwFachgebiet = $this->getDbwFachgebiete();

    foreach ($pVisitenkarte->fachgebiete as $fachgebiet) {
      if (!$pOrigVisitenkarte->sachgebietExists($fachgebiet->sachg)) {
        $dbwFachgebiet->insertFachgebiet($fachgebiet);
      }
    }

    
    foreach ($pOrigVisitenkarte->fachgebiete as $origFachgebiet) {
      if (!$pVisitenkarte->sachgebietExists($origFachgebiet->sachg)) {
        $dbwFachgebiet->deleteFachgebiet($origFachgebiet->web_visitenkarte_id, $origFachgebiet->sachg);
      }
    }
  }
}

class VisitenkartenDetailsSpeichernRequest
{
  public $visitenkarteId;
  public $isRefresh;
  public $isXsrfOk;
}

class VisitenkartenDetailsSpeichernResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $visitenkarteId;
  public $statusCode;
}