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


class ToolVisitenkarten extends ToolBase
{

  public function __construct()
  {
    parent::__construct();
    $this->toolTitle = 'Visitenkarten';
  }

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

  public function init($pPageId)
  {
    $this->checkBrowserReload();
    switch ($pPageId) {
      default:
      case 495:
        $statusCode = -1;
        if (GetOperations::isDefined('id') && GetOperations::getVarValue('id') == 1) {
          $statusCode = $this->_handleVisitenkarteInsertOrUpdate($pPageId, false);
        }
        $page = $this->_handleVisitenkarteUebersicht($pPageId, $statusCode);
        break;
      case 496:
        if (GetOperations::isDefined('id')) {
          $statusCode = $this->_handleVisitenkarteInsertOrUpdate($pPageId, true);
        } else {
          $statusCode = $this->_handleVisitenkarteInsertOrUpdate($pPageId, false);
        }
        $page = $this->_handleVisitenkartedetails($pPageId, $statusCode);

        break;
    }
    if ($page == null) {
      throw new Exception('ungültige PageId');
    }

    $this->currentPage = $page;
  }

  

  protected function doByBrowserRefresh()
  {
    $_POST = array();
    $_SERVER['REQUEST_METHOD'] = 'GET';
  }

  
  private function _handleVisitenkarteUebersicht($pPageId, $pStatusCode)
  {
    $pageLinks = array();
    $tnr = SessionOperations::getCurrentWebToolsUser()->tnr;
    $dbwTeilnehmer = new DBWorkTeilnehmer();
    $teilnehm = $dbwTeilnehmer->getTeilnehm($tnr);

    $pageLinks['newVk'] = ($tnr !== -1 && $teilnehm->mitgl_bis != '' && !DateTimeOperations::isDateBefore($teilnehm->mitgl_bis, DateTimeOperations::getDateNow()));

    $dbwVkrt = new DBWorkVisitenkartenWeb(1, true);
    
    $nurAktive = false;
    $data = $dbwVkrt->getVisitenkartenByTnr($tnr, $nurAktive);

    $page = new PageVisitenkartenUebersicht($this, $data, $pPageId, $pStatusCode);
    $page->setLinks($pageLinks);

    return $page;
  }

  
  private function _handleVisitenkartedetails($pPageId, $pStatusCode)
  {
    $tnr = SessionOperations::getCurrentWebToolsUser()->tnr;
    $dbwTeilnehmer = new DBWorkTeilnehmer();
    $teilnehm = $dbwTeilnehmer->getTeilnehm($tnr);
    $tnValid = ($tnr !== -1 && $teilnehm->mitgl_bis != '' && !DateTimeOperations::isDateBefore($teilnehm->mitgl_bis, DateTimeOperations::getDateNow()));

    $dbwVkrt = new DBWorkVisitenkartenWeb();
    $data = $dbwVkrt->getNewObject();

    
    
    $vkrtId = GetOperations::getVarValue('id');
    if ($vkrtId !== '') {
      $data = $dbwVkrt->getVisitenkarteByIdAndTnr($vkrtId, SessionOperations::getCurrentWebToolsUser()->tnr);
      if (!isset($data->id)) {
        $pStatusCode = -2;
      }
    } elseif (!$tnValid) {
      $pStatusCode = -2;
    }

    return new PageVisitenkarteBearbeiten($this, $data, $pPageId, $pStatusCode);
  }

  
  private function _handleVisitenkarteInsertOrUpdate($pSightId, $pModeUpdate)
  {
    $statusCode = -1;

    
    
    if (RequestOperations::getMethod() == 'post') {
      $dbwVkrt = new DBWorkVisitenkartenWeb();

      if (GetOperations::isDefined('id')) {
        $visitenkarte = $dbwVkrt->getVisitenkarteById(GetOperations::getVarValue('id'));
      } else {
        $visitenkarte = $dbwVkrt->getNewObject();
        $visitenkarte->tnr = SessionOperations::getCurrentWebToolsUser()->tnr;
      }

      $builder = new SightBuilder($this->getToolId(), $pSightId, $visitenkarte);
      
      $builder->saveData();
      $validationOK = $builder->checkValidation();

      if ($validationOK) {
        $statusCode = $this->_saveVisitenkarte($builder, $pModeUpdate);
      }
    }

    return $statusCode;
  }

  
  private function _saveVisitenkarte($pBuilder, $pModeUpdate)
  {
    $visitenkarte = $pBuilder->getData();
    $dbwVkrt = new DBWorkVisitenkartenWeb();
    if (isset($visitenkarte->id)) {
      $origVisitenkarte = $dbwVkrt->getVisitenkarteById($visitenkarte->id);
    } else {
      $origVisitenkarte = $dbwVkrt->getNewObject();
    }

    $changedFields = $pBuilder->getFieldNamesOfChangedFields($origVisitenkarte);

    if (count($changedFields) === 0) {
      
      $statusCode = 2;
    } elseif ($pModeUpdate) { 
      $dbwVkrt->updateVisitenkarte($visitenkarte, false);
      if (PostOperations::isDefined('visitenkartenWeb_fachgebiete_vorhanden')) {
        $this->_updateFachgebiete($origVisitenkarte, $visitenkarte, true);
      }
      $statusCode = 1;
    } else { 
      $id = $dbwVkrt->insertVisitenkarte($visitenkarte, false);
      if (PostOperations::isDefined('visitenkartenWeb_fachgebiete_vorhanden')) {
        $count = count($visitenkarte->fachgebiete);
        for ($i = 0; $i < $count; $i++) {
          $visitenkarte->fachgebiete[$i]->web_visitenkarte_id = $id;
        }
        $this->_updateFachgebiete($origVisitenkarte, $visitenkarte, false);
      }
      GetOperations::fakeCall(array('tool_id' => \ToolsAPI::TOOL_WEBVISITENKARTEN, 'toolsection_id' => 496, 'id' => $id));
      $statusCode = 0;
    }

    return $statusCode;
  }

  
  private function _updateFachgebiete($pOrigVisitenkarte, $pVisitenkarte, $pModeUpdate)
  {
    $dbwFg = new DBWorkFachgebieteVisitenkartenWeb();

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

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

  
  public function getAjaxResponse()
  {
    if (PostOperations::getVarValue('action') === 'deleteVisitenkarte') {
      $idZuLöschen = PostOperations::getVarValue('id', '');
      $dbwVkrt = new DBWorkVisitenkartenWeb();
      $dbwFg = new DBWorkFachgebieteVisitenkartenWeb();

      if ($idZuLöschen !== '') {
        $dbwVkrt->deleteVisitenkarte($idZuLöschen);
        $dbwFg->deleteAllFachgebieteByVkrtId($idZuLöschen);
      }
    } elseif (PostOperations::getVarValue('action') === 'fetch') {
      $idToFetch = SessionOperations::getCurrentWebToolsUser()->tnr;
      $dbwTeilnehm = new DBWorkTeilnehmer();
      $jsonData = $dbwTeilnehm->getTeilnehm($idToFetch);

      return JsonOperations::encode4Ajax($jsonData);
    }
  }
}