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

namespace Kufer\KuferTools\Mitarbeiter\AdressInfo\NewAdress\HandleAdressInsert;

class HandleAdressInsertUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  public const SUCCESS_ADRESS_ERFOLGREICH_UEBERMITTELT = 'adressdatenErfolgreichÜbermittelt';
  public const INFO_ADRESSDATEN_NICHT_VERAENDERT = 'adressdatenNichtVerändert';
  public const ERROR_DOPPELT_AUFGERUFEN = 'doppeltAufgerufen';
  public const ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN = 'übertragungFehlgeschlagen';
  public const ERROR_ADRESS_NICHT_ANGELEGT = 'adressNichtAngelegt';
  public const ERROR_ADRESSDATEN_NICHT_AKTUELL = 'adressdatenNichtAktuell';
  public const ERROR_ADRESSDATEN_FEHLERHAFT = 'adressdatenFehlerhaft';

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

  public static function getToolSectionId()
  {
    return 58;
  }

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

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess(410)) {
      return false;
    }
    if (!$this->isRechtAllowed('55.0.2')) { 
      return false;
    }
    
    
    
    return true;
  }

  public function action()
  {
    list($statusCode, $anr, $wrongFields) = array_values($this->handleAdressInsert());
    \SessionOperations::setVarValueWTIntern('newAdrStatusCode', $statusCode);
    \SessionOperations::setVarValueWTIntern('newAdrWrongFields', $wrongFields);

    return $this->getResponse($anr);
  }

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

  
  protected function preAdressInsertHook($adressse, $changedFields)
  {
    $kennung = $this->getMitarbeiterKennung();
    if (!empty($kennung)) {
      $adressse->erstelltvon = $kennung;
      $changedFields[] = 'erstelltvon';

      $adressse->erstelltdatum = \DateTimeOperations::getDateNow();
      $changedFields[] = 'erstelltdatum';

      $adressse->bearbeiter = $kennung;
      $changedFields[] = 'bearbeiter';
    }

    return array($adressse, $changedFields);
  }

  private function getMitarbeiterKennung(): string
  {
    return \SessionOperations::getCurrentWebToolsMitarbeiterOrEmpty()->kennung;
  }

  
  private function handleAdressInsert()
  {
    $dbwAdresse = new \DBWorkAdresse(1, true);
    
    if ($this->request->adrInsert) {
      $origAdress = $dbwAdresse->getNewObject();
    } else {
      throw new \Exception('Fehler: Adress neu anlegen oder bearbeiten nicht angegeben!');
    }
    $columnValues = $this->transformColumnValues($this->request->columnValues);
    $changedAdress = $this->request->wssHandler->getChangedDm($origAdress, $columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origAdress, $columnValues);
    
    $wrongFields = $this->request->wssHandler->checkColumnValues($columnValues);
    if (count($wrongFields) > 0) {
      $statusCode = self::ERROR_ADRESSDATEN_FEHLERHAFT;
      $anr = $this->request->anr;
    } else {
      list($changedAdress, $changedFields) = $this->preAdressInsertHook($changedAdress, $changedFields);
      list($statusCode, $anr) = array_values($this->saveAdress($origAdress, $changedAdress, $changedFields));
    }

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

  
  private function saveAdress($pOrigAdress, $pAdress, $pChangedFields)
  {
    $statusCode = '';
    $dbwAdr = new \DBWorkAdresse(1, true);
    
    $pChangedFields = array_merge($pChangedFields, $pAdress->getKommAnzeigeAry($pOrigAdress));
    if (count($pChangedFields) == 0) {
      $statusCode .= self::INFO_ADRESSDATEN_NICHT_VERAENDERT;

      return array('statusMessage' => $statusCode, 'adrId' => $this->request->anr);
    } 

    $insertedAdrId = -1;
    try {
      if (\SessionOperations::isDmzBetrieb()) {
        
        $correctMode = 'insert';
        
        $insertedAdrId = $dbwAdr->insertAdresse($pAdress);
        
        
        

        $origKommAry = null; 
        $changedFields = $pChangedFields;
        if (!in_array('guid', $changedFields, true)) {
          $changedFields[] = 'guid';
        }
        $adressTuple = new \Tuple($pAdress, $changedFields, null);
        \AdressAPI::correctAdresse($adressTuple, $correctMode);
        
        
        

        \KommunikationsAPI::buildAndSendKommunikation($pAdress, $origKommAry);
      } 
      
      else {
        
        
        $insertedAdrId = $dbwAdr->insertAdresse($pAdress);
      }
      $statusCode .= self::SUCCESS_ADRESS_ERFOLGREICH_UEBERMITTELT;
    } 
    catch (\AbgleichApiException $aae) {
      
      if ($insertedAdrId != -1) {
        $dbwAdr->deleteAdresse($insertedAdrId);
        
        $insertedAdrId = -1;
      }
      \Logger::logg('Adressekorrektur - 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) {
      
      if ($insertedAdrId != -1) {
        $dbwAdr->deleteAdresse($insertedAdrId);
        
        $insertedAdrId = -1;
      }
      $statusCode .= self::ERROR_ADRESS_NICHT_ANGELEGT;
      \Logger::logg('Adressekorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return array('statusMessage' => $statusCode, 'adrId' => $insertedAdrId);
  }

  protected function getResponse($anr)
  {
    $this->response->anr = $anr;

    return $this->response;
  }
}

class HandleAdressInsertRequest
{
  public $anr;
  public $adrInsert;
  public $columnValues;
  public $wssHandler;
}

class HandleAdressInsertResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $anr;
}