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

declare(strict_types = 1);

namespace Kufer\Web\Classes\CronJob\ReplikatUebertragung;

use Kufer\Mail\Sender\IEMailSender;
use Kufer\Web\Classes\CronJob\CronJobStorage;
use Kufer\Web\Classes\CronJob\ICronJob;

class ReplikatUebertragungCronJob extends \Kufer\Web\Classes\CronJob\CronJobCompositor
{
  
  private $nichtUebertragenAry = array();

  
  private $wirdWiederUebertragen = array();

  public function __construct(ICronJob ...$cronjobs)
  {
    if (\SessionOperations::isReplikat()) {
      parent::__construct(
        new ReplikatUebertragungDbGruppeCronJob(1, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen')),
        new ReplikatUebertragungDbGruppeCronJob(2, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen')),
        new ReplikatUebertragungDbGruppeCronJob(3, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen')),
        new ReplikatUebertragungDbGruppeCronJob(4, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen')),
        new ReplikatUebertragungDbGruppeCronJob(5, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen')),
        new ReplikatUebertragungDbGruppeCronJob(10, array($this, 'addNichtuebertragen'), array($this, 'addWiederUebertragen'))
      );
    } else {
      parent::__construct();
    }
  }

  public function addNichtuebertragen(int $replicatedDgAt, ?string $lastReplication): void
  {
    $this->nichtUebertragenAry[] = new Replikation($replicatedDgAt, $lastReplication);
  }

  public function addWiederUebertragen(int $replicatedDgAt, ?string $lastReplication): void
  {
    $this->wirdWiederUebertragen[] = new Replikation($replicatedDgAt, $lastReplication);
  }

  public function execute(CronJobStorage $storage): void
  {
    $toolSettings = \ToolSettingsAPI::getToolSettings(0);
    if ($toolSettings->cronjobReplikatCheckNichtAmWochenende) {
      $today = \DateTimeOperations::getDateNow();
      $day = \DateTimeOperations::getWeekDayFromDate($today);
      switch ($day) {
        case 1: 
          $time = \DateTimeOperations::getTimeNow();
          if (strcmp($time, '09:00') < 0) {
            return; 
          }
          break;
        case 5: 
          $time = \DateTimeOperations::getTimeNow();
          if (strcmp($time, '20:00') > 0) {
            return; 
          }
          break;
        case 6:
        case 7:
          return; 
      }
    }

    $this->nichtUebertragenAry = array();
    $this->wirdWiederUebertragen = array();

    
    parent::execute($storage);

    $sender = \Kufer\Mail\Sender\EMailSenderFactory::create();

    $this->sendWarnungNichtUebertrage($toolSettings, $sender);
    $this->sendeEntwarnung($toolSettings, $sender);
  }

  private function sendeEntwarnung(\ToolAdministrationSettings $toolSettings, IEMailSender $sender): void
  {
    $cntWiederUebertragenAry = count($this->wirdWiederUebertragen);
    if ($cntWiederUebertragenAry === 0) {
      return; 
    }

    $subject = 'Automatische E-Mail - Entwarnung - Automatische Übertragung funktioniert wieder';
    $emailText = '<p style="color: darkgreen">Die automatische Übertragung per BAS Replikat/KuferTransfer funktioniert wieder.</p>';
    $emailText .= '<p>Es kann jedoch sein, dass die Übertragung anderer Datengruppen nicht funktioniert</p>';
    if ($cntWiederUebertragenAry === 1) {
      $wiederUebertragen = $this->wirdWiederUebertragen[0];
      $emailText .= '<p>Die Datengruppe ' . $wiederUebertragen->replikatDGId . ' ';
      if (!is_null($wiederUebertragen->lastReplication)) {
        $emailText .= ' wurde zuletzt wieder am '
            . \CleanOperations::cleanStringForHtml($wiederUebertragen->lastReplication)
            . ' übertragen';
      } else {
        $emailText .= ' wurde übertragen.';
      }
      $emailText .= '</p>';
    } else {
      $emailText .= '<p>Die folgenden Datengruppen wurden wieder übertragen:</p>';
      $emailText .= '<ul>';
      foreach ($this->wirdWiederUebertragen as $wiederUebertragen) {
        $emailText .= '<li>Datengruppe ' . $wiederUebertragen->replikatDGId . ' ';
        if (!is_null($wiederUebertragen->lastReplication)) {
          $emailText .= ' (Zuletzt am ' . \CleanOperations::cleanStringForHtml($wiederUebertragen->lastReplication)
              . ')';
        }
        $emailText .= '</li>';
      }
      $emailText .= '</ul>';
    }

    $email = new \Kufer\Mail\EMail\EMailHTML($subject, $emailText);

    if ($toolSettings->cronEmailEMailRecipient !== '') {
      $sender->sendFromEinrichtung(
        $email,
        array(new \Kufer\Mail\Address\EMailAddress('', $toolSettings->cronEmailEMailRecipient)),
        'Fehler Cronjobs'
      );
    } else {
      $sender->informEinrichtung($email);
    }
  }

  private function sendWarnungNichtUebertrage(\ToolAdministrationSettings $toolSettings, IEMailSender $sender): void
  {
    $cntNichtUebertragenAry = count($this->nichtUebertragenAry);
    if ($cntNichtUebertragenAry === 0) {
      return; 
    }

    $subject = 'Automatische E-Mail - Automatische Übertragung funktioniert nicht';
    $emailText = '<p>Die automatische Übertragung per BAS Replikat/KuferTransfer funktioniert nicht.</p>';
    if ($cntNichtUebertragenAry === 1) {
      $nichtUebertragen = $this->nichtUebertragenAry[0];
      $emailText .= '<p>Die Datengruppe ' . $nichtUebertragen->replikatDGId . ' ';
      if (!is_null($nichtUebertragen->lastReplication)) {
        $emailText .= ' wurde zuletzt am ' . \CleanOperations::cleanStringForHtml($nichtUebertragen->lastReplication)
            . ' übertragen';
      } else {
        $emailText .= ' wurde nicht übertragen.';
      }
      $emailText .= '</p>';
    } else {
      $emailText .= '<p>Die folgenden Datengruppen wurden nicht übertragen:</p>';
      $emailText .= '<ul>';
      foreach ($this->nichtUebertragenAry as $nichtUebertragen) {
        $emailText .= '<li>Datengruppe ' . $nichtUebertragen->replikatDGId . ' ';
        if (!is_null($nichtUebertragen->lastReplication)) {
          $emailText .= ' (Zuletzt am ' . \CleanOperations::cleanStringForHtml($nichtUebertragen->lastReplication)
              . ')';
        }
        $emailText .= '</li>';
      }
      $emailText .= '</ul>';
    }

    $emailText .= '<p>Weitere Informationen finden Sie auf der Übersichtsseite im Webadmin.</p>';
    $emailText .= '<p style="color: red">Bitte überprüfen Sie Ihre BAS Replikat/KuferTransfer Installation.</p>';

    $email = new \Kufer\Mail\EMail\EMailHTML($subject, $emailText);

    if ($toolSettings->cronEmailEMailRecipient !== '') {
      $sender->sendFromEinrichtung(
        $email,
        array(new \Kufer\Mail\Address\EMailAddress('', $toolSettings->cronEmailEMailRecipient)),
        'Fehler Cronjobs'
      );
    } else {
      $sender->informEinrichtung($email);
    }
  }
}