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

use Kufer\Web\Classes\Ampel\AmpelStatus\Ampel4StatusBerechnung;
use Kufer\Web\Classes\Ampel\AmpelStatus\Ampel4StatusBerechnungKuferWeb;

class AmpelStatusBerechnungKuferWebTest extends \PHPUnit\Framework\TestCase
{
  protected function setUp(): void
  {
  }

  protected function tearDown(): void
  {
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_belegschwelle50_gruen()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->teil_akt = 1;
    $kurs->teil_min = 1;
    $kurs->teil_max = 10;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 0;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals(1, $rechner->berechneAmpelStatus($settings, false, false));

    $kurs->teil_akt = 4;
    $this->assertEquals(1, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_ausfall()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->teil_akt = 1;
    $kurs->teil_min = 1;
    $kurs->teil_max = 10;
    $kurs->kinderanzahl = 0;
    $kurs->ausfall = true;
    $kurs->beginn_dat = '11.11.2031';
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);

    //ignoreKursausfall auf false => Ausfall beachten
    $rechner = new \Kufer\Web\Classes\Ampel\AmpelStatus\Ampel7StatusBerechnungKuferWeb($kurs, false);
    $this->assertEquals(\Kufer\Web\Classes\Ampel\AmpelStatus\Ampel7StatusBerechnungKuferWeb::AMPELSTATUS_AUSFALL, $rechner->berechneAmpelStatus($settings, false, false));

    //ignoreKursausfall auf true => Ausfall nicht beachten
    $rechner = new \Kufer\Web\Classes\Ampel\AmpelStatus\Ampel7StatusBerechnungKuferWeb($kurs, true);
    $this->assertEquals(\Kufer\Web\Classes\Ampel\AmpelStatus\Ampel7StatusBerechnungKuferWeb::AMPELSTATUS_OK, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_status250ProzVonMaxOderTnVorMaxTn_minTnErreichtAberKeineSchwelle_gelb()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->teil_akt = 3;
    $kurs->teil_min = 0;
    $kurs->teil_max = 24;
    $settings = new ToolSettingsBASys();
    $settings->belegschwSt2maxProz = 50;
    $settings->belegschwSt2maxZahl = '';
    $settings->belegschwelleProz = 90;
    $settings->anmstatus2option = 2;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals(Ampel4StatusBerechnung::AMPELSTATUS_MIN_NICHT_ERREICHT, $rechner->berechneAmpelStatus($settings, false, false));

    $kurs->teil_akt = 12;
    $this->assertEquals(Ampel4StatusBerechnung::AMPELSTATUS_OK, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function getAmpelStatus_belegschwelle50_gelb()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->teil_akt = 5;
    $kurs->teil_min = 1;
    $kurs->teil_max = 10;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 0;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals($rechner->berechneAmpelStatus($settings, false, false), 2);
  }

  /**
   * @test
   */
  public function getAmpelStatus_belegschwelle50_rot()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->teil_akt = 10;
    $kurs->teil_min = 1;
    $kurs->teil_max = 10;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 0;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals(3, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_kinderKursEinigeBelegungenVorhandenAberNochEinPlatzFrei_nichtVoll()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 6;
    $kurs->teil_max = 7;
    $kurs->kinder_max = 0;//irrelevant da K Kurs
    $kurs->kurse2->tnki_max = 0;//irrelevant da K Kurs
    $kurs->kinderanzahl = 0;//irrelevant da K Kurs

    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertTrue(3 > $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_einigeBelegungenVorhandenAberNochEinPlatzFrei_nichtVoll2()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = '';
    $kurs->teil_akt = 6;
    $kurs->teil_max = 7;
    $kurs->kinder_max = 0;
    $kurs->kurse2->tnki_max = 0;
    $kurs->kinderanzahl = 0;

    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;

    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $result = $rechner->berechneAmpelStatus($settings, false, false);
    $this->assertTrue(3 > $result);
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_einigeBelegungenVorhandenAberNochEinPlatzFrei_nichtVoll3()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 6;
    $kurs->teil_max = 7;
    $kurs->kinder_max = 5;//sollte bei der Berechnung keine Rolle spielen
    $kurs->kurse2->tnki_max = 0;//irrelevant da K Kurs
    $kurs->kinderanzahl = 0;//irrelevant da K Kurs

    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;

    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertTrue(3 > $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_einigeBelegungenVorhandenAberNochPlatzFrei420_nichtVoll()
  {
    \System::$enforceKuferSqlVersion = 420;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 6;
    $kurs->teil_max = 8;
    $kurs->kinder_max = 8;
    $kurs->kurse2->tnki_max = 16;
    $kurs->kurse2->tnki_min = 4;
    $kurs->kinderanzahl = 6;

    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;

    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertTrue(3 > $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_kinderKursEinigeBelegungenVorhandenKeinPlatzFrei_voll()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 7;
    $kurs->teil_max = 7;
    $kurs->kinder_max = 0;//irrelevant da K Kurs
    $kurs->kurse2->tnki_max = 0;//irrelevant da K Kurs
    $kurs->kinderanzahl = 0;//irrelevant da K Kurs
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $kurs->kurse2->tnki_max = 5;//sollte bei einem K Kurs auch keine Rolle spielen
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals(3, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_KinderkursZweiMaxEinerBelegt_nichtVoll()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 0;
    $kurs->kinderanzahl = 1;
    $kurs->kinder_min = $kurs->teil_min = $kurs->kurse2->tnki_min = 0;
    $kurs->kinder_max = $kurs->teil_max = $kurs->kurse2->tnki_max = 2;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new \Kufer\Web\Classes\Ampel\AmpelStatus\Ampel4StatusBerechnungKuferWeb($kurs);
    $settings = new KursWebUebersichtSettings();
    ToolSettingsAPI::getToolSettings(4);
    $forKinder = false;
    $isOnlineteilnahme = false;
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertTrue($status < 3);

    $forKinder = true;
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertTrue($status < 3);
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_KinderkursZweiMaxEineBelegungAusNormalkurs_EinKindBelegt_Voll()
  {
    \System::$enforceKuferSqlVersion = 500;
    $kurs = new Kurs();
    $kurs->typ = 'K';
    $kurs->teil_akt = 1;
    $kurs->kinderanzahl = 1;
    $kurs->kinder_min = $kurs->teil_min = $kurs->kurse2->tnki_min = 0;
    $kurs->kinder_max = $kurs->teil_max = $kurs->kurse2->tnki_max = 2;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new \Kufer\Web\Classes\Ampel\AmpelStatus\Ampel4StatusBerechnungKuferWeb($kurs);
    $settings = new KursWebUebersichtSettings();
    ToolSettingsAPI::getToolSettings(4);
    $forKinder = false;
    $isOnlineteilnahme = false;//sollte beim Kinderkurs das gleiche sein wie mit $forKinder = true
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertEquals(3, $status);

    $forKinder = true;
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertEquals(3, $status);
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_EKKursNurKombiniert_nichtVoll()
  {
    $kurs = new Kurs();
    $kurs->typ = 'L';
    $kurs->teil_akt = 1;
    $kurs->kinderanzahl = 1;
    $kurs->kinder_min = $kurs->teil_min = $kurs->kurse2->tnki_min = 0;
    $kurs->kinder_max = $kurs->teil_max = 0;
    $kurs->kurse2->tnki_max = 6;
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new \Kufer\Web\Classes\Ampel\AmpelStatus\Ampel4StatusBerechnungKuferWeb($kurs);
    $settings = new KursWebUebersichtSettings();
    ToolSettingsAPI::getToolSettings(4);
    $forKinder = false;
    $isOnlineteilnahme = false;
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertTrue($status < 3);

    $forKinder = true;
    $status = $rechner->berechneAmpelStatus($settings, $forKinder, $isOnlineteilnahme);
    $this->assertTrue($status < 3);
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_EKKursNurKombiniert_gelb()
  {
    $kurs = new Kurs();
    $kurs->typ = 'L';
    $kurs->teil_akt = 5;
    $kurs->teil_min = 1;
    $kurs->teil_max = 0;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 0;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;

    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $this->assertEquals(2, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_EKKursNurKombiniert_voll()
  {
    $kurs = new Kurs();
    $kurs->typ = 'L';
    $kurs->teil_akt = 5;
    $kurs->teil_min = 1;
    $kurs->teil_max = 0;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 5;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $this->assertEquals(3, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_EKKursNurKombiniert_voll2()
  {
    $kurs = new Kurs();
    $kurs->typ = 'L';
    $kurs->teil_akt = 10;
    $kurs->kinderanzahl = 0;
    $kurs->teil_min = 1;
    $kurs->teil_max = 0;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $this->assertEquals(3, $rechner->berechneAmpelStatus($settings, false, false));
  }

  /**
   * @test
   */
  public function berechneAmpelStatus_EKKursNurKombiniert_voll3()
  {
    $kurs = new Kurs();
    $kurs->typ = 'L';
    $kurs->teil_akt = 0;
    $kurs->teil_min = 1;
    $kurs->teil_max = 0;
    $kurs->kurse2->tnki_min = 1;
    $kurs->kurse2->tnki_max = 10;
    $kurs->kinderanzahl = 10;
    $settings = new ToolSettingsBASys();
    $settings->belegschwelleProz = 50;
    $rechner = new Ampel4StatusBerechnungKuferWeb($kurs);
    $tnZahlenDb = new TeilnehmerzahlenProviderFromKurs($kurs);
    $kurs->updateTeilnehmerzahlenFelder($tnZahlenDb);
    $this->assertEquals(3, $rechner->berechneAmpelStatus($settings, false, false));
  }
}
