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

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

use Kufer\Mail\EMail\EMailHTML;
use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Web\Classes\Anmeldung\TransformBuchungsvorgangEMail;
use Kufer\Web\KuferTools\Utils\Anmeldung\AnmeldeButtonUtils;
use Kufer\Web\KuferTools\Utils\Anmeldung\AnmeldungGetKennzeichen;
use Kufer\Web\KuferTools\Utils\Spezial\BLAKUtils;
use Kufer\Web\KuferTools\Utils\Spezial\TeilnehmerVorgesetzterUtils;

class HandleAnmeldungMitFirmaUseCase extends \Kufer\Web\KuferTools\Basis\Anmeldung\KursUebersicht\HandleAnmeldung\HandleAnmeldungUseCase
{
  
  private $dbwTeilnehmer;

  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response);
    $this->dbwTeilnehmer = \DBWorkTeilnehmer::getDefaultInstance();
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess($pToolSectionId)) {
      return false;
    }

    
    $teilnehmer = \DBWorkTeilnehmer::getDefaultInstance()->getTeilnehm($this->getUser()->getTnrIdentifier());
    $kurs = \DBWorkKurse::getDefaultInstance()->getKurs($this->request->knr);
    
    $emptyMandatorys = \AnmeldeAPI::getEmptyMandatoryFieldName($this->toolSettings, $teilnehmer);
    if (!AnmeldeButtonUtils::isTeilnehmerAnmeldungAllowed($kurs, $emptyMandatorys, $teilnehmer, $this->toolSettings)) {
      return false;
    }

    return true;
  }

  public static function getToolSectionId()
  {
    return 94;
  }

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

  private $cacheFirma;

  private function queryFirma()
  {
    if (is_null($this->cacheFirma)) {
      $firmenId = $this->request->anmBeiFirma;
      $this->cacheFirma = $this->dbwTeilnehmer->getTeilnehm($firmenId);
    }

    return $this->cacheFirma;
  }

  private $cacheKurs;

  private function getKursCache()
  {
    if (is_null($this->cacheKurs)) {
      $dbwkurse = new \DBWorkKurseWT(1, true);
      $kurs = $dbwkurse->getKurs($this->request->knr);
      $this->cacheKurs = $this->aktualisiereKursPerDmz($kurs, $this->getToolId());
    }

    return $this->cacheKurs;
  }

  public function action()
  {
    $knr = $this->request->knr;
    $this->response->knr = $knr;

    if ($this->request->isRefresh) {
      return \SessionOperations::getVarValueWTIntern('anm_bestaetigung_' . $this->request->knr);
    }

    $user = $this->getUser();
    $firma = $this->queryFirma();

    if ($user->email == '') {
      $this->response->userHasNoEmail = true;

      return $this->getResponse();
    }

    $this->dbwWarenKorbKurse->clear();
    $this->dbwWarenKorbKurse->addEntry($knr);

    $kurs = $this->getKursCache();

    if (BLAKUtils::isKursZertifikatsfortbildungsKurs($this->toolSettings, $kurs)) {
      $freidefField = BLAKUtils::getFreidefFieldBelegungZertifikatsfortbildungFromToolSettings($this->toolSettings);
      if (!is_null($freidefField)) {
        $sessionVar = \preg_replace('/^historiekrit/', 'beleghistorie', $freidefField);
        \SessionOperations::setVarValueWk('w_' . $sessionVar . '_' . $knr, \DateTimeOperations::getDateNow());
      }
    }

    

    \SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
    \SessionOperations::setVarValueWk('gAnzahl_Mehrfach', 1);

    $this->response->kurs = $kurs;

    

    $this->anmeldungDurchfuehren($knr, $kurs, $firma, $user);

    return $this->getResponse();
  }

  protected function transformBuchungsvorgangVorbereiten(\Buchungsvorgang $buchungsvorgang): \Buchungsvorgang
  {
    
    $buchungsvorgang->setTransformBuchungsvorgangEMail(new class() implements TransformBuchungsvorgangEMail {
      public function transformErstenTeilnehmer(\TeilnehmerPflicht $ermittelterTn, \TNInfo $tnInfo, \ZentraleEinstellungen $zentraleEinstellungen): \TeilnehmerPflicht
      {
        return $ermittelterTn;
      }

      public function shouldVerschickenEMailAnWeitere(\TNInfo $tnInfo, \ZentraleEinstellungen $zentraleEinstellungen): ?bool
      {
        return true;
      }
    });

    return $buchungsvorgang;
  }

  private function anmeldungDurchfuehren(string $knr, \Kurs $kurs, \Teilnehmer $firma, \Benutzer $user)
  {
    
    $warenkorb = new \DBWorkWarenkorbKurse();
    $warenkorb->clear();
    $warenkorb->addEntry($knr);
    $warenkorb->implodeEntries();

    
    $dbwtn = new \DBWorkTeilnehmer(1, true);
    \SessionOperations::TNObjectToSession($firma, 'w_', $firma->id);

    

    
    

    \SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', 1);

    $tn = $dbwtn->getTeilnehm($user->getTnrIdentifier());
    $this->fillMitarbeiterDaten($kurs, $tn);

    \Logger::logg('Beginne Anmeldevorgang für Kurs mit Kursnr. ' . $knr . '.', 7);
    
    

    $anmeld = $this->Kursbuchen($knr, $this->getToolId(), $user->email, $firma->id);
    $this->anmeldungDurchgefuehrtHook($anmeld, $knr);
  }

  private function fillMitarbeiterDaten($kurs, \Teilnehmer $tn)
  {
    $dbwKennz = new \DBWorkKennz();

    
    \SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);

    $zertifikatsfortbildungBlak = BLAKUtils::isKursZertifikatsfortbildungsKurs($this->toolSettings, $kurs);
    $zertifikatfortbildungFreidefField = BLAKUtils::getFreidefFieldBelegungZertifikatsfortbildungFromToolSettings($this->toolSettings);

    
    
    $i = 0 + 1;
    \SessionOperations::setVarValueWk('w_nachname_ma' . $i, $tn->name);
    \SessionOperations::setVarValueWk('w_name_ma' . $i, $tn->name);
    \SessionOperations::setVarValueWk('w_vorname_ma' . $i, $tn->vorname);
    \SessionOperations::setVarValueWk('w_abwadr_ma' . $i, '');
    \SessionOperations::setVarValueWk('w_tel_ma' . $i, $tn->tel);
    \SessionOperations::setVarValueWk('w_email_ma' . $i, $tn->email);
    \SessionOperations::setVarValueWk('w_tnr_ma' . $i, $tn->id);

    $kennzArray = AnmeldungGetKennzeichen::getKennzeichenNummern4Tn($tn->getIdentifier());
    if (isset($kennzArray[0])) {
      $kennz = $kennzArray[0];
      \SessionOperations::setVarValueWk('w_kennz1_ma' . $i, $kennz);
      \SessionOperations::setVarValueWk('w_beruf_ma' . $i, $dbwKennz->getKennzNamebyKnr($kennz));
    }

    \SessionOperations::setVarValueWk('w_geschlecht_ma' . $i, $tn->geschlecht);
    \SessionOperations::setVarValueWk('w_name_titel_ma' . $i, $tn->name_titel);
    \SessionOperations::setVarValueWk('w_gebdat_ma' . $i, $tn->gebdat);

    \SessionOperations::setVarValueWk('w_zusatz_ma' . $i, $tn->name);
    \SessionOperations::setVarValueWk('w_strasse_ma' . $i, $tn->strasse);
    \SessionOperations::setVarValueWk('w_ort_ma' . $i, $tn->ort);

    if ($zertifikatsfortbildungBlak && !is_null($zertifikatfortbildungFreidefField)) {
      $sessionVar = \preg_replace('/^historiekrit/', 'beleghistorie', $zertifikatfortbildungFreidefField);
      \SessionOperations::setVarValueWk('w_' . $sessionVar . '_' . $kurs->id . '_ma' . $i, \DateTimeOperations::getDateNow());
    }
  }

  protected function KursbuchenResponse($anmeld)
  {
    parent::KursbuchenResponse($anmeld);

    $this->response->tndata = $anmeld->getTNInfo()->getWeitere()[0];
  }

  private function anmeldungDurchgefuehrtHook(\BuchungsvorgangWebTools $anmeld, string $knr): void
  {
    $kurs = \DBWorkKurse::getDefaultInstance()->getKurs($knr);
    if (TeilnehmerVorgesetzterUtils::isKursGenehmigungspflichtig($kurs)) {
      $sender = EMailSenderFactory::create();
      $tn = \SessionOperations::getCurrentWebToolsTeilnehmer();
      $successAnmeldungen = array(ANMELDUNGONLINE_OK, ANMELDUNGONLINE_OFFLINE, ANMELDUNGONLINE_KURSVOLL);
      $vorgesetzteAry = \DBWorkTeilnehmer::getDefaultInstance()->getTeilnehmByIdArray(
        TeilnehmerVorgesetzterUtils::getVorgesetztenIdsOfTeilnehmer($tn->getIdentifier())
      );
      $viewModel = new \Kufer\Web\KuferTools\Teilnehmer\Anmeldung\KursUebersicht\HandleAnmeldung\EMailAnVorgesetzen\EMailAnVorgesetztenViewModel();
      $viewModel->teilnehmer = $tn;
      $viewModel->kurs = $kurs; 
      foreach ($anmeld->_kurse as $kursBuchung) {
        if (!in_array($kursBuchung->actualstatus, $successAnmeldungen)) {
          continue; 
        }

        foreach ($vorgesetzteAry as $vorgesetzter) {
          $viewModel->vorgesetzter = $vorgesetzter;
          $viewModel->anmeldeStatus = $kursBuchung->actualstatus;
          $emailPresenter = new \Kufer\Web\KuferTools\Teilnehmer\Anmeldung\KursUebersicht\HandleAnmeldung\EMailAnVorgesetzen\EMailAnVorgesetztenPresenter($viewModel);
          $email = new EMailHTML($emailPresenter->getSubject(), $emailPresenter->getContent());
          $email->addKuferToolsFooter('Anmeldung zu genehmigungspflichtigen Kursen', $this->getUser(), $kurs);
          $sender->sendFromTeilnehmerToTeilnehmer($email, $tn, array($vorgesetzter), 'Vorgesetzte(r)');
        }
      }
    }
  }

  public function transformKursInfo(string $knr, \WeitereKursInfo $kursInfo): \WeitereKursInfo
  {
    $kursInfo = parent::transformKursInfo($knr, $kursInfo);
    $kurs = $this->getKursCache();
    if (TeilnehmerVorgesetzterUtils::isKursGenehmigungspflichtig($kurs)) {
      if (!$kurs->isKursVoll()) {
        $kursInfo->status = 'P';
      } else {
        $kursInfo->status = 'W';
      }
    }


    return $kursInfo;
  }
}