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

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

use Kufer\Web\KuferTools\Basis\UseCase\ToolResponse;
use Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase;

class HandleAnmeldungFactoryUseCase extends ToolUseCase
{
  
  private $dbwTeilnehmer;

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

  public static function getToolSectionId()
  {
    return 94;
  }

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

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

    if (!is_null($this->request->anmBeiFirma) || $this->toolSettings->anmPerFirmaAusBeziehung == 2) {
      $firmenIdsFromBez = $this->getFirmenIdsFromBeziehung();

      if (count($firmenIdsFromBez) === 1) {
        return true;
      }

      if (is_null($this->request->anmBeiFirma)) {
        return false;
      }

      if (!in_array($this->request->anmBeiFirma, $firmenIdsFromBez)) {
        return false;
      }

      if (empty($this->dbwTeilnehmer->getTeilnehm($this->request->anmBeiFirma)->id)) {
        return false;
      }
    }

    return true;
  }

  private $cacheFirmenIdsFromBeziehung;

  private function getFirmenIdsFromBeziehung(): array
  {
    if (is_null($this->cacheFirmenIdsFromBeziehung)) {
      $dbwBeziehung = \DBWorkBeziehung::getDefaultInstance();
      $this->cacheFirmenIdsFromBeziehung = array_map(
        static function(\Beziehung $bez) {
          return $bez->nr1;
        },
        $dbwBeziehung->getBeziehungMitarbeiterZuFirma($this->getUser()->tnr)
      );
    }

    return $this->cacheFirmenIdsFromBeziehung;
  }

  public function action()
  {
    if (!is_null($this->request->anmBeiFirma)
        || ($this->toolSettings->anmPerFirmaAusBeziehung == 2 && count($this->getFirmenIdsFromBeziehung()) === 1)) {
      if (is_null($this->request->anmBeiFirma)) {
        $this->request->anmBeiFirma = $this->getFirmenIdsFromBeziehung()[0];
      }

      $useCase = new HandleAnmeldungMitFirmaUseCase($this->request);
    } else {
      $useCase = new HandleAnmeldungUseCase($this->request);
    }

    return $useCase->action();
  }
}