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

namespace Kufer\Web\KuferTools\Basis\KursPlanung\KursVorschlag;

use Kufer\Web\KuferTools\Basis\KursPlanung\Utils\EmailBenachrichtigung;

abstract class KursVorschlagAbsendenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase implements \Kufer\Web\KuferTools\Utils\Kursplanung\KursplanungSender
{
  public const SUCCESS_KURSPLANUNG_VERSENDET = 'kursplanungVersendet';
  public const SUCCESS_KURSPLANUNG_ZWISCHENGESPEICHERT = 'kursplanungZwischengespeichert';
  public const SUCCESS_KURSPLANUNG_PLANENDE_MITARBEITER_VERSENDET = 'kursplanungPlanendeMAVersendet';
  public const SUCCESS_KURSPLANUNG_VERWALTENDE_MITARBEITER_VERSENDET = 'kursplanungVerwaltendeMAVersendet';
  public const SUCCESS_KURSPLANUNG_VERANTWORTENDE_MITARBEITER_VERSENDET = 'kursplanungVerantwortendeMAVersendet';

  public const SUCCESS_INFO_EMAIL_AN_EINRICHTUNG_VERSENDET = 'infoEmailAnEinrichtungVersendet';
  public const SUCCESS_INFO_EMAIL_AN_PLANENDEN_MITARBEITER_VERSENDET = 'infoEmailAnPlanendenMitarbeiterVersendet';
  public const SUCCESS_INFO_EMAIL_AN_VERWALTENDEN_MITARBEITER_VERSENDET = 'infoEmailAnVerwaltendenMitarbeiterVersendet';
  public const SUCCESS_INFO_EMAIL_AN_VERANTWORTENDEN_MITARBEITER_VERSENDET = 'infoEmailAnVerantwortendenMitarbeiterVersendet';
  public const SUCCESS_EMAIL_AN_USER_VERSENDET = 'eMailAnUserVersendet';

  public const ERROR_KURSPLANUNG_PLANENDE_MITARBEITER_NICHT_VERSENDET = 'kursplanungPlanendeMANichtVersendet';
  public const ERROR_KURSPLANUNG_VERWALTENDE_MITARBEITER_NICHT_VERSENDET = 'kursplanungVerwaltendeMANichtVersendet';
  public const ERROR_KURSPLANUNG_VERANTWORTENDE_MITARBEITER_NICHT_VERSENDET = 'kursplanungVerantwortendeMANichtVersendet';
  public const ERROR_KURSPLANUNG_NICHT_VERSENDET = 'kursplanungNichtVersendet';
  public const ERROR_EMAIL_AN_USER_NICHT_VERSENDET = 'eMailAnUserNichtVersendet';
  public const ERROR_INFO_EMAIL_AN_PLANENDEN_MITARBEITER_NICHT_VERSENDET = 'infoEMailAnPlanendenMitarbeiterNichtVersendet';
  public const ERROR_INFO_EMAIL_AN_VERWALTENDEN_MITARBEITER_NICHT_VERSENDET = 'infoEMailAnVerwaltendenMitarbeiterNichtVersendet';
  public const ERROR_INFO_EMAIL_AN_VERANTWORTENDEN_MITARBEITER_NICHT_VERSENDET = 'infoEMailAnVerantwortendenMitarbeiterNichtVersendet';
  public const ERROR_INFO_EMAIL_AN_EINRICHTUNG_NICHT_VERSENDET = 'infoEmailAnEinrichtungNichtVersendet';
  public const ERROR_DOPPELT_ABSENDEN = 'kursplanungDoppeltVersandt';
  public const ERROR_KURSPLANUNGSDATEN_FEHLERHAFT = 'kursplanungsdatenFehlerhaft';

  public function __construct($request)
  {
    parent::__construct($request, new KursVorschlagAbsendenResponse());
  }

