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

namespace Kufer\KuferTools\Teilnehmer\BayerischerApothekertagStudenten\HandleAnmeldung;

class HandleAnmeldungUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  private $dbwWarenKorbKurse;

  public function __construct($request)
  {
    \ConstantOperations::define_once('BAT_GENERELL', true);
    \ConstantOperations::define_once('BAT_STUDENT', true);

    parent::__construct($request, new HandleAnmeldungResponse());
    $this->dbwWarenKorbKurse = new \DBWorkWarenkorbKurse();
  }

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

    return true;
  }

  public static function getToolSectionId()
  {
    return 564;
  }

  public static function getToolId()
  {
    return 48;
  }

  public function action()
  {
    $user = $this->getUser();
    if ($this->request->isRefresh) {
      
      
      return \SessionOperations::getVarValueWTIntern('anm_bestaetigung_' . $this->request->knr);
    }
    if ($user->email == '') {
      $this->response->userHasNoEmail = true;

      return $this->getResponse();
    }

    $knrs = $this->request->knrs;
    $this->response->knrs = $knrs;
    $this->dbwWarenKorbKurse->clear();

    foreach ($knrs as $knr) {
      $this->dbwWarenKorbKurse->addEntry($knr);
    }

    if ($this->request->zahlart == 'Ü') {
      \SessionOperations::setVarValueWK('w_zahlart_b', 'Ü');
    }

    if ($this->request->anzWeitereTn > 0) {
      \SessionOperations::setVarValueAnm('simpleweitere', 1);
      \SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_MEHRFACH);
      \SessionOperations::setVarValueWk('gAnzahl_Mehrfach', $this->request->anzWeitereTn);
    }

    if ($this->request->abwBankverbindungAngegeben) {
      $this->verwendeAbweichendKontodaten($user);
    }

    $this->anmeldungDurchfuehren($knrs, $user);

    return $this->getResponse();
  }

  public static function aktualisiereKursPerDmz($pKurs)
  {
    static $kursePerDmzAktualisieren = null;
    if (\is_null($kursePerDmzAktualisieren)) {
      $toolSettingsApi = new  \ToolSettingsAPI();
      $toolSettings = $toolSettingsApi->getToolSettings(\ToolsAPI::TOOL_ANMELDUNGBUCHEN_TN);
      $kursePerDmzAktualisieren = $toolSettings->kursePerDmzAktualisieren;
    }
    if (\SessionOperations::isDmzBetrieb() && $kursePerDmzAktualisieren) {
      try {
        $pKurs = \AnmeldeAPI::updateKursData($pKurs);
      } catch (\Exception $e) {
        
      }
    }

    return $pKurs;
  }

  private function anmeldungDurchfuehren($knrs, $user)
  {
    \Logger::logg('Beginne Anmeldevorgang für Kurs mit Kursnr. ' . implode(', ', $knrs) . '.', 7);
    
    

    $this->Kursbuchen($knrs, $this->getToolId(), $user->email);
  }

  private function Kursbuchen($pknrs, $pToolid, $pEmail, $pTnr = -1)
  {
    \SessionOperations::setVarValueWk('w_anmeldeart_b', 'U');
    $anmeld = \AnmeldeAPI::buchungsvorgangVorbereiten('', $pToolid, $pEmail, $pTnr);
    $tn = \SessionOperations::getVarValueWTIntern('bat_ehrengast');
    

    
    $bemerkung = \PostOperations::getVarValue('anm_bemerkung', '');
    if (trim($bemerkung) != '') {
      $bemerkung = ' ' . $bemerkung;
    }
    $bemerkung = 'Student' . $bemerkung;
    $_POST['anm_bemerkung'] = $bemerkung;

    $anmeld->createTNInfo(0, $tn);
    $anmeld->buchungStep1(); 
    

    
    $technischeProbleme = $anmeld->buchungStep2();

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

    $this->response->tndata = $anmeld->_tninfo->getTeilnehmer();
    $this->response->kurse = $anmeld->_kurseByStatus;
    $anmeld->sendTNBestaetigung();
    $anmeld->sendBestaetigungKopie();
    
    
    $anmeld->cleanUp($technischeProbleme);
  }

  private 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\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this)
    );
  }
}

class HandleAnmeldungRequest
{
  public $knr;
  public $knrs;
  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;
}

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