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

namespace Kufer\Webbasys\Includee\API;


class StornoEMailAPI
{
  
  private function __construct()
  {
  }

  protected static function sendMail(\Kufer\Mail\Sender\IEMailSender $sender, \Teilnehmer $tn, \Kufer\Mail\EMail\IEMail $email, ?\BASysBenutzer $absender): \Kufer\Mail\Sender\Result\EMailSentResult
  {
    if (is_null($absender) || empty($absender->id)) {
      return $sender->sendFromEinrichtungToTeilnehmer($email, array($tn));
    } else {
      return $sender->sendFromMitarbeiterToTeilnehmer($email, $absender, array($tn));
    }
  }

  
  public static function sendEMailsToHauptteilnehmer(\DataMenuBasis $dataMenu, ?\Teilnehmer $stammhoerer, array $belegungen, int $emailSightId, ?\BASysBenutzer $absender = null): \Kufer\Mail\Sender\Result\EMailSentResult
  {
    assert(!empty($belegungen));

    $result = new \Kufer\Mail\Sender\Result\EMailSentResult(array());

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

    $belegungenByFirma = static::partitionByFirma($belegungen);
    if (array_key_exists(0, $belegungenByFirma)) {
      
      
      foreach ($belegungenByFirma[0] as $belegung) {
        $teilnehmer = $dbwTeilnehmer->getTeilnehm($belegung->tnr);

        $email = static::createEmailDmzOderEMailSuccess($dataMenu, $stammhoerer, $teilnehmer, array($belegung), $emailSightId);
        $result = $result->merge(
          static::sendMail($sender, $teilnehmer, $email, $absender)
        );
      }

      
      unset($belegungenByFirma[0]);
    }

    
    foreach ($belegungenByFirma as $firmenTnr => $firmenBelegungen) {
      $firma = $dbwTeilnehmer->getTeilnehm($firmenTnr); 

      $email = static::createEmailDmzOderEMailSuccess($dataMenu, $stammhoerer, $firma, $firmenBelegungen, $emailSightId);
      $result = $result->merge(
        static::sendMail($sender, $firma, $email, $absender)
      );
    }

    return $result;
  }

  
  protected static function createEmailDmzOderEMailSuccess(\DataMenuBasis $dataMenu, ?\Teilnehmer $stammhoerer, \Teilnehmer $tn, array $belegungen, int $sichtId): \Kufer\Mail\EMail\IEMail
  {
    
    $dbwTeilnehmer = \DBWorkTeilnehmer::getDefaultInstance();
    $belegungen = \array_map(static function($belegung) use ($dbwTeilnehmer) {
      $belegung = clone $belegung;
      $belegung->teilnehmer = $dbwTeilnehmer->getTeilnehm($belegung->tnr);

      return $belegung;
    }, $belegungen);

    
    $hauptteilnehmerBelegung = \ArrayOperations::find(static function(\Belegung $belegung) use ($tn): bool {
      $result = $belegung->tnr == $tn->id;
      
      if ($result) {
        $belegung->isHauptteilnehmerMitstorniert = true;

        return true;
      } else {
        return false;
      }
    }, $belegungen);

    
    
    
    
    
    if (is_null($hauptteilnehmerBelegung)) {
      
      $mainObj = new \Belegung();
      $mainObj->id = '';
      $mainObj->teilnehmer = $tn;
      $mainObj->kurs = \ArrayOperations::firstValue($belegungen)->kurs;
      $mainObj->anzahlBelegungenOhneHauptteilnehmer = count($belegungen);
      
      $mainObj->isHauptteilnehmerStammhoerer = is_null($stammhoerer) ? false : (\ArrayOperations::firstValue($belegungen)->firma == $stammhoerer->id);
    } else {
      
      $mainObj = $belegungen[$hauptteilnehmerBelegung];
      
      $mainObj->anzahlBelegungenOhneHauptteilnehmer = count($belegungen) - 1;
      $mainObj->isHauptteilnehmerStammhoerer = is_null($stammhoerer) ? false : ($mainObj->tnr == $stammhoerer->id);
    }

    $mainObj->anzahlBelegungen = count($belegungen);
    

    
    $expDefault = new \ExpBelegung(true);
    $dataMenu->dataarrayheader = $dataMenu->dataarraybody = $dataMenu->dataarraynodata = array($mainObj);
    $dataMenu->dataarrayfooter = $belegungen;

    $dataMenu->getsight($sichtId);

    $dataMenu->exportadapter = $expDefault;
    $dataMenu->exportadapter->export->initiate();
    $subject = $dataMenu->getheader(); 

    $dataMenu->exportadapter = $expDefault;
    $dataMenu->exportadapter->export->initiate();
    $body = $dataMenu->getbody();

    $dataMenu->exportadapter = new \ExpBelegung(true);
    $dataMenu->exportadapter->export->initiate();
    $body .= $dataMenu->getfooter(true);

    $dataMenu->exportadapter = $expDefault;
    $dataMenu->exportadapter->export->initiate();
    $body .= $dataMenu->getnodata();

    return new \Kufer\Mail\EMail\EMailHTML(\StringOperations::html_entity_decode(\trim($subject)), $body);
  }

  
  protected static function partitionByFirma(array $belegungen): array
  {
    $result = array();
    
    foreach ($belegungen as $belegung) {
      $firmenTnr = $belegung->firma == '' ? 0 : (int)$belegung->firma; 
      $result[$firmenTnr] = array_merge($result[$firmenTnr] ?? array(), array($belegung));
    }

    
    if (array_key_exists(0, $result)) {
      $result[0] = array_filter($result[0], static function(\Belegung $belegung) use (&$result): bool {
        $tnr = (int)$belegung->tnr;
        if (array_key_exists($tnr, $result)) {
          
          
          $result[$tnr][] = $belegung;

          return false;
        }

        return true;
      });
    }

    return $result;
  }
}