<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

namespace Kufer\Web\KuferTools\Allgemein\PersoenlicheDaten\AenderePersoenlicheDaten;

use Kufer\Web\KuferTools\Allgemein\PersoenlicheDaten\AenderePersoenlicheDaten\EMail\AenderePersoenlicheDatenDozEMailView;
use Kufer\Web\KuferTools\Basis\View\ViewSight;
use Kufer\Web\KuferTools\Utils\DozentenHandler\DozentUpdater;

class AenderePersoenlicheDatenDozUseCase extends AenderePersoenlicheDatenUseCase
{
  public static function getToolSectionId()
  {
    return 90;
  }

  protected function isBearbeitenAllowed(): bool
  {
    return $this->isRechtAllowed('90.0.1');
  }

  
  protected function getOrigPerson(): \Personn
  {
    $user = $this->getUser();
    $dbworkDozent = new \DBWorkDozenten();
    $dozent = $dbworkDozent->getDozent($user->dnr, true);
    $dozent->freieCheckbox = '';

    return $dozent;
  }

  protected function getDbwFreiWaehlbareeingabefelder(): ?\DBWorkFreiWaehlbareEingabefelder
  {
    return new \DBWorkFreiWaehlbareEingabefelder4Dozent();
  }

  protected function sendMitteilung($person, $origPerson): string
  {
    if (\DBWorkBASysSettings::isMVHS() && !$this->aenderungenDirektUebermitteln()) {
      $diffFields = $person->getDiffFields($origPerson);
      if (in_array('krit9', $diffFields)) {
        $dmzStatus = $this->updateNutzungsbedingungenBestaetigenDirekt($person, $origPerson);
        if ($dmzStatus === DozentUpdater::SUCCESS_DOZENT_ERFOLGREICH_UEBERMITTELT) {
          
          $origPerson->krit9 = $person->krit9;
          $this->updatePersonReplikat($origPerson);
          $statusCode = parent::SUCCESS_EMAIL_VERSENDET;
          if (count($diffFields) > 1) {
            $statusCode = parent::sendMitteilung($person, $origPerson);
          }
        } else {
          $statusCode = parent::ERROR_EMAIL_NICHT_VERSENDET;
        }
      } else {
        $statusCode = parent::sendMitteilung($person, $origPerson);
      }

      return $statusCode;
    }

    return parent::sendMitteilung($person, $origPerson);
  }

  
  protected function setFelderDieNichtGeaendertWerdenSollen(\Personn $person, \Personn $origPerson): \Personn
  {
    if ($this->toolSettings->dontUpdateWSSFieldProfil) {
      $person->profil = $origPerson->profil;
    }

    return $person;
  }

  protected function updatePersonReplikat(\Dozent $pOrigDozent): void
  {
    if (\SessionOperations::isReplikat()) {
      $dbwDozenten = new \DBWorkDozenten(1, true);
      $dozentTmp = clone($pOrigDozent);
      unset($dozentTmp->freieCheckbox);
      $dbwDozenten->updateDozent($dozentTmp, true);
    }
  }

  
  protected function updatePerson(\Personn $pPerson): void
  {
    if (\SessionOperations::isReplikat()) {
      $dbwdozent = new \DBWorkDozenten();
      $dozentTmp = clone($pPerson);
      unset($dozentTmp->freieCheckbox);
      $dbwdozent->updateDozent($dozentTmp, true);
      $this->updateDozBezirk($dozentTmp);
    }
  }

  
  protected function aendereDatenDirekt(\Personn $pOrigPerson, \Personn $pPerson, array $pChangedFields): string
  {
    $dozentUpdater = new DozentUpdater($this->toolSettings);
    list($person, $changedFields) = $dozentUpdater->preUpdateHook($pPerson, $pChangedFields);
    $statusCodeDozUpdater = $dozentUpdater->saveDozent($pOrigPerson, $person, $changedFields);

    return $this->getStatusCode($statusCodeDozUpdater);
  }

