<?php

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

class DataMenuZsaZielbereichAendern extends DataMenuMainTopLeft
{
  private $exportadapterStammhoerer;
  private $exportadapterBkbvtn;
  private $dbwBkBvTn;
  private $dbwTnZbZg;

  private $zsaHelper;

  const STATUS_EINFUEGEN_ERFOLGREICH = 1;
  const STATUS_EINFUEGEN_EINGABEN_FEHLERHAFT = 2;
  const STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_BKBVTN = 3;
  const STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_TNTBZG = 4;
  const STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_BKBVTN_DOPPELT = 5;

  const STATUS_DEAKTIVIEREN_ERFOLGREICH = 11;
  const STATUS_DEAKTIVIEREN_FEHLER = 12;

  const STATUS_BEARBEITEN_ERFOLGREICH = 21;
  const STATUS_BEARBEITEN_EINGABEN_FEHLERHAFT = 22;
  const STATUS_BEARBEITEN_FEHLER_BEIM_BEARBEITEN_BKBVTN = 23;
  const STATUS_BEARBEITEN_FEHLER_BEIM_BEARBEITEN_TNTBZG = 24;

  public static $status = 0;

  public function __construct($urlParam)
  {
    parent::__construct($urlParam);

    $this->exportadapterStammhoerer = new ExpStammhoerer();
    $this->exportadapterBkbvtn = new ExpBkBvTn();
    $this->exportadapter = $this->exportadapterStammhoerer;
    $this->dbwBkBvTn = new DBWorkZsaBkBvTn(1, true);
    $this->dbwTnZbZg = new DBWorkZsaTnZbZg(1, true);
    $this->zsaHelper = new Kufer\Web\Classes\Api\Helpers\ZsaHelper($this->dbwBkBvTn);
  }

  public function getsight($sightid = 546)
  {
    parent::getsight($sightid);
  }

  public function mainmenu()
  {
    $wblogin = $this->getWbLogin();
    if ($wblogin == null) {
      $this->getsight(); 

      echo '<div class="hauptseite">' . "\n";
      $this->_showNichtEingeloggt();
      echo '</div>';
    } else {
      
      if (GetOperations::getVarValue('action') == 'bkbvtn_bearbeiten') {
        if (Xsrf::checkAndUseXsrfFromGet('bkbvtn_bearbeiten', GetOperations::getVarValue('bkbvtnid')) == Xsrf::KEY_OK) {
          $this->handleBkBvtnBearbeiten($wblogin);
        }
      } elseif (GetOperations::getVarValue('action') == 'bkbvtn_hinzufuegen') {
        if (Xsrf::checkAndUseXsrfFromGet('bkbvtn_hinzufuegen') == Xsrf::KEY_OK) {
          $this->handleBkBvTnHinzufuegen($wblogin);
        }
      } elseif (GetOperations::getVarValue('action') == 'bkbvtn_deaktivieren') {
        if (Xsrf::checkAndUseXsrfFromGet('bkbvtn_deaktivieren', GetOperations::getVarValue('bkbvtnid')) == Xsrf::KEY_OK) {
          $this->handleBkBvTnDeaktivieren($wblogin);
        }
      }
      $this->exportadapterStammhoerer->setSightInfo('status_zb_aendern', self::$status);
      parent::mainmenu();
    }
  }

  private function handleBkBvTnDeaktivieren($wblogin)
  {
    $bkbvtn = $this->dbwBkBvTn->getOne(GetOperations::getVarValue('bkbvtnid'));

    if ($bkbvtn->tnr == $wblogin->tnr && $bkbvtn->typ == 'TN' && $bkbvtn->status == 'A') {
      $origBkBvtn = clone($bkbvtn);
      $bkbvtn->status = 'S';
      $success = ZsaBkBvTnAPI::updateZsaBkBvTn($bkbvtn, $origBkBvtn);
      if ($success) {
        self::$status = self::STATUS_DEAKTIVIEREN_ERFOLGREICH;
        $this->sendMailDeaktivieren($bkbvtn, $wblogin);
      } else {
        self::$status = self::STATUS_DEAKTIVIEREN_FEHLER;
      }
    }
  }

