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

namespace Kufer\Web\Classes\Ampel\AmpelStatus;

abstract class Ampel4StatusBerechnung extends AmpelStatusBerechnung
{
  public const AMPELSTATUS_MIN_NICHT_ERREICHT = 0;

  public const AMPELSTATUS_OK = 1;

  public const AMPELSTATUS_FAST_VOLL = 2;

  public const AMPELSTATUS_VOLL = 3;

  public function berechneAmpelStatus(\ToolSettingsBASys $settings, bool $forKinder, bool $isOnlineteilnahme): int
  {
    $infos = $this->getBerechnungsInfos($forKinder, $isOnlineteilnahme);
    if ($this->kurs->typ == 'K') {
      return $this->berechneAmpel4StatusKinder($infos, $isOnlineteilnahme, $settings);
    }
    $status = $this->berechneAmpel4Status(
      $infos->personenZahlen,
      $forKinder,
      $isOnlineteilnahme,
      $settings
    );

    $status2 = $this->berechneAmpel4StatusKinder($infos, $isOnlineteilnahme, $settings);

    return max($status, $status2);
  }

  abstract protected function isAmpelStatus2(AnzahlMinMax $anzahlMinMax, \ToolSettingsBASys $settings): bool;

  private function isAmpelStatus3(AnzahlMinMax $anzahlMinMax, \ToolSettingsBASys $settings): bool
  {
    $belegSchwelle = \BelegungOperations::getBelegschwelle(
      $anzahlMinMax->max,
      $settings->belegschwelleProz,
      $settings->belegschwelleZahl
    );

    return $anzahlMinMax->anzahl >= $belegSchwelle;
  }

  private function isAmpelStatus4(bool $forKinder, bool $isOnlineteilnahme): bool
  {
    if ($isOnlineteilnahme) {
      if ($forKinder) {
        return !$this->kurs->istPlatzFuerOnlineteilnahme(0, 1);
      } else {
        return !$this->kurs->istPlatzFuerOnlineteilnahme(1, 0);
      }
    } else {
      if ($forKinder) {
        return !$this->kurs->istPlatzFuer(0, 1);
      } else {
        return !$this->kurs->istPlatzFuer(1, 0);
      }
    }
  }

  private function berechneAmpel4Status(AnzahlMinMax $anzahlMinMax, bool $forKinder, bool $isOnlineteilnahme, \ToolSettingsBASys $settings): int
  {
    $status = self::AMPELSTATUS_MIN_NICHT_ERREICHT;
    if ($settings->anmstatuscheck2 && $this->isAmpelStatus2($anzahlMinMax, $settings)) {
      $status = self::AMPELSTATUS_OK;
    }
    if ($settings->anmstatuscheck3 && $this->isAmpelStatus3($anzahlMinMax, $settings)) {
      $status = self::AMPELSTATUS_FAST_VOLL;
    }
    if ($settings->anmstatuscheck4 && $this->isAmpelStatus4($forKinder, $isOnlineteilnahme)) {
      $status = self::AMPELSTATUS_VOLL;
    }

    return $status;
  }

  private function berechneAmpel4StatusKinder(Ampel4StatusBerechnungsInfos $infos, bool $isOnlineteilnahme, \ToolSettingsBASys $settings): int
  {
    if ($infos->tnKiZahlen->min <= 0 && $infos->tnKiZahlen->max <= 0) {
      return self::AMPELSTATUS_MIN_NICHT_ERREICHT;
    }

    return $this->berechneAmpel4Status($infos->tnKiZahlen, true, $isOnlineteilnahme, $settings);
  }

  private function getBerechnungsInfos(bool $forKinder, bool $isOnlineteilnahme): Ampel4StatusBerechnungsInfos
  {
    if ($isOnlineteilnahme) {
      if ($forKinder) {
        return Ampel4StatusBerechnungsInfos::fromHybridkursOnlineKinder($this->kurs);
      } else {
        return Ampel4StatusBerechnungsInfos::fromHybridkursOnlineTeilnehmer($this->kurs);
      }
    } else {
      if ($forKinder) {
        return Ampel4StatusBerechnungsInfos::fromKursKinder($this->kurs);
      } else {
        return Ampel4StatusBerechnungsInfos::fromKursTeilnehmer($this->kurs);
      }
    }
  }
}