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

namespace Kufer\Web\KuferTools\Dozent\Kursplanung\KursBearbeitenPlanung;

use Kufer\KuferTools\Basis\BenachrichtigungNachBearbeiten\BenachrichtigungUtils;
use Kufer\KuferTools\Dozent\Kursplanung\KursBearbeiten;
use Kufer\Mail\EMail\EMailHTML;
use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Mail\Sender\Settings\Recipient\Einrichtung\EMailEinrichtungRecipientToolsKursSettings;
use Kufer\Web\KuferTools\Utils\Dozent\KursBearbeitenPlanungUtils;

class KursBearbeitenPlanungAbsendenUseCase extends KursBearbeiten\KursBearbeitenAbsendenUseCase
{
  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new KursBearbeitenPlanungAbsendenResponse());
  }

  protected function isKursBearbeitbar(\Kurs $kurs): bool
  {
    return KursBearbeitenPlanungUtils::isKursInPlanung($this->toolSettings->kursstatusKursInPlanung, $kurs);
  }

  public function action()
  {
    $result = parent::action();
    $result->toolSettings = $this->toolSettings;

    $result->kursAbgeben = $this->isKursAbgeben();

    $origKurs = $result->origKurs;
    $successStatus = array(static::SUCCESS_KURSDATEN_BEARBEITEN_ERFOLGREICH, static::INFO_KURSDATEN_NICHT_VERAENDERT);
    if ($result->kursAbgeben && in_array($result->statusCode, $successStatus, true)) {
      
      
      $changedKurs = $result->changedKurs;
      $changedKurs->abschluss = $this->toolSettings->kursstatusNachKursInPlanung;
      $changedFields = array('abschluss');

      try {
        $korrekturAPI = new \KurskorrekturAPI();
        
        $korrekturAPI->correctKurs($changedKurs, $changedFields);

        $dbwKurse = \DBWorkKurse::getDefaultInstance();
        $dbwKurse->updateKurs($changedKurs, \SessionOperations::isDmzBetrieb(), false);

        $result->kurs = $changedKurs;

        $result->statusCode = static::SUCCESS_KURSDATEN_BEARBEITEN_ERFOLGREICH;
        $this->sendeBenachrichtigungKursAbgeben($origKurs, $changedKurs, $changedFields, $this->getUser());
      } catch (\Exception $ex) {
        $result->statusCode = static::ERROR_KURSDATEN_BEARBEITEN_FEHLGESCHLAGEN;
      }
    } elseif ($result->statusCode === static::SUCCESS_KURSDATEN_BEARBEITEN_ERFOLGREICH) {
      
      parent::sendeBenachrichtigung($origKurs, $result->changedKurs, $result->changedFields, $this->getUser());
    }

    return $result;
  }

  protected function sendeBenachrichtigungKursAbgeben($origKurs, $changedKurs, $changedFields, $user): void
  {
    $columns = $this->getColumns();
    $changedFieldLabels = $this->request->wssHandler->getFieldsInReadableFormat($changedFields);
    BenachrichtigungUtils::setChangedFieldValuesToDatamodule(
      $columns,
      array($origKurs->id => $origKurs),
      array($changedKurs->id => $changedKurs),
      $changedFields,
      $changedFieldLabels
    );

    $emailViewModel = new EMail\KursBearbeitenPlanungKursAbgebenEmailViewModel();
    $emailViewModel->kurs = $changedKurs;
    $emailViewModel->changesCount = count($changedKurs->changedFieldValues);

    $email = new EMail\KursBearbeitenPlanungKursAbgebenEmailPresenter($emailViewModel);
    $email = new EMailHTML($email->getSubject(), $email->getContent());
    $email->addKuferToolsFooter('Kurs in Planung bearbeiten - Kurs Abgeben', $user, $changedKurs);

    $sender = EMailSenderFactory::create();
    $recipientSettings = new EMailEinrichtungRecipientToolsKursSettings($changedKurs);
    $recipientSettings
      ->setSettingMailToPlanendenMitarbeiter($this->toolSettings->kursplanungKursAbgebenMailAnPlanMa)
      ->setSettingMailToVerwaltendenMitarbeiter($this->toolSettings->kursplanungKursAbgebenMailAnVerwMa)
      ->setSettingMailToEinrichtung($this->toolSettings->kursplanungKursAbgebenMailAnEinrichtung ? true : null);

    $sender->sendFromDozentToEinrichtung($email, \SessionOperations::getCurrentWebToolsDozent(), $recipientSettings);
  }

  protected function sendeBenachrichtigung($pOrigKurs, $pChangedKurs, $pChangedFields, $pUser)
  {
    
  }

  public function isKursAbgeben(): bool
  {
    if ($this->toolSettings->kursstatusNachKursInPlanung === '') {
      return false;
    }

    return $this->request->kursAbgeben;
  }
}

class KursBearbeitenPlanungAbsendenRequest extends KursBearbeiten\KursBearbeitenAbsendenRequest
{
  public $kursAbgeben;
}

class KursBearbeitenPlanungAbsendenResponse extends KursBearbeiten\KursBearbeitenAbsendenResponse
{
  public $toolSettings;
  public $kursAbgeben;
}