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

namespace Kufer\KuferTools\Utils\WssField;

class WssFieldKursEinzelveranstaltung extends WssField
{
  public function getChangedInfo($columnValues, $changedDm, $changedFields): array
  {
    $changedDmAndFieldTuple = array('changed' => $changedDm, 'changedFields' => $changedFields);

    
    $bereitsGeaendert = count(array_intersect($this->felderEinzelveranstaltungen(), $changedFields)) > 0;

    
    
    if ($this->datamodulColumn->accesslevel == 2 && $this->datamodulColumn->canedit == 1 && !$bereitsGeaendert) {
      $changedDmAndFieldTuple = $this->handleErwachseneTeilnehmer($changedDmAndFieldTuple, $changedDm, $columnValues);
      $changedDmAndFieldTuple = $this->handleKinder($changedDmAndFieldTuple, $changedDm, $columnValues);
    }

    return $changedDmAndFieldTuple;
  }

  private function handleErwachseneTeilnehmer($changedDmAndFieldTuple, $changedDm, $columnValues)
  {
    $ez = new Einzelveranstaltung();
    if (isset($columnValues[$this->getDatamodulName()]['teinzel_u'])) {
      $ez->initBevorzugeUnbekannt(
        $this->getNewValue('teinzel', $changedDm, $columnValues),
        $this->getNewValue('teinzel_m', $changedDm, $columnValues),
        $this->getNewValue('teinzel_w', $changedDm, $columnValues),
        $this->getNewValue('teinzel_u', $changedDm, $columnValues)
      );
    } else {
      $ez->initBevorzugeGesamt(
        $this->getNewValue('teinzel', $changedDm, $columnValues),
        $this->getNewValue('teinzel_m', $changedDm, $columnValues),
        $this->getNewValue('teinzel_w', $changedDm, $columnValues),
        $this->getNewValue('teinzel_u', $changedDm, $columnValues)
      );
    }

    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'teinzel', $ez->getTeilnehmerGesamt());
    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'teinzel_m', $ez->getTeilnehmerMaennlich());
    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'teinzel_w', $ez->getTeilnehmerWeiblich());

    return $this->changeResult($changedDmAndFieldTuple, 'teinzel_u', $ez->getTeilnehmerUnbekannt());
  }

  private function handleKinder($changedDmAndFieldTuple, $changedDm, $columnValues)
  {
    $ez = new Einzelveranstaltung();
    if (isset($columnValues[$this->getDatamodulName()]['keinzel_u'])) {
      $ez->initBevorzugeUnbekannt(
        $this->getNewValue('kinder_ev', $changedDm, $columnValues),
        $this->getNewValue('keinzel_m', $changedDm, $columnValues),
        $this->getNewValue('keinzel_w', $changedDm, $columnValues),
        $this->getNewValue('keinzel_u', $changedDm, $columnValues)
      );
    } else {
      $ez->initBevorzugeGesamt(
        $this->getNewValue('kinder_ev', $changedDm, $columnValues),
        $this->getNewValue('keinzel_m', $changedDm, $columnValues),
        $this->getNewValue('keinzel_w', $changedDm, $columnValues),
        $this->getNewValue('keinzel_u', $changedDm, $columnValues)
      );
    }

    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'kinder_ev', $ez->getTeilnehmerGesamt());
    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'keinzel_m', $ez->getTeilnehmerMaennlich());
    $changedDmAndFieldTuple = $this->changeResult($changedDmAndFieldTuple, 'keinzel_w', $ez->getTeilnehmerWeiblich());

    return $this->changeResult($changedDmAndFieldTuple, 'keinzel_u', $ez->getTeilnehmerUnbekannt());
  }

  private function getOrigValue($fieldname, $changedDm)
  {
    return $changedDm->getVarValueEx($fieldname, $this->getDatamodulName());
  }

  private function getNewValue($fieldname, $changedDm, $columnValues)
  {
    return $columnValues[$this->getDatamodulName()][$fieldname] ?? $this->getOrigValue($fieldname, $changedDm);
  }

  private function changeResult($changedDmAndFieldTuple, $fieldname, $newValue)
  {
    if ($newValue != $this->getOrigValue($fieldname, $changedDmAndFieldTuple['changed'])) {
      $changedDmAndFieldTuple['changed']->setValue2VarEx($fieldname, $newValue, $this->getDatamodulName());
      $changedDmAndFieldTuple['changedFields'][] = $fieldname;
    }

    return $changedDmAndFieldTuple;
  }

  private function felderEinzelveranstaltungen()
  {
    return array('teinzel', 'teinzel_m', 'teinzel_w', 'teinzel_u', 'kinder_ev', 'keinzel_m', 'keinzel_w', 'keinzel_u');
  }
}


