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


class MitveranstalterAPI
{
  const MAENNLICH_INNSBRUCK = 'mi';
  const MAENNLICH_AUSWAERTS = 'ma';
  const WEIBLICH_INNSBRUCK = 'wi';
  const WEIBLICH_AUSWAERTS = 'wa';

  private $_maennlichInnsbruck;
  private $_maennlichAuswaerts;
  private $_weiblichInnsbruck;
  private $_weiblichAuswaerts;

  public function __construct()
  {
    $tool8Settings = ToolSettingsAPI::getToolSettings(8);
    $this->_maennlichInnsbruck = $tool8Settings->tnr_maennlich_innsbruck;
    $this->_maennlichAuswaerts = $tool8Settings->tnr_maennlich_auswaerts;
    $this->_weiblichInnsbruck = $tool8Settings->tnr_weiblich_innsbruck;
    $this->_weiblichAuswaerts = $tool8Settings->tnr_weiblich_auswaerts;
  }

  public function getTnrTypMap()
  {
    return array(
        $this->_maennlichInnsbruck => self::MAENNLICH_INNSBRUCK,
        $this->_maennlichAuswaerts => self::MAENNLICH_AUSWAERTS,
        $this->_weiblichInnsbruck => self::WEIBLICH_INNSBRUCK,
        $this->_weiblichAuswaerts => self::WEIBLICH_AUSWAERTS
    );
  }

  public function getTnrMaennlichInnsbruck()
  {
    return $this->_maennlichInnsbruck;
  }

  public function getTnrMaennlichAuswaerts()
  {
    return $this->_maennlichAuswaerts;
  }

  public function getTnrWeiblichInnsbruck()
  {
    return $this->_weiblichInnsbruck;
  }

  public function getTnrWeiblichAuswaerts()
  {
    return $this->_weiblichAuswaerts;
  }

  public function getBelegungenCount4MitveranstalterGrouped($knr, $refreshCache = false)
  {
    static $cache = null;
    if ($refreshCache || is_null($cache)) {
      $alleDummyNummern = array($this->_maennlichInnsbruck, $this->_maennlichAuswaerts, $this->_weiblichInnsbruck, $this->_weiblichAuswaerts);

      $dbwBelegung = new DBWorkBelegung(1, true);
      $dbwBelegung->newSearch();
      $dbwBelegung->fromobject->status = '-ATP';
      $belegungen = $dbwBelegung->getBelegungenbyKursAndTeilnehmerAry($knr, $alleDummyNummern);

      
      $tnrTypMap = $this->getTnrTypMap();

      $result = array(
          $tnrTypMap[$this->_maennlichInnsbruck] => 0,
          $tnrTypMap[$this->_maennlichAuswaerts] => 0,
          $tnrTypMap[$this->_weiblichInnsbruck] => 0,
          $tnrTypMap[$this->_weiblichAuswaerts] => 0
      );

      foreach ($belegungen as $belegung) {
        $result[$tnrTypMap[$belegung->tnr]] += 1;
      }
      $cache = $result;
    }

    return $cache;
  }

  public function changeTnCount($knr, $maennlichInnsbruckChange, $maennlichAuswaertsChange, $weiblichInnsbruckChange, $weiblichAuswaertsChange)
  {
    $successMI = $this->changeTnCount4Group($knr, $this->_maennlichInnsbruck, $maennlichInnsbruckChange);
    $successMA = $this->changeTnCount4Group($knr, $this->_maennlichAuswaerts, $maennlichAuswaertsChange);
    $successWI = $this->changeTnCount4Group($knr, $this->_weiblichInnsbruck, $weiblichInnsbruckChange);
    $successWA = $this->changeTnCount4Group($knr, $this->_weiblichAuswaerts, $weiblichAuswaertsChange);

    return $successMI && $successMA && $successWI && $successWA;
  }

  private function changeTnCount4Group($knr, $pTnr, $change)
  {
    if (is_numeric($change) && $change != 0) {
      if ($change > 0) {
        return $this->addTn($knr, $pTnr, $change);
      
      } else {
        
        
        return $this->delTn($knr, $pTnr, abs($change));
      }
    }

    return true;
  }

  private function addTn($knr, $pTnr, $anzahl)
  {
    $success = true;
    for ($i = 0; $i < $anzahl && $i < 30; $i++) {
      $successSingleTn = $this->addSingleTn($knr, $pTnr);
      $success = $success && $successSingleTn;
    }

    return $success;
  }

  private function addSingleTn($knr, $pTnr)
  {
    
    SessionOperations::setVarValueAnm(ANMELDEART, ''); 

    SessionOperations::setVarValueIntern('w_nachlassbetrag', -APIGebuehren::getGebuehren($pTnr, $knr));
    $anmeldeStaticSight = new AnmeldeStaticSight();
    $anmeldevorgangAr = $anmeldeStaticSight->doAnmeldung($pTnr, $knr);

    return $anmeldevorgangAr[0];
  }

  private function delTn($knr, $pTnr, $anzahl)
  {
    $dbwBelegung = new DBWorkBelegung(1, true);
    $dbwBelegung->newSearch();
    $dbwBelegung->fromobject->status = '-ATP';
    $belegungen = $dbwBelegung->getBelegungenbyKursTeilnehmerNR($knr, $pTnr);

    $success = true;
    for ($i = 0; $i < $anzahl && $i < 30; $i++) {
      if (isset($belegungen[$i])) {
        $successCode = StornoAPI::stornoDmz($belegungen[$i]);
        $success = $success && $successCode == StornoAPI::SEND_SUCCESSFUL_PER_DMZ;
      }
    }

    return $success;
  }
}