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


namespace Kufer\KuferTools\Utils\TeilnehmerHandler;

class TeilnehmerInserter
{
  public const SUCCESS_TEILNEHMERDATEN_ERFOLGREICH_UEBERMITTELT = 'teilnehmerdatenErfolgreichÜbermittelt';
  public const INFO_TEILNEHMERDATEN_NICHT_VERAENDERT = 'teilnehmerdatenNichtVerändert';
  public const ERROR_DOPPELT_AUFGERUFEN = 'doppeltAufgerufen';
  public const ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN = 'übertragungFehlgeschlagen';
  public const ERROR_TEILNEHMER_NICHT_ANGELEGT = 'teilnehmerNichtAngelegt';
  public const ERROR_TEILNEHMERDATEN_FEHLERHAFT = 'teilnehmerdatenFehlerhaft';
  public const ERROR_TEILNEHMERDATEN_NICHT_AKTUELL = 'teilnehmerdatenNichtAktuell';

  
  protected function preTeilnehmerInsertHook($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);
  }

  
  public function handleTeilnehmerInsert($wssHandler, $columnValues)
  {
    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $origTeilnehmer = $dbwTeilnehmer->getNewObject();

    $changedTeilnehmer = $wssHandler->getChangedDm($origTeilnehmer, $columnValues);
    $changedFields = $wssHandler->getChangedFieldnames($origTeilnehmer, $columnValues);
    $wrongFields = $wssHandler->checkColumnValues($columnValues);

    if (!empty($wrongFields)) {
      $statusCode = self::ERROR_TEILNEHMERDATEN_FEHLERHAFT;
      $tnr = -1;
    } else {
      if (!in_array('guid', $changedFields)) {
        $changedFields[] = 'guid';
      }

      list($changedTeilnehmer, $changedFields) = $this->preTeilnehmerInsertHook($changedTeilnehmer, $changedFields);
      list($statusCode, $tnr) = array_values($this->saveTeilnehmer($origTeilnehmer, $changedTeilnehmer, $changedFields));

      if ($statusCode == self::SUCCESS_TEILNEHMERDATEN_ERFOLGREICH_UEBERMITTELT
          && (!isset($origTeilnehmer->id) || $origTeilnehmer->id === '')
          && isset($changedTeilnehmer->id) && $changedTeilnehmer->id >= 0) {
        $this->afterTeilnehmerInsertHook($changedTeilnehmer, $changedFields);
      }
    }

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

  
  protected function afterTeilnehmerInsertHook($tn, $changedFields): void
  {
  }

  private function saveTeilnehmer($pOrigTeilnehmer, $pTeilnehmer, $pChangedFields)
  {
    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    
    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 = -1;
    try {
      if (\SessionOperations::isDmzBetrieb()) {
        
        $tnIds = \TeilnehmerAPI::insertTeilnehmer4DMZ($pTeilnehmer, $kennzAddAry, array(), $pChangedFields);
        $tnId = $tnIds['replikatid'];
        \StammBvAPI::bereinigeBankdatenAnhandTeilnehmer($pTeilnehmer, true, true);
      } else {
        
        $tnId = \TeilnehmerAPI::insertTeilnehmerRepoDirekt($dbwTeilnehmer, $pTeilnehmer, $kennzAddAry);
        \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);
      $statusCode = self::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN;
    } catch (\Exception $e) {
      $statusCode = self::ERROR_TEILNEHMER_NICHT_ANGELEGT;
      \Logger::logg('Teilnehmerkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

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