class Einzelveranstaltung
{
  private $teilnehmerGesamt = 0;
  private $teilnehmerMaennlich = 0;
  private $teilnehmerWeiblich = 0;
  private $teilnehmerUnbekannt = 0;

  
  public function initBevorzugeGesamt($gesamt, $maennlich, $weiblich, $unbekannt)
  {
    
    $this->setTeilnehmerMaennlich($maennlich);
    $this->setTeilnehmerWeiblich($weiblich);
    $this->setTeilnehmerUnbekannt($unbekannt);
    $this->setTeilnehmerGesamt($gesamt);
  }

  
  public function initBevorzugeUnbekannt($gesamt, $maennlich, $weiblich, $unbekannt)
  {
    
    $this->setTeilnehmerMaennlich($maennlich);
    $this->setTeilnehmerWeiblich($weiblich);
    $this->setTeilnehmerGesamt($gesamt);
    $this->setTeilnehmerUnbekannt($unbekannt);
  }

  public function setTeilnehmerGesamt($gesamt)
  {
    $this->teilnehmerGesamt = max(array(0, $gesamt, $this->teilnehmerMaennlich + $this->teilnehmerWeiblich));
    $this->teilnehmerUnbekannt = $this->teilnehmerGesamt - ($this->teilnehmerMaennlich + $this->teilnehmerWeiblich);
  }

  public function setTeilnehmerUnbekannt($unbekannt)
  {
    $this->teilnehmerUnbekannt = max(array(0, $unbekannt));
    $this->teilnehmerGesamt = $this->teilnehmerUnbekannt + $this->teilnehmerMaennlich + $this->teilnehmerWeiblich;
  }

  public function setTeilnehmerMaennlich($maennlich)
  {
    $this->teilnehmerMaennlich = max(array(0, $maennlich));
    $this->teilnehmerGesamt = $this->teilnehmerUnbekannt + $this->teilnehmerMaennlich + $this->teilnehmerWeiblich;
  }

  public function setTeilnehmerWeiblich($maennlich)
  {
    $this->teilnehmerWeiblich = max(array(0, $maennlich));
    $this->teilnehmerGesamt = $this->teilnehmerUnbekannt + $this->teilnehmerWeiblich + $this->teilnehmerWeiblich;
  }

  public function getTeilnehmerGesamt()
  {
    return $this->teilnehmerGesamt;
  }

  public function getTeilnehmerUnbekannt()
  {
    return $this->teilnehmerUnbekannt;
  }

  public function getTeilnehmerMaennlich()
  {
    return $this->teilnehmerMaennlich;
  }

  public function getTeilnehmerWeiblich()
  {
    return $this->teilnehmerWeiblich;
  }

  public static function getJsDeclarations($kurs)
  {
    $result = \JsOperations::getDeclarationInt('KuferTools.Kursplanung.ErwachseneGesamt', $kurs->getVarValueEx('teinzel', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.ErwachseneMaennlich', $kurs->getVarValueEx('teinzel_m', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.ErwachseneWeiblich', $kurs->getVarValueEx('teinzel_w', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.ErwachseneUnbekannt', $kurs->getVarValueEx('teinzel_u', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.KinderGesamt', $kurs->getVarValueEx('kinder_ev', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.KinderMaennlich', $kurs->getVarValueEx('keinzel_m', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.KinderWeiblich', $kurs->getVarValueEx('keinzel_w', 'kurs'));
    $result .= \JsOperations::getDeclarationInt('KuferTools.Kursplanung.KinderUnbekannt', $kurs->getVarValueEx('keinzel_u', 'kurs'));

    return $result;
  }
}