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

class NotenAPI
{
  
  public function sendDataToDmz($pTupelAry, $notenEnde, $belNiveauAry, $nichtbenotetAry)
  {
    $abgleichApi = new AbgleichAPI();

    if (!$abgleichApi->isAktiviert()) {
      throw new AbgleichApiException('DMZ-Dienst nicht aktiviert');
    }

    $xmlNoten = new XMLNode('noten');
    $xmlNotenEnde = new XMLNode('noten_ende');
    $xmlBelegungen = new XMLNode('belegungen');
    $xmlNichtBenotet = new XMLNode('tnfaecher');

    foreach ($pTupelAry as $tupel) {
      $note = $tupel->object;

      if (!empty($note)) {
        $node = new XMLNode('noteneintrag');
        $idNode = new XMLNode('id', $note->getDMZValue('id'));
        if ($note->replikatgeneriert) {
          $idNode->setAttributes('replikat="true"');
        }
        $node->addChild($idNode);
        $node->addChild(new XMLNode('beleg_id', $note->getDMZValue('beleg_id')));
        $node->addChild(new XMLNode('pruef_id', $note->getDMZValue('pruef_id')));
        $node->addChild(new XMLNode('fach_id', $note->getDMZValue('fach_id')));
        $node->addChild(new XMLNode('pruefung', $note->getDMZValue('pruefung')));
        $node->addChild(new XMLNode('note', $note->getDMZValue('note')));
        $node->addChild(new XMLNode('indnote', $note->getDMZValue('indnote')));
        $node->addChild(new XMLNode('datum', $note->getDMZValue('datum')));
        $node->addChild(new XMLNode('bemerkung', $note->getDMZValue('bemerkung')));
        $node->addChild(new XMLNode('gewichtung', $note->getDMZValue('gewichtung')));
        $node->addChild(new XMLNode('typ', $note->getDMZValue('typ')));
        $node->addChild(new XMLNode('bearbdatum', $note->getDMZValue('bearbdatum')));
        $xmlNoten->addChild($node);
      }
    }

    foreach ($belNiveauAry as $belegung) {
      if (!empty($belegung)) {
        $belNode = new XMLNode('belegung');
        $belNode->addChild(new XMLNode('id', $belegung->getDMZValue('id')));
        $fieldValue = $belegung->getDMZValue('niveau');
        $fieldAttr = '';
        if ($fieldValue === '') {
          $fieldValue = '-';
          $fieldAttr = 'leer="true"';
        }
        $belNode->addChild(new XMLNode('niveau', $fieldValue, $fieldAttr));
        $xmlBelegungen->addChild($belNode);
      }
    }

    foreach ($notenEnde as $bel) {
      $node = new XMLNode('beleg_id', $bel);
      $xmlNotenEnde->addChild($node);
    }

    foreach ($nichtbenotetAry as $tnFach) {
      if (!empty($tnFach)) {
        $tnfNode = new XMLNode('tnfach');
        $tnfNode->addChild(new XMLNode('id', $tnFach->getDMZValue('id')));
        $fieldValue = $tnFach->getDMZValue('nichtbeurteilt');
        $fieldAttr = '';
        if ($fieldValue === '') {
          $fieldValue = '-';
          $fieldAttr = 'leer="true"';
        }
        $tnfNode->addChild(new XMLNode('nichtbeurteilt', $fieldValue, $fieldAttr));
        $xmlNichtBenotet->addChild($tnfNode);
      }
    }


    $nutzlast = new Nutzlast(null);
    $nutzlast->removeAllNodes();

    if ($xmlNoten->hasChildren()) {
      $nutzlast->addNode($xmlNoten);
    }

    if ($xmlNotenEnde->hasChildren()) {
      $nutzlast->addNode($xmlNotenEnde);
    }

    if ($xmlBelegungen->hasChildren()) {
      $nutzlast->addNode($xmlBelegungen);
    }

    if ($xmlNichtBenotet->hasChildren()) {
      $nutzlast->addNode($xmlNichtBenotet);
    }

    if (!$nutzlast->hasChildren()) {
      return;
    }

    $abgleichApi->sendeNachricht(AbgleichAPI::ABGLEICH_NOTEN, $nutzlast);
  }

  
  public function setNotenEnde($aryBelegung, $pStatus5)
  {
    if (!is_array($aryBelegung) && count($aryBelegung) < 1) {
      throw new Exception('ungültiger Aufruf - $aryBelegung muss ein nicht leeres Array sein');
    }
    $dbBelegung = new DBWorkBelegung();
    foreach ($aryBelegung as $teilnehmer) {
      $teilnehmer->notenende = 'W';
      $dbBelegung->updateBelegung($teilnehmer, $pStatus5);
    }
    


    $settingsAllg = AllgSettingsAPI::getAllgSettings();

    $currentUser = SessionOperations::getCurrentWebToolsUser();

    $vars = array(
      'k_id' => $aryBelegung[0]->kurs->nr_anzeige,
      'user_name' => $currentUser->name,
      'user_vorname' => $currentUser->vorname,
      'kurstitel' => $aryBelegung[0]->kurs->getVarValue('kurzbez_titel')
    );

    $varsNames = \array_map(static function($str) {
      return '{%' . $str . '%}';
    }, \array_keys($vars));
    $varsValues = array_values($vars);

    $subject = trim($settingsAllg->emailBetreffNotenEinreichen);
    $subject = \str_replace($varsNames, $varsValues, $subject);

    $text = trim($settingsAllg->emailTextNotenEinreichen);
    $text = \str_replace($varsNames, $varsValues, $text);

    $email = new \Kufer\Mail\EMail\EMailPlaintext($subject, $text);

    $sender = \Kufer\Mail\Sender\EMailSenderFactory::createForToolsWithCustomAddress($settingsAllg->emailAnNotenEinreichen);

    return $sender->informEinrichtung($email)->hasSentAnyMails();
  }

  
  public function updateNotenInDB($pAryTupel, $pStatus5)
  {
    $dbNoten = new DBWorkTNNoten();
    foreach ($pAryTupel as $tupel) {
      if ($tupel->flag) {
        continue;
      }
      $note = $tupel->object;
      $dbNoten->updateNote($note, $pStatus5);
    }
  }

  public function updateBelegungInDB($pAryBelegung, $pStatus5)
  {
    $dbBelegung = new DBWorkBelegung();
    foreach ($pAryBelegung as $belegung) {
      $dbBelegung->updateBelegung($belegung, $pStatus5);
    }
  }

  public function updateTnFachInDB($pAryTnFach, $pStatus5)
  {
    $dbTNFach = new DBWorkTNFach();
    foreach ($pAryTnFach as $tnFach) {
      $dbTNFach->updateTNFach($tnFach, $pStatus5);
    }
  }

  
  public function revertNotenInDB($pAryTupel)
  {
    $dbNoten = new DBWorkTNNoten();
    foreach ($pAryTupel as $tupel) {
      
      if (!$tupel->flag) {
        continue;
      }
      $note = $tupel->object;
      $dbNoten->revertNote($note->id);
    }
  }
}