  private function getBkBvTnFromRequest($wblogin)
  {
    $bkbvtn = $this->dbwBkBvTn->getNewObject();

    $bkbvtn->tnr = $wblogin->tnr;

    $bkbvtn->aktiv = 1;
    $bkbvtn->typ = 'TN';
    $bkbvtn->status = 'I';
    if (PostOperations::isDefined('zsa_zb')) {
      $bkbvtn->zb = PostOperations::getVarValue('zsa_zb');
    }
    if (PostOperations::isDefined('zsa_bemerkung_tn')) {
      $bkbvtn->bemerkung_tn = PostOperations::getVarValue('zsa_bemerkung_tn');
    }
    if (PostOperations::isDefined('zsa_ds')) {
      $bkbvtn->ds = PostOperations::getVarValue('zsa_ds');
    }

    return $bkbvtn;
  }

  private function handleBkBvTnHinzufuegen($wblogin)
  {
    $bkbvtn = $this->getBkBvTnFromRequest($wblogin);
    $zielgruppenIdsPost = PostOperations::getVarValue('zsa_zg', array());
    if ($this->checkBkBvTn($bkbvtn, $zielgruppenIdsPost, $wblogin)) {
      if ($this->hasTnAlreadyBkBvTn($bkbvtn)) {
        self::$status = self::STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_BKBVTN_DOPPELT;

        return;
      }

      $success = ZsaBkBvTnAPI::insertZsaBkBvTn(array($bkbvtn));
      if ($success) {
        $success = $this->handleZielGruppen($bkbvtn, $zielgruppenIdsPost);
        if ($success) {
          self::$status = self::STATUS_EINFUEGEN_ERFOLGREICH;
          
          $bkbvtnAusDb = $this->dbwBkBvTn->getOne($bkbvtn->id);
          $this->zsaHelper->sendMailHinzufuegen($bkbvtnAusDb, $wblogin);
        } else {
          self::$status = self::STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_TNTBZG;
        }
      } else {
        self::$status = self::STATUS_EINFUEGEN_FEHLER_BEIM_EINFUEGEN_BKBVTN;
      }
    } else {
      self::$status = self::STATUS_EINFUEGEN_EINGABEN_FEHLERHAFT;
    }
  }

  private function hasTnAlreadyBkBvTn($bkbvtn)
  {
    $dbwBkBvTn = new DBWorkZsaBkBvTn(1, true);
    $dbwBkBvTn->newSearch();
    $dbwBkBvTn->fromobject->tnr = $bkbvtn->tnr;
    $dbwBkBvTn->fromobject->typ = 'TN';
    $dbwBkBvTn->fromobject->ds = $bkbvtn->ds;
    $dbwBkBvTn->fromobject->zb = $bkbvtn->zb;

    $bkbvtnSQL = $dbwBkBvTn->getByFilter();
    $bkbvtnFilterd = array_filter($bkbvtnSQL, function($bkbvtnEinzeln) {
      
      return in_array($bkbvtnEinzeln->status, array('I', 'J', 'A'));
    });

    return count($bkbvtnFilterd) > 0;
  }

  private function checkBkBvTn($bkbvtn, $zielgruppenIdsPost, $wblogin)
  {
    
    if ($bkbvtn->tnr == $wblogin->tnr
    && $bkbvtn->zb > 0
    && $bkbvtn->ds > 0
    && $bkbvtn->typ == 'TN'
    && $bkbvtn->aktiv == 1
    && is_array($zielgruppenIdsPost)
    && count($zielgruppenIdsPost) > 0) {
      $zbDsMap = $this->dbwBkBvTn->getMapZielbereichDienststelle();
      
      if (isset($zbDsMap[$bkbvtn->zb]) && in_array($bkbvtn->ds, $zbDsMap[$bkbvtn->zb])) {
        $dbwCategories = new DBWorkCategories(1, true);

        $categories = $dbwCategories->getCategoriesById($zielgruppenIdsPost);
        
        if (count($categories) != count($zielgruppenIdsPost)) {
          return false;
        }
        
        foreach ($categories as $categorie) {
          if ($categorie->owner != $bkbvtn->zb) {
            return false;
          }
        }

        return true;
      }
    }

    return false;
  }