  private function getStatusCode(string $pStatusCodePersonUpdater): string
  {
    $statusCode = '';
    if ($pStatusCodePersonUpdater === DozentUpdater::SUCCESS_DOZENT_ERFOLGREICH_UEBERMITTELT) {
      $statusCode = static::SUCCESS_EMAIL_VERSENDET;
    }
    if ($pStatusCodePersonUpdater === DozentUpdater::INFO_DOZENTDATEN_NICHT_VERAENDERT) {
      $statusCode = static::INFO_KEINE_AENDERUNGEN_VORGENOMMEN;
    }
    if ($pStatusCodePersonUpdater === DozentUpdater::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN) {
      $statusCode = static::ERROR_EMAIL_NICHT_VERSENDET;
    }
    if ($pStatusCodePersonUpdater === DozentUpdater::ERROR_DOZENTDATEN_NICHT_AKTUELL) {
      $statusCode = static::ERROR_PERSONENDATEN_NICHT_AKTUELL;
    }

    \Logger::logg('Fehler beim Ändern der persönlichen Daten (Dozenten-Nr. ' . static::getUser()->dnr . '). Statuscode: ' . $statusCode, 20);

    if ($statusCode === '') {
      \Logger::logg(__METHOD__ . ': Unbekannten Statuscode erhalten (ggf. Methode erweitern)! Statuscode: ' . $pStatusCodePersonUpdater, 250);
    }

    return $statusCode;
  }

  protected function getPersonTypKurz(): string
  {
    return 'D';
  }

  protected function getBenutzergruppe4ColumnValues(): string
  {
    return 'dozent';
  }

  protected function isFieldCheckbox(string $pFieldname): bool
  {
    $doz = new \Dozent();

    return $doz->getTyp($pFieldname) === \DatamodulVarType::TYPE_BOOL_WF;
  }

  protected function aenderungenDirektUebermitteln(): bool
  {
    return $this->toolSettings->aenderungenDirektUebermittelnDozent;
  }

  protected function sollInfoMailAnEinrichtungGesendetWerden(): bool
  {
    return !$this->toolSettings->keineInfoAnEinrichtungSendenDozent;
  }

  private function updateDozBezirk(\Dozent $pDozent): void
  {
    $dbwDozBezirk = new \DBWorkDozBezirk(1, true);
    $dbwDozBezirk->deleteDozBezirkByDozentId(($pDozent->id));

    foreach ($pDozent->einsatzbezirke as $dozBezirk) {
      $dbwDozBezirk->insertOne($dozBezirk, '', 'id', true, false);
    }
  }

  protected function createEMailView(\Personn $person, \Personn $origPerson): ViewSight
  {
    return new AenderePersoenlicheDatenDozEMailView($this->createEMailViewModel($person, $origPerson));
  }

  protected function updateNutzungsbedingungenBestaetigenDirekt(\Dozent $pDozent, \Dozent $pOrigDozent): string
  {
    if (\SessionOperations::isDmzBetrieb()) {
      try {
        $changedFields = array('krit9');
        $dozentTuple = new \Tuple($pDozent, $changedFields, $pOrigDozent);
        \DozentenAPI::correctDozenten($dozentTuple, 'update');

        return DozentUpdater::SUCCESS_DOZENT_ERFOLGREICH_UEBERMITTELT;
      } catch (\AbgleichApiException $aae) {
        \Logger::logg('Dozentenkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);
        if ($aae->errorType == \AbgleichApiResult::CONFLICT) {
          return DozentUpdater::ERROR_DOZENTDATEN_NICHT_AKTUELL;
        } else {
          return DozentUpdater::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN;
        }
      } catch (\Exception $e) {
        \Logger::logg('Dozentenkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);

        return DozentUpdater::INFO_DOZENTDATEN_NICHT_VERAENDERT;
      }
    }

    return '';
  }
}