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

namespace Kufer\KuferTools\Basis\Kursdetails\DetailsReiter\Termine\TermineSammelAenderung\HandleTermineSammelAenderung;

use Kufer\KuferTools\Utils\EmailVorbelegen;

abstract class HandleTermineSammelAenderungUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  public const SUCCESS_SAMMELAENDERUNG_ERFOLGREICH = 'sammelAenderungErfolgreich';
  public const INFO_KEINE_AENDERUNGEN_VORGENOMMEN = 'keineAenderungenVorgenommen';
  public const ERROR_DOPPELT_ABSENDEN = 'DoppeltVersandt';
  public const ERROR_KURSTAG_KORREKTUR_KEINE_EINGETRAGEN = 'kurstagKorrekturKeineEingetrage';
  public const ERROR_KURSTAG_KORREKTUR_TEILWEISE_EINGETRAGEN = 'KurstagKorrekturTeilweiseEingetragen';
  public const ERROR_CONFLICT = 'conflict';
  public const ERROR_SAMMELAENDERUNG_FEHLGESCHLAGEN = 'sammelAenderungFehlgeschlagen';

  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new HandleTermineSammelAenderungResponse());
  }

  
  
  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  
  protected function preSammelKurstagUpdateHook($change, $changedFields)
  {
    return array($change, $changedFields);
  }

  
  public function action()
  {
    $ktApi = new \KurstagAPI();
    $failedToUpdateKtAry = array();
    $failedToUpdateKtIds = array();
    $eintraegeGeaendert = false;

    $changedFields = $this->request->changedFields;

    if ($this->request->isRefresh) {
      $statusCode = self::ERROR_DOPPELT_ABSENDEN;
    } elseif (empty($changedFields) || empty($this->request->ktIds)) {
      $statusCode = self::INFO_KEINE_AENDERUNGEN_VORGENOMMEN;
    } else {
      list($change, $changedFields) = $this->preSammelKurstagUpdateHook($this->request->change, $changedFields);
      try {
        $origKurstage = $this->getKurstage($this->request->ktIds);
        $ktApi->doSammelaenderung4TermineByParams($changedFields, $this->request->ktIds, $change);
        $statusCode = self::SUCCESS_SAMMELAENDERUNG_ERFOLGREICH;
        $eintraegeGeaendert = true;
      } catch (\AbgleichApiException $aae) {
        \Logger::logg('Kurstagkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . ' [' . $aae->getTraceAsString() . ']', 200);

        if ($aae->errorType == \AbgleichApiResult::KURSTAG_KORREKTUR_KEINE_EINGETRAGEN) {
          $statusCode = self::ERROR_KURSTAG_KORREKTUR_KEINE_EINGETRAGEN;
          $failedToUpdateKtIds = $this->getKtIdsFromErrorReason($aae->errorReason);
          $failedToUpdateKtAry = $this->getKurstage($failedToUpdateKtIds);
        } elseif ($aae->errorType == \AbgleichApiResult::KURSTAG_KORREKTUR_TEILWEISE_EINGETRAGEN) {
          $statusCode = self::ERROR_KURSTAG_KORREKTUR_TEILWEISE_EINGETRAGEN;
          $eintraegeGeaendert = true;
          $failedToUpdateKtIds = $this->getKtIdsFromErrorReason($aae->errorReason);
          $failedToUpdateKtAry = $this->getKurstage($failedToUpdateKtIds);
        } elseif ($aae->errorType == \AbgleichApiResult::CONFLICT) {
          $statusCode = self::ERROR_CONFLICT;
        } else {
          $statusCode = self::ERROR_SAMMELAENDERUNG_FEHLGESCHLAGEN;
        }
      } catch (\Exception $e) {
        \Logger::logg('Kurstagkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
        $statusCode = self::ERROR_SAMMELAENDERUNG_FEHLGESCHLAGEN;
      }

      if ($eintraegeGeaendert) {
        $origKurstage = array_filter($origKurstage ?? array(), function($origKurstag) use ($failedToUpdateKtIds) { return !in_array($origKurstag->id, $failedToUpdateKtIds); });
        $changedKurstage = $this->getChangedKurstage($failedToUpdateKtIds);
        $changedFieldsLabels = \Kufer\KuferTools\Utils\WssHandler::getFieldsInReadableFormatNoColumns($this->request->changedFields);

        EmailVorbelegen\EmailVorbelegenKurstage::setSessionVars($origKurstage, $changedKurstage, $changedFieldsLabels);
      }
    }

    return $this->getResponse($statusCode, $failedToUpdateKtAry, $eintraegeGeaendert);
  }

  protected function getKtIdsFromErrorReason($pErrorReason)
  {
    $ktList = trim(\StringOperations::strrchr($pErrorReason, ':'), ' :');

    return explode(' ,', $ktList);
  }

  
  protected function getKurstage($pKtId)
  {
    $dbwKt = new \DBWorkKurseTageWT();

    return $dbwKt->getKurstageByIds($pKtId);
  }

  protected function getChangedKurstage($pFailedToUpdateKtIds)
  {
    $ktIds = array_diff($this->request->ktIds, $pFailedToUpdateKtIds);

    return $this->getKurstage($ktIds);
  }

  protected function getResponse($pStatusCode, $pFailedToUpdateKtAry, $pEintraegeBearbeitet)
  {
    $this->response->knr = $this->request->knr;
    $this->response->statusCode = $pStatusCode;
    $this->response->failedToUpdateKtAry = $pFailedToUpdateKtAry;
    $this->response->eintraegeBearbeitet = $pEintraegeBearbeitet;

    return $this->response;
  }
}

class HandleTermineSammelAenderungRequest
{
  public $knr;
  public $ktIds;
  public $wssHandler;
  public $columnValues;
  public $changedFields;
  public $change;
}

class HandleTermineSammelAenderungResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $knr;
  public $statusCode;
  public $failedToUpdateKtAry;
  public $eintraegeBearbeitet;
}