  public static function getToolSectionId()
  {
    return 282;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    } elseif (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  
  public function action()
  {
    $kursplanung = $this->getChangedKursplanung();
    if ($this->request->isRefresh) {
      $statusCodes = array(self::ERROR_DOPPELT_ABSENDEN);
    } else {
      $statusCodes = $this->processKursplanung($kursplanung);
    }

    return $this->getResponse($kursplanung, $statusCodes);
  }

  protected function hideBackButton()
  {
    return false;
  }

  protected function formularAnzeigenAction()
  {
    return 'kursvorschlag';
  }

  protected function formularAbsendenAction()
  {
    return 'sendeKursvorschlag';
  }

  
  protected function getResponse($pKursplanung, $pStatusCodes)
  {
    $this->handleResponseStrategies();
    $this->response->kursplanung = $pKursplanung;
    $this->response->statusCodes = $pStatusCodes;
    $this->response->showDatenandereKurseKopieren = $this->isKursKopieAllowed();
    $this->response->hideBackButton = $this->hideBackButton();
    $this->response->formularAnzeigenAction = $this->formularAnzeigenAction();
    $this->response->formularAbsendenAction = $this->formularAbsendenAction();
    $this->response->showButtonKursvorschlagSpeichern = $this->showButtonZwischenspeichern();
    $this->response->readOnly = in_array(self::SUCCESS_KURSPLANUNG_VERSENDET, $pStatusCodes)
      || in_array(self::SUCCESS_KURSPLANUNG_ZWISCHENGESPEICHERT, $pStatusCodes)
      || in_array(self::SUCCESS_KURSPLANUNG_PLANENDE_MITARBEITER_VERSENDET, $pStatusCodes)
      || in_array(self::SUCCESS_KURSPLANUNG_VERWALTENDE_MITARBEITER_VERSENDET, $pStatusCodes)
      || in_array(self::SUCCESS_KURSPLANUNG_VERANTWORTENDE_MITARBEITER_VERSENDET, $pStatusCodes)
      || $this->request->isRefresh;

    return $this->response;
  }

  protected function showButtonZwischenspeichern()
  {
    return \DBWorkBASysSettings::isSalzburgBildungswerk();
  }

  protected function getResponseStrategies()
  {
    return array(
      new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this),
      new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseWss($this),
      new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseWithToolSettings($this)
    );
  }

  abstract protected function getBenutzerKuerzel();

  abstract protected function getDnr4Planung($pKnr);

  abstract protected function isKursKopieAllowed();

