<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

namespace Kufer\Web\Plugins\EPayment\EpayBL;

class ePayBLRouter
{
  public function handleRequest()
  {
    // Ist ePayBL überhaupt aktiv?
    // Bei ePayBL kann der Funktion eine beliebige epayBL-payonline-Nummer übergeben werde.
    if (!\ePaymentApi::isPayonlineSettingActive(EPAYMENT_EPAYBL_PAYPAL)) {
      return;
    }

    $action = \GetOperations::getVarValue('action');
    $mtid = \GetOperations::getVarValue('mtid');

    if (empty($mtid) || empty($action)) {
      return;
    }

    $payonline = \DBWorkWebEpayTids::getDefaultInstance()->getPayonlineByMerchantTransactionId($mtid);

    // Prüfen, ob wir im richtigen Router sind
    if (!\ePaymentApi::isPayonlineEpaybl($payonline)) {
      return;
    }

    $tid = \DBWorkWebEpayTids::getDefaultInstance()->getTransactionIdByMerchantTransactionId($mtid);

    $status = self::resolveStatus($payonline, $action);

    if ($status !== null) {
      self::updateEpayState($tid, $status);
      self::continueWithStep5($payonline);
    }
  }

  private function resolveStatus($payonline, $action)
  {
    if ($action === 'cancel') {
      return \EPayBL::EPAYMENT_EPAYBL_CANCEL_STATUS;
    } elseif ($action === 'error') {
      return \EPayBL::EPAYMENT_EPAYBL_ERROR_STATUS;
    } else {
      \EpayLogger::loggPayonline($payonline, 'Request konnte nicht verarbeitet werden: Falsche Action übergeben.', 811);

      return null;
    }
  }

  private function updateEpayState($tid, $status)
  {
    $dbwWebEpaystate = \DBWorkWebEpaystate::getDefaultInstance();
    $webEpaystate = $dbwWebEpaystate->getEpaystateByTransactionId($tid);

    if (is_null($webEpaystate->id)) {
      $newEntry = new \WebEpaystate($tid, $status);
      $dbwWebEpaystate->insertWebEpaystate($newEntry);
    } else {
      $dbwWebEpaystate->updateState($tid, $status);
    }
  }

  private function continueWithStep5($payonline)
  {
    $epayFinish = new \EPayFinishTransaction(
      $payonline,
      new EPayNotifySenderEpayblErrorOrCancel(),
      new \EPayNotifyTransactionEvaluatorStd()
    );
    $epayFinish->finishAnmeldung();
  }
}
