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

namespace Kufer\Web\KuferTools\Basis\Anmeldung\KursUebersicht\HandleAnmeldung;

use Kufer\Web\KuferTools\Utils\Anmeldung\AnmeldeButtonUtils;
use Kufer\Web\KuferTools\Utils\DatamodulHelper\Kurse\KursHelper;
use Kufer\Web\KuferTools\Utils\DatamodulHelper\Kurse\KursHelperFactory;

abstract class HandleAnmeldungUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  protected $dbwWarenKorbKurse;

  public function __construct($request, $response = null)
  {
    parent::__construct($request, is_null($response) ? new HandleAnmeldungResponse() : $response);
    $this->dbwWarenKorbKurse = new \DBWorkWarenkorbKurse();
  }

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

    $kursHelper = $this->getKursHelper();
    if ($this->request->knr === '' || !in_array($this->request->knr, $kursHelper->getIdsOhneFilter())) {
      return false;
    }

    return true;
  }

  protected function getKursHelper(): KursHelper
  {
    return KursHelperFactory::getKursHelperByToolID($this->getToolId(), $this->toolSettings, $this->getUser());
  }

  public static function aktualisiereKursPerDmz($pKurs, $toolId)
  {
    static $kursePerDmzAktualisieren = array();
    if (!isset($kursePerDmzAktualisieren[$toolId])) {
      $toolSettingsApi = new  \ToolSettingsAPI();
      $toolSettings = $toolSettingsApi->getToolSettings($toolId);
      $kursePerDmzAktualisieren[$toolId] = $toolSettings->kursePerDmzAktualisieren;
    }
    if (\SessionOperations::isDmzBetrieb() && $kursePerDmzAktualisieren[$toolId]) {
      try {
        $pKurs = \AnmeldeAPI::updateKursData($pKurs);
      } catch (\Exception $e) {
        
      }
    }

    return $pKurs;
  }

  
  protected function KursbuchenResponse($anmeld)
  {
    $this->response->tndata = $anmeld->_tninfo->getTeilnehmer();
    $this->response->kurse = $anmeld->_kurseByStatus;
  }

  
  protected function transformBuchungsvorgangVorbereiten(\Buchungsvorgang $buchungsvorgang): \Buchungsvorgang
  {
    return $buchungsvorgang;
  }

  
  protected function Kursbuchen($pknr, $pToolid, $pEmail, $pTnr = -1)
  {
    $anmeld = \AnmeldeAPI::buchungsvorgangVorbereiten($pknr, $pToolid, $pEmail, $pTnr, \FunctionOperations::args(array($this, 'transformKursInfo'), $pknr));
    $anmeld = $this->transformBuchungsvorgangVorbereiten($anmeld);

    $anmeld->buchungStep1(); 
    

    
    $technischeProbleme = $anmeld->buchungStep2();

    
    if (\DBWorkBASysSettings::isBlak()) {
      $anmeld->verrechneGebuehrMitGuthaben(); 
    }

    $this->KursbuchenResponse($anmeld);

    $anmeld->sendTNBestaetigung();
    $anmeld->sendBestaetigungKopie();
    
    
    $anmeld->cleanUp($technischeProbleme);

    return $anmeld;
  }

  protected function verwendeAbweichendKontodaten($user)
  {
    
    
    $isNurFuerAnmeldung = $this->request->abw_isNurFuerAnmeldung;
    
    \SessionOperations::setVarValueWk('w_isNurFuerAnmeldung_b', $isNurFuerAnmeldung);

    $verfahren = $this->request->abw_verfahren;
    $inhaber = $this->request->abw_inhaber;
    $bank = $this->request->abw_bank;

    $kto = $this->request->abw_kto;
    $blz = $this->request->abw_blz;
    $bic = $this->request->abw_bic;
    $iban = $this->request->abw_iban;

    if ($isNurFuerAnmeldung) {
      
      \SessionOperations::setVarValueWk('w_abw_kontoverwenden_b', true);
      
      \SessionOperations::setVarValueWk('w_abw_bankbez_b', $bank);
      \SessionOperations::setVarValueWk('w_abw_kontoinh_b', $inhaber);
      if ($verfahren === 'iban') {
        \SessionOperations::setVarValueWk('w_abw_bic_b', $bic);
        \SessionOperations::setVarValueWk('w_abw_iban_b', $iban);
      } else {
        \SessionOperations::setVarValueWk('w_abw_kontonr_b', $kto);
        \SessionOperations::setVarValueWk('w_abw_blz_b', $blz);
      }
    } else {
      
      $dbwtn = new \DBWorkTeilnehmer(1, true);
      $tn = $dbwtn->getTeilnehm($user->tnr);
      $tn->kontoinhaber = $inhaber;

      $tn->bankbez = $bank;
      
      if ($verfahren === 'iban') {
        $tn->bic = $bic;
        $tn->iban = $iban;
        $tn->konto = '';
        $tn->blz = '';
      } else {
        $tn->konto = $kto;
        $tn->blz = $blz;
        $tn->bic = '';
        $tn->iban = '';
      }
      \StammBvAPI::bereinigeBankdatenAnhandTeilnehmer($tn, true, false);
    }
  }

  protected function getResponse()
  {
    $this->handleResponseStrategies();
    
    \SessionOperations::setVarValueWTIntern('anm_bestaetigung_' . $this->request->knr, $this->response);

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
      new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this)
    );
  }

  public function transformKursInfo(string $knr, \WeitereKursInfo $kursInfo): \WeitereKursInfo
  {
    return $kursInfo;
  }
}

class HandleAnmeldungRequest extends \Kufer\Web\KuferTools\Basis\UseCase\XsrfRequest
{
  public $knr;
  public $zahlart;
  public $guthaben_verwenden;
  public $abwBankverbindungAngegeben;
  public $abw_isNurFuerAnmeldung;
  public $abw_verfahren;
  public $abw_inhaber;
  public $abw_bank;
  public $abw_kto;
  public $abw_blz;
  public $abw_bic;
  public $abw_iban;
  public $anzWeitereTn;
  public $blakzertifkatsbstg;
  public $anmBeiFirma;
}

class HandleAnmeldungResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $user;
  public $kurs;
  public $weitereTN;
  public $menuPunkte;
  public $tndata;
  public $knr;
  public $kurse;
  public $doppeltVersandt = false;
  public $userHasNoEmail = false;
}