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

namespace Kufer\Web\KuferTools\Utils\AdressHandler;

use Kufer\Web\KuferTools\Utils\WssHandler;
use Kufer\Web\KuferTools\Utils\PersonenHandler\PersonUpdater;

class AdressUpdater extends PersonUpdater
{
  public const SUCCESS_ADRESS_ERFOLGREICH_UEBERMITTELT = 'adressdatenErfolgreichÜbermittelt';
  public const INFO_ADRESSEDATEN_NICHT_VERAENDERT = 'adressdatenNichtVerändert';
  public const ERROR_DOPPELT_AUFGERUFEN = 'doppeltAufgerufen';
  public const ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN = 'übertragungFehlgeschlagen';
  public const ERROR_ADRESSDATEN_NICHT_AKTUELL = 'adressdatenNichtAktuell';
  public const ERROR_ADRESSDATEN_FEHLERHAFT = 'adressdatenFehlerhaft';

  public function handleAdressUpdate(WssHandler $pWssHandler, array $pColumnValues, \Adresse $pOrigAdresse): array
  {
    $changedAdresse = $pWssHandler->getChangedDm(
      $this->toolSettings,
      $pOrigAdresse,
      $pColumnValues
    );
    $changedFields = $pWssHandler->getChangedFieldnames(
      $this->toolSettings,
      $pOrigAdresse,
      $pColumnValues
    );
    
    $wrongFields = $pWssHandler->checkColumnValues($this->toolSettings, $pColumnValues);
    if (!empty($wrongFields)) {
      $statusCode = self::ERROR_ADRESSDATEN_FEHLERHAFT;
    } else {
      list($changedAdresse, $changedFields) = $this->preUpdateHook($changedAdresse, $changedFields);
      $statusCode = $this->saveAdresse($pOrigAdresse, $changedAdresse, $changedFields);
    }

    return array($statusCode, $wrongFields);
  }

  public function saveAdresse(\Adresse $pOrigAdresse, \Adresse $pAdresse, array $pChangedFields): string
  {
    $dbwAdresse = new \DBWorkAdresse(1, true);
    $adresseAndChangedFields = \AdressAPI::aktualisiereBerechneteAdressDaten($pOrigAdresse, $pAdresse);
    $pAdresse = $adresseAndChangedFields['adresse'];
    $changedFields = array_merge($pChangedFields, $adresseAndChangedFields['changedFields'], $pAdresse->getKommAnzeigeAry($pOrigAdresse));

    if (count($changedFields) == 0) {
      return self::INFO_ADRESSEDATEN_NICHT_VERAENDERT;
    }

    try {
      if (\SessionOperations::isDmzBetrieb()) {
        $pAdresse->updateKommAnzeige();
        $adressTuple = new \Tuple($pAdresse, $changedFields, $pOrigAdresse);
        \AdressAPI::correctAdresse($adressTuple, 'update');
        $origKommAry = \KommunikationsAPI::getOrigKommunikation($pAdresse);

        $pAdresse = $dbwAdresse->updateAdresse($pAdresse, true);
        \KommunikationsAPI::buildAndSendKommunikation($pAdresse, $origKommAry);
      } else {
        $pAdresse = $dbwAdresse->updateAdresse($pAdresse);
      }
      $statusCode = self::SUCCESS_ADRESS_ERFOLGREICH_UEBERMITTELT;
    } catch (\AbgleichApiException $aae) {
      \Logger::logg('Adresskorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);
      if ($aae->errorType == \AbgleichApiResult::CONFLICT) {
        $statusCode = self::ERROR_ADRESSDATEN_NICHT_AKTUELL;
      } else {
        $statusCode = self::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN;
      }
    } catch (\Exception $e) {
      $statusCode = self::INFO_ADRESSEDATEN_NICHT_VERAENDERT;
      \Logger::logg('Adresskorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return $statusCode;
  }
}