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


namespace Kufer\Web\KuferTools\Utils\TeilnehmerHandler;

use Kufer\Web\KuferTools\Utils\WssHandler;

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 $toolSettings;

  public function __construct(\ToolSettings $toolSettings)
  {
    $this->toolSettings = $toolSettings;
  }

  
  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 $wssHandler, array $columnValues): array
  {
    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $origTeilnehmer = $dbwTeilnehmer->getNewObject();

    $changedTeilnehmer = $wssHandler->getChangedDm(
      $this->toolSettings,
      $origTeilnehmer,
      $columnValues
    );
    $changedFields = $wssHandler->getChangedFieldnames(
      $this->toolSettings,
      $origTeilnehmer,
      $columnValues
    );
    $wrongFields = $wssHandler->checkColumnValues($this->toolSettings, $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(\Teilnehmer $pOrigTeilnehmer, \Teilnehmer $pTeilnehmer, array $pChangedFields): array
  {
    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $kennzAddAry = $pTeilnehmer->arykennzeichen ?? array();

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

    $tnId = -1;
    try {
      if (\SessionOperations::isDmzBetrieb()) {
        $tnIds = \TeilnehmerAPI::insertTeilnehmer4DMZ($pTeilnehmer, $kennzAddAry, $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('Teilnehmerinsert - 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('Teilnehmerinsert - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

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