  abstract protected function getEMail4Einrichtung();

  
  private function getChangedKursplanung()
  {
    $kursPlanung = $this->request->wssHandler->getChangedDm(
      $this->toolSettings,
      new \Kursplanung(),
      $this->request->columnValues
    );
    $kursPlanung->woher = $this->getBenutzerKuerzel();
    $kursPlanung->zeitstempel = \DateTimeOperations::getTimeStampForAbgleich();

    
    $knr = '';
    if (isset($this->request->columnValues['kursplanung']['kopiertVon'])) {
      $knr = $this->request->columnValues['kursplanung']['kopiertVon'];
      $kursPlanung->setValue2VarEx('kopiertVon', $knr, 'kursplanung');
    }

    $user = $this->getUser();
    if (isset($this->request->columnValues['kursplanung']['ma_planend_id'])) {
      $kursPlanung->setValue2VarEx('ma_planend_id', $this->request->columnValues['kursplanung']['ma_planend_id'], 'kursplanung');
    } elseif (\DBWorkBASysSettings::isInnsbruckStadt() && $user->ben > 0) { 
      $kursPlanung->setValue2VarEx('ma_planend_id', $user->ben, 'kursplanung');
    }

    
    if (isset($this->request->columnValues['kursplanung']['knr'])) {
      $kursPlanung->setValue2VarEx('knr', $this->request->columnValues['kursplanung']['knr'], 'kursplanung');
    }

    if (\DBWorkBASysSettings::isGarchingVhs()) {
      $dbwHlSemester = \DBWorkHLSemester::getDefaultInstance();
      $beginnDatum = $this->request->columnValues['kursplanung']['beginn_dat'];
      if (\DateTimeOperations::isValidDate($beginnDatum)) {
        $semester = $dbwHlSemester->getSemesterByDate($beginnDatum);
        if ($semester) {
          $kursPlanung->setValue2VarEx('semester', $semester->sem, 'kursplanung');
        }
      }
    }

    
    
    if (empty($kursPlanung->dozNr)) {
      $kursPlanung->dozNr = $this->getDnr4Planung($knr);
    }

    $kursPlanung->veranstalter_nr = $this->getVeranstalterNr();

    $kursPlanung->in_bearbeitung = $this->getInBearbeitung();

    return $kursPlanung;
  }

  
  protected function getVeranstalterNr()
  {
    return 0;
  }

  
  public function transformKursvorschlag(\Kursplanung $kursplanung): \Kursplanung
  {
    if ($this->isKursplanungVollstaendigUebermittelt()) {
      $kursplanung = \Kufer\Web\KuferTools\Utils\Kursplanung\KursplanungUtils::transformKursplanung($this, $kursplanung, $this->request->columnValues);
    }

    return $kursplanung;
  }

  
  private function processKursplanung($pKursplanung)
  {
    if (\DBWorkBASysSettings::isKirchheimTeckVhs()) {
      $this->toolSettings->sendKursplanungMailInsteadOfInfoMail = true;
    }

    $statusCodes = array();

    $checkPflichtfelder = $this->checkPflichtfelder();
    $wrongFields = $this->request->wssHandler->checkColumnValues($this->toolSettings, $this->request->columnValues, $checkPflichtfelder);
    if (count($wrongFields) > 0) {
      $this->response->wrongFields = $wrongFields;
      $this->response->changedKursplanung = $pKursplanung;
      $statusCodes[] = self::ERROR_KURSPLANUNGSDATEN_FEHLERHAFT;
    } else {
      $pKursplanung = $this->transformKursvorschlag($pKursplanung);
      try {
        $user = $this->getUser();
        
        if ($this->toolSettings->kursplanungMailAnEinrichtung
          || ($this->toolSettings->kursplanungMailPlanendenMA ?? false)
          || ($this->toolSettings->kursplanungMailVerwaltendenMA ?? false)
          || ($this->toolSettings->kursplanungMailVerantwortendenMA ?? false)) {
          $statusCodesKursplanungPerMail = EmailBenachrichtigung::sendKursplanungPerMail(
            $this->toToolSection(),
            $this->toolSettings,
            $this->getColumns($this->toolSettings),
            $pKursplanung,
            $user,
            $this->getEmailAddressForVhs()
          );
          $statusCodes = array_merge($statusCodes, $statusCodesKursplanungPerMail);
        } else {
          if (\SessionOperations::isDmzBetrieb()) {
            
            $api = new \KursplanungAPI();
            
            $pKursplanung->web_user_id = \SessionOperations::getUserId();
            $api->planKurs($pKursplanung);
          } else {
            $dbwork = new \DBWorkKursplanung();
            $pKursplanung->web_user_id = \SessionOperations::getUserId();
            $dbwork->insert($pKursplanung);
          }
          $statusCodes[] = $this->getStatusCodeSuccess();
        }

        if ($this->isKursplanungVollstaendigUebermittelt()) {
          $statusCodesBenachrichtigungen = EmailBenachrichtigung::sendKursvorschlagBenachrichtungen(
            $this->toToolSection(),
            $this->toolSettings,
            $this->getColumns($this->toolSettings),
            $pKursplanung,
            $user,
            $this->getEmailAddressForVhs()
          );
          $statusCodes = array_merge($statusCodes, $statusCodesBenachrichtigungen);
        }
      } catch (\Exception $e) {
        \Logger::logg('Kursplanung - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);
        $statusCodes[] = self::ERROR_KURSPLANUNG_NICHT_VERSENDET;
      }
    }

    return $statusCodes;
  }

  private function getEmailAddressForVhs()
  {
    return \EmailOperations::getToolEmailAddressForVhs($this->getEMail4Einrichtung());
  }

  public function isKursplanungVollstaendigUebermittelt(): bool
  {
    return true;
  }

  protected function getStatusCodeSuccess()
  {
    return self::SUCCESS_KURSPLANUNG_VERSENDET;
  }

  protected function checkPflichtfelder()
  {
    return true;
  }

  public function getInBearbeitung(): bool
  {
    return false;
  }

  public function sollLeiterHinzugefuegtWerden(): bool
  {
    return false;
  }

  public function sollDozentHinzugefuegtWerden(): bool
  {
    return false;
  }
}

class KursVorschlagAbsendenRequest
{
  public $columnValues;
  public $wssHandler;
  public $isRefresh;
  public $isXsrfOk;
}

class KursVorschlagAbsendenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $toolSection;
  public $toolSettings;
  public $user;
  public $columns;
  public $menuPunkte;
  public $kursplanung;
  public $statusCodes = array();
  public $showDatenandereKurseKopieren;
  public $readOnly;
  public $hideBackButton;
  public $wrongFields = array();
  public $changedKursplanung;
  public $showPflichtfeldCheckbox = false;
  public $textPflichtfeldCheckbox = '';
  public $datumsfelderAbhaengigePflichtfelder = false;
  public $uhrzeitfelderAbhaengigePflichtfelder = false;
  public $formularAnzeigenAction;
  public $formularAbsendenAction;
  public $showButtonKursvorschlagSpeichern;
}