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


namespace Kufer\KuferTools\Basis\TeilnehmerInfo\UpdateTeilnehmer\HandleTeilnehmerUpdate;

abstract class HandleTeilnehmerUpdateUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  const SUCCESS_TEILNEHMERDATEN_ERFOLGREICH_UEBERMITTELT = 'teilnehmerdatenErfolgreichÜbermittelt';
  const INFO_TEILNEHMERDATEN_NICHT_VERAENDERT = 'teilnehmerdatenNichtVerändert';
  const ERROR_DOPPELT_AUFGERUFEN = 'doppeltAufgerufen';
  const ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN = 'übertragungFehlgeschlagen';
  const ERROR_TEILNEHMER_NICHT_ANGELEGT = 'teilnehmerNichtAngelegt';
  const ERROR_TEILNEHMERDATEN_FEHLERHAFT = 'teilnehmerdatenFehlerhaft';
  const ERROR_TEILNEHMERDATEN_NICHT_AKTUELL = 'teilnehmerdatenNichtAktuell';

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

  public function action()
  {
    list($statusCode, $tnr, $wrongFields) = array_values($this->handleTeilnehmerUpdate());
    \SessionOperations::setVarValueWTIntern('newTnStatusCode', $statusCode);
    \SessionOperations::setVarValueWTIntern('newTnWrongFields', $wrongFields);

    return $this->getResponse($tnr, $this->request->tguid);
  }

  protected function transformColumnValues($columnValues)
  {
    return $columnValues;
  }

  
  protected function preUpdateHook($teilnehmer, $changedFields)
  {
    if (in_array('iban', $changedFields)) {
      $bankdaten = \BankDatenOperations::getBankdatenAnhandIban($teilnehmer->iban);
      if ($bankdaten) {
        if (!in_array('bic', $changedFields)) {
          $teilnehmer->bic = $bankdaten['bic'];
          $changedFields[] = 'bic';
        }

        if (!in_array('bankbez', $changedFields)) {
          $teilnehmer->bankbez = $bankdaten['ezucode'];
          $changedFields[] = 'bankbez';
        }
      }
    }

    return array($teilnehmer, $changedFields);
  }

  
  private function handleTeilnehmerUpdate()
  {
    $columnValues = $this->transformColumnValues($this->request->columnValues);
    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $origTeilnehmer = $dbwTeilnehmer->getTeilnehm($this->request->tnr, true);
    $changedTeilnehmer = $this->request->wssHandler->getChangedDm($origTeilnehmer, $columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origTeilnehmer, $columnValues);
    $wrongFields = $this->request->wssHandler->checkColumnValues($columnValues);

    

    if (!empty($wrongFields)) {
      $statusCode = self::ERROR_TEILNEHMERDATEN_FEHLERHAFT;
      $tnr = $this->request->tnr;
    } else {
      list($changedTeilnehmer, $changedFields) = $this->preUpdateHook($changedTeilnehmer, $changedFields);
      list($statusCode, $tnr) = array_values($this->saveTeilnehmer($origTeilnehmer, $changedTeilnehmer, $changedFields));
    }

    return array($statusCode, $tnr, $wrongFields);
  }

  
  private function saveTeilnehmer($pOrigTeilnehmer, $pTeilnehmer, $pChangedFields)
  {
    $benutzerId = $this->getUser()->ben;
    $dbwBASysUser = \DBWorkBASysUser::getDefaultInstance();
    $benutzerKuerzel = $dbwBASysUser->getBASysUser($benutzerId)->kennung;
    $tnAndChangedFields = \TeilnehmerAPI::aktualisiereBerechneteTeilnehmerDaten($pOrigTeilnehmer, $pTeilnehmer, $benutzerKuerzel);
    $pTeilnehmer = $tnAndChangedFields['teilnehmer'];
    $pChangedFields = array_merge($pChangedFields, $tnAndChangedFields['changedFields']);

    if ($pTeilnehmer->arykennzeichen === false || \is_null($pTeilnehmer->arykennzeichen)) {
      $kennzAddAry = array();
      $kennzDelAry = array();
    } else {
      
      $kennzeichenActionObj = \TeilnehmerAPI::getKennzeichenAry($pTeilnehmer);
      $kennzAddAry = $kennzeichenActionObj->add;
      $kennzDelAry = $kennzeichenActionObj->del;
    }

    
    $pChangedFields = array_merge($pChangedFields, $pTeilnehmer->getKommAnzeigeAry($pOrigTeilnehmer));

    
    if (count($pChangedFields) == 0 && count($kennzAddAry) == 0 && count($kennzDelAry) == 0) {
      $statusCode = self::INFO_TEILNEHMERDATEN_NICHT_VERAENDERT;

      return array('statusCode' => $statusCode, 'tnId' => $this->request->tnr);
    }
    $tnId = $this->request->tnr;
    try {
      
      if (\SessionOperations::isDmzBetrieb()) {
        $pTeilnehmer->updateKommAnzeige();
        $teilnehmerTuple = new \Tuple($pTeilnehmer, $pChangedFields, $pOrigTeilnehmer);
        \TeilnehmerAPI::updateTeilnehmer4DMZ($teilnehmerTuple, 'update', $kennzAddAry, $kennzDelAry);
        \StammBvAPI::bereinigeBankdatenAnhandTeilnehmer($pTeilnehmer, true, true);
      }
      
      else {
        $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
        \TeilnehmerAPI::updateTeilnehmerRepoDirekt($dbwTeilnehmer, $pTeilnehmer, false, $kennzAddAry, $kennzDelAry);
        \StammBvAPI::bereinigeBankdatenAnhandTeilnehmer($pTeilnehmer, true, false);
      }
      $statusCode = self::SUCCESS_TEILNEHMERDATEN_ERFOLGREICH_UEBERMITTELT;
    } catch (\AbgleichApiException $aae) {
      \Logger::logg('Teilnehmerkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);

      if ($aae->errorType == \AbgleichApiResult::CONFLICT) {
        $statusCode = self::ERROR_TEILNEHMERDATEN_NICHT_AKTUELL;
      } else {
        $statusCode = self::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN;
      }
    }
    
    
    catch (\Exception $e) {
      $statusCode = self::INFO_TEILNEHMERDATEN_NICHT_VERAENDERT;
      \Logger::logg('Teilnehmerkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return array('statusCode' => $statusCode, 'tnId' => $tnId);
  }

  protected function getResponse($pTnr, $pTguid)
  {
    $this->response->tnr = $pTnr;
    $this->response->tguid = $pTguid;

    return $this->response;
  }
}

class HandleTeilnehmerUpdateRequest
{
  public $tnr;
  public $tguid;
  public $columnValues;
  public $wssHandler;
}

class HandleTeilnehmerUpdateResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $tnr;
  public $tguid;
}