  private function handleBkBvtnBearbeiten($wblogin)
  {
    $bkbvtn = $this->dbwBkBvTn->getOne(GetOperations::getVarValue('bkbvtnid'));
    $origBkBvtn = clone($bkbvtn);
    $bkbvtn = $this->fillBkBvTnFromRequest($bkbvtn);

    $zielgruppenIdsPost = PostOperations::getVarValue('zsa_zg', array());
    
    if ($this->checkBkBvTn($bkbvtn, $zielgruppenIdsPost, $wblogin) && $bkbvtn->status == 'A') {
      $success = ZsaBkBvTnAPI::updateZsaBkBvTn($bkbvtn, $origBkBvtn);
      if ($success) {
        $success = $this->handleZielGruppen($bkbvtn, $zielgruppenIdsPost);
        if ($success) {
          self::$status = self::STATUS_BEARBEITEN_ERFOLGREICH;
        } else {
          self::$status = self::STATUS_BEARBEITEN_FEHLER_BEIM_BEARBEITEN_TNTBZG;
        }
      } else {
        self::$status = self::STATUS_BEARBEITEN_FEHLER_BEIM_BEARBEITEN_BKBVTN;
      }
    } else {
      self::$status = self::STATUS_BEARBEITEN_EINGABEN_FEHLERHAFT;
    }
  }

  private function fillBkBvTnFromRequest($bkbvtn)
  {
    if (PostOperations::isDefined('zsa_bemerkung_tn')) {
      $bkbvtn->bemerkung_tn = PostOperations::getVarValue('zsa_bemerkung_tn');
    }
    
    
    
    
    return $bkbvtn;
  }

  private function handleZielGruppen($bkbvtn, $zielgruppenIdsPost)
  {
    $zielgruppenDB = $this->dbwTnZbZg->getTnZbZgByBkBvTnId($bkbvtn->id);
    $zielgruppenIdsDb = ArrayOperations::mapAttribut($zielgruppenDB, 'zg');

    $neueZielGruppenIds = array_diff($zielgruppenIdsPost, $zielgruppenIdsDb);
    $entfalleneZielGruppenIds = array_diff($zielgruppenIdsDb, $zielgruppenIdsPost);

    $successInsert = $this->insertTnZbZgs($bkbvtn->id, $neueZielGruppenIds);
    $successDelete = $this->deleteTnZbZgs($entfalleneZielGruppenIds, $zielgruppenDB);

    return $successInsert && $successDelete;
  }

  private function insertTnZbZgs($bkbvtnid, $zielGruppenIds)
  {
    $tsaTnZbZgAry = $this->createTnZbZgAryFromZielgruppen($bkbvtnid, $zielGruppenIds);

    if (count($tsaTnZbZgAry) > 0) {
      return ZsaTnZbZgAPI::insertTnZbZg($tsaTnZbZgAry);
    }

    return true;
  }

  private function deleteTnZbZgs($zielGruppenIds, $tnzbzgFromDb)
  {
    $entfalleneTnZbZgIds = array();
    foreach ($tnzbzgFromDb as $tnzbzg) {
      if (in_array($tnzbzg->zg, $zielGruppenIds)) {
        $entfalleneTnZbZgIds[] = $tnzbzg->id;
      }
    }

    if (count($entfalleneTnZbZgIds) > 0) {
      return ZsaTnZbZgAPI::deleteTnZbZg($entfalleneTnZbZgIds); 
    }

    return true;
  }

  private function createTnZbZgAryFromZielgruppen($bkbvtnId, $zielGruppenIds)
  {
    $tsaTnZbZgAry = array();
    foreach ($zielGruppenIds as $zgId) {
      $tnzbzg = $this->dbwTnZbZg->getNewObject();
      $tnzbzg->tnzb = $bkbvtnId;
      $tnzbzg->aktiv = 1;
      $tnzbzg->zg = $zgId;
      $tsaTnZbZgAry[] = $tnzbzg;
    }

    return $tsaTnZbZgAry;
  }

  private function getBkBvTn()
  {
    $wblogin = $this->getWbLogin();

    $dbwBkBvTn = new DBWorkZsaBkBvTn(1, true);
    $dbwBkBvTn->newSearch();
    $dbwBkBvTn->fromobject->tnr = $wblogin->tnr;
    $dbwBkBvTn->fromobject->typ = 'TN';
    
    $dbwBkBvTn->fromobject->status = 'A';

    return $dbwBkBvTn->getByFilter();
  }

  public function getdataarrayheader()
  {
    $this->dataarrayheader = array($this->getWbLogin());
  }

  public function getdataarraybody()
  {
    $this->dataarraybody = $this->getBkBvTn();
  }

  public function getdataarrayfooter()
  {
    $this->dataarrayfooter = array($this->getWbLogin());
  }

  public function getdataarraynocolumn()
  {
    $this->dataarraynocolumn = array($this->getWbLogin());
  }

  public function showheader()
  {
    $tmp = $this->exportadapter;
    $this->exportadapter = $this->exportadapterStammhoerer;
    echo $this->getheader();
    $this->exportadapter = $tmp;
  }

  public function showbody()
  {
    $tmp = $this->exportadapter;
    $this->exportadapter = $this->exportadapterBkbvtn;
    echo $this->getbody();
    $this->exportadapter = $tmp;
  }

  public function showfooter()
  {
    $tmp = $this->exportadapter;
    $this->exportadapter = $this->exportadapterStammhoerer;
    echo $this->getfooter();
    $this->exportadapter = $tmp;
  }

  private function _showNichtEingeloggt()
  {
    $this->getdataarraynocolumn();
    $tmp = $this->exportadapter;
    $this->exportadapter = $this->exportadapterStammhoerer;
    $this->shownocolumn();
    $this->exportadapter = $tmp;
  }

  private function sendMailDeaktivieren($bkbvtn, $wblogin)
  {
    $betreff = 'Löschung einer Registrierung im Bildungsportal (LEL)';

    $ansprache = 'Herr';
    if ($wblogin->geschlecht == 'W') {
      $ansprache = 'Frau';
    }
    $tnName = $ansprache . ' ' . $wblogin->name . ' ' . $wblogin->vorname;

    $inhalt = $tnName . ' hat die Löschung der Registrierung für den Zielbereich ' . $bkbvtn->zielbereich->text . ' beantragt.<br>';
    $inhalt .= 'Der Status wurde auf „ausgeschieden“ gesetzt.<br><br>';
    $inhalt .= \Kufer\Web\Classes\Api\Helpers\ZsaHelper::getLinkKuferTools();

    return $this->zsaHelper->mailAnBv($betreff, $inhalt, $bkbvtn, false);
  }

  private function getWbLogin()
  {
    static $cache = null;
    if (!is_null($cache)) {
      return $cache;
    }

    $wblogin = SessionOperations::getWbLogin();
    if (is_null($wblogin)) {
      $cache = null;

      return $cache;
    }

    $teilnehmer = SessionOperations::wBLoginToTeilnehmerPflicht($wblogin);

    try {
      $tnIdAry = TeilnehmerAPI::isDublette($teilnehmer, TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL_GEBDAT);
      if ($tnIdAry == false || !is_array($tnIdAry) || $tnIdAry['replikatid'] == false) {
        Logger::logg('Die MySQL-Teilnehmernummer des Stammhörers konnte nicht ermittelt werden. Vorsichtshalber abbrechen', 200);

        return null;
      } else {
        
        $tnIdMysql = $tnIdAry['replikatid'];

        $wblogin->tnr = $tnIdMysql;
        $cache = $wblogin;

        return $cache;
      }
    } catch (Exception $e) {
      Logger::logg('DMZ-Fehlermeldung beim Ermitteln der MySQL-Teilnehmernummer des Stammhörers: ' . $e->getMessage(), 200);

      return null;
    }
  }
}