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


class KontaktUserAPI
{
  
  public static function buildKontaktForm($pData, $pTool, $pPageTitle, $pPageId, $pKnr, $pUserBez)
  {
    $toolid = $pTool->getToolId();
    
    $user = $pTool->getUser();
    $kursTitel = (DBWorkBASysSettings::isKarlsruheVHS() ? $pData->kurzbez : $pData->getVarValue('titel_zeile1'));
    $title = 'Kurs ' . $pData->id . ': ' . $kursTitel . ' - ' . $user->vorname . ' ' . $user->name;

    $toolSettings = ToolSettingsAPI::getToolSettings($toolid);

    switch ($pUserBez) {
      case 'teilnehmer':
        $belegungstr = GetOperations::getVarValue('belids');
        $kontaktIds = explode(':', $belegungstr);
        if (!self::kontaktInfoIsEmpty($kontaktIds)) {
          $dbwTeilnehmer = new DBWorkTeilnehmer();
          $kontaktuser = $dbwTeilnehmer->getTeilnehmerByBelegAry($kontaktIds);
        } else {
          $kontaktuser = array();
        }

        break;
      case 'dozent':
        $kontaktIds = explode(':', GetOperations::getVarValue('dozids'));
        if (!self::kontaktInfoIsEmpty($kontaktIds)) {
          $dbwDoz = new DBWorkDozenten();
          $kontaktuser = $dbwDoz->getDozentenByIDArray($kontaktIds);
        } else {
          $kontaktuser = array();
        }
        break;
      default:
        throw new InvalidArgumentExceptionExtended('$pUserBez', $pUserBez, '', 2, null, DebugOperations::getBackTrace());
    } 
    $pageLinks = array();
    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();
    $xsrf = new Xsrf();
    $xsrfKey = $xsrf->generateKey4Action('wt_sammelmail', $pPageId . '_' . $pKnr . '_' . $pUserBez);
    $pageLinks['action'] = ToolsAPI::getUrlParamsForFile(array('toolsection_id' => $pPageId, 'nr' => $pKnr, 'sendInfo' => $pUserBez, 'xsrf' => $xsrfKey), $toolid);

    if (self::kontaktInfoIsEmpty($kontaktIds)) {
      $page = new PageKeinKontakt($pPageTitle, $pPageId, $pTool, $title);
    } else {
      $betreff = $kursTitel . ' (' . $pData->id . ') - ' . $user->vorname . ' ' . $user->name;
      if ($pUserBez == 'teilnehmer') {
        $showInfoBox = array();
        $showInfoBox['mail2Einrichtung'] = (isset($toolSettings->sendMail2Einrichtung) ? $toolSettings->sendMail2Einrichtung : false);
        $showInfoBox['mail2Dozent'] = (isset($toolSettings->sendMail2Dozent) ? $toolSettings->sendMail2Dozent : false);
        $showInfoBox['mail2Ma'] = (isset($toolSettings->sendMail2Ma) ? $toolSettings->sendMail2Ma : false);
        $page = new PageKontaktKursAnTeilnehmer($pPageTitle, $pPageId, $pTool, $title, $betreff, 'Ihre Nachricht:', $pData, $kontaktuser, $showInfoBox);
      } else {
        $pdfAsAttachment = false;
        if ($pTool->getToolId() === \ToolsAPI::TOOL_KURSPLANUNG_MA) {
          $pdfAsAttachment = true;
        }

        $page = new PageKontaktKursAnDozenten($pPageTitle, $pPageId, $pTool, $title, $betreff, 'Ihre Nachricht:', $pData, $kontaktuser, $pdfAsAttachment);
      }
    }
    $page->setLinks($pageLinks);

    return $page;
  }

  

  private static function kontaktInfoIsEmpty($pKontaktIds)
  {
    return count($pKontaktIds) == 0 || (count($pKontaktIds) == 1 && $pKontaktIds[0] === '');
  }

  
  public static function postKontaktForm($pData, $pTool, $pPageTitle, $pPageId, $pInformedUserBez)
  {
    $toolid = $pTool->getToolId();
    
    $sprachSettings = SettingsFactory::getSettings('SprachSettingsObject');
    
    $user = $pTool->getUser();
    

    $pageLinks = array();
    $pageLinks['back'] = ToolsAPI::getLastHistoryEntry();

    
    $title = '';
    if ($pInformedUserBez == 'teilnehmer') {
      
      $informedUserAry = PostOperations::getVarValue('teilnehmer', array());
      $sprachSetting4User = $sprachSettings->Teilnehmer;
    } elseif ($pInformedUserBez == 'dozent') {
      
      $informedUserAry = PostOperations::getVarValue('doz', array());
      $sprachSetting4User = $sprachSettings->Dozent;
    } else {
      throw new InvalidArgumentExceptionExtended('$pInformedUserBez', $pInformedUserBez, '', 2, null, DebugOperations::getBackTrace());
    }

    $userAnzahl = count($informedUserAry);
    if ($userAnzahl > 1) {
      $title .= 'Information an ' . $sprachSetting4User['Plural_mit_Artikel']['Nominativ'];
    } elseif ($userAnzahl == 1) {
      $title .= 'Information an ' . $sprachSetting4User['Singular_mit_Artikel']['Akkusativ'];
    }

    $ueberschrift = $title . ' - ' . $sprachSettings->Kurs['Singular']['Nominativ'] . ' ' . $pData->id . ': ' . $pData->getVarValue('titel_zeile1');

    
    if ($pTool->isRefreshed()) {
      $versandAry = array('versendet' => array(), 'nichtVersendet' => array());
      
      $page = new PageNachrichtErfolgreichGesendet($pPageTitle, $pPageId, $pTool, $ueberschrift, $versandAry['versendet'], $versandAry['nichtVersendet']);
      $page->setLinks($pageLinks);

      return $page;
    }

    
    
    $mailBodyLeer = false;
    $mailBodyLeerNachrichten = '';
    if (PostOperations::getVarValue('info') == '') {
      $mailBodyLeer = true;
      $mailBodyLeerNachrichten = '<div class="error">Sie haben keinen Inhalt für Ihre Nachricht angegeben.</div>' . "\n";
      $mailBodyLeerNachrichten .= 'Bitte füllen Sie das Nachrichtenfeld ("Ihre Nachricht")' . "\n";
    }

    $isXsrfOk = Xsrf::checkAndUseXsrfFromGet('wt_sammelmail', $pPageId . '_' . $pData->id . '_' . $pInformedUserBez) == Xsrf::KEY_OK;

    
    if ($pInformedUserBez == 'teilnehmer') {
      $files4Upload = UploadOperations::getAttachments('anhang');

      $uploadFehlerNachrichten = self::checkUploadStatus($files4Upload);

      $dbwTeilnehmer = new DBWorkTeilnehmer();

      if (trim($uploadFehlerNachrichten) != '' || !$isXsrfOk) {
        
        
        $fehlerNachrichten = ($mailBodyLeer) ? $mailBodyLeerNachrichten : $uploadFehlerNachrichten;
        if (!$isXsrfOk) {
          if (trim($fehlerNachrichten) != '') {
            $fehlerNachrichten .= '<br>';
          }
          $fehlerNachrichten .= 'Die E-Mail konnte aus technischen Gründen nicht versandt werden.';
        }
        $kontakt = array();
        foreach ($informedUserAry  as $value) {
          $teilnehmer = $dbwTeilnehmer->getTeilnehm($value);
          $kontakt[] = $teilnehmer;
        }
        
        $title = 'Kurs ' . $pData->id . ': ' . $pData->getVarValue('titel_zeile1') . ' - ' . $user->vorname . ' ' . $user->name;
        $betreff = $pData->getVarValue('titel_zeile1') . ' (' . $pData->id . ') - ' . $user->vorname . ' ' . $user->name;

        $page = new PageKontaktKursAnTeilnehmer(
          $pPageTitle,
          $pPageId,
          $pTool,
          $title,
          $betreff,
          'Ihre Nachricht:',
          $pData,
          $kontakt,
          array(),
          $fehlerNachrichten
        );

        $xsrf = new Xsrf();
        $knr = $pData->id;
        $xsrfKey = $xsrf->generateKey4Action('wt_sammelmail', $pPageId . '_' . $knr . '_' . $pInformedUserBez);
        $pageLinks['action'] = ToolsAPI::getUrlParamsForFile(array('toolsection_id' => $pPageId, 'nr' => $knr, 'sendInfo' => $pInformedUserBez, 'xsrf' => $xsrfKey), $toolid);
      } 

      
      else {
        if ($user->dnr >= 0) {
          $pageIdReiterTeilnehmer = 3;
        } elseif ($user->ben >= 0) {
          $pageIdReiterTeilnehmer = 242;
        } elseif ($user->anr >= 0) {
          $pageIdReiterTeilnehmer = 134;
        }
        
        $attachStrategy = new FileAttachmentStrategy($files4Upload);
        $versandAry = self::sendMail2User($pInformedUserBez, $user, $informedUserAry, $toolid, $pageIdReiterTeilnehmer, $attachStrategy, $pData);
        $page = new PageNachrichtErfolgreichGesendetPerson(
          $pPageTitle,
          $pPageId,
          $pTool,
          $ueberschrift,
          $versandAry['versendet'],
          $versandAry['nichtVersendet']
        );
      } 
      
      UploadOperations::delUploadedFiles($files4Upload);
    } 

    else { 
      if (!$isXsrfOk) {
        $dozenten = array();
        foreach ($informedUserAry as $dnr) {
          $dbwDoz = new DBWorkDozenten();
          $dozenten[] = $dbwDoz->getDozent($dnr);
        }

        $page = new PageNachrichtErfolgreichGesendetPerson($pPageTitle, $pPageId, $pTool, $ueberschrift, array(), $dozenten);
      } else {
        $attachStrategy = null;
        
        
        if (PostOperations::getVarValue('anhangTnList') === 'on') {
          
          $content = self::getContent4PDFList($pData->id, $toolid);
          $attachStrategy = new TextAttachmentStrategy($content);
        }

        $versandAry = array('versendet' => array(), 'nichtVersendet' => array());
        try {
          $versandAry = self::sendMail2User($pInformedUserBez, $user, $informedUserAry, $toolid, $pPageId, $attachStrategy, $pData);
        } catch (\Exception $e) {
          $errorMessage = $e->getMessage();
          \Logger::logg(' Fehler beim Versenden der Info and den Dozenten. ' . $errorMessage, 202);
        }
        $page = new PageNachrichtErfolgreichGesendetPerson(
          $pPageTitle,
          $pPageId,
          $pTool,
          $ueberschrift,
          $versandAry['versendet'],
          $versandAry['nichtVersendet']
        );
      }
    }
    $page->setLinks($pageLinks);

    return $page;
  }

  

  public static function checkUploadStatus($pFiles4Upload)
  {
    
    
    
    $uploadFehlerAufgetreten = false;
    $uploadFehlerNachrichten = '';
    $uploadFehlerCount = 0;
    foreach ($pFiles4Upload as $uploadfile) {
      if ($uploadfile->errorType !== UPLOAD_ERR_OK) {
        $uploadFehlerAufgetreten = true;
        $uploadFehlerNachrichten .= $uploadfile->errorMsg;
        $uploadFehlerCount++;
      }
    }
    
    
    if ($uploadFehlerAufgetreten) {
      $uploadFehlerNachrichten .= 'Bitte laden Sie Ihren Anhang nochmals hoch!';
    }

    return $uploadFehlerNachrichten;
  }

  
  public static function sendMail2User($pInformedUserBez, $pUser, $pInformedUserAry, $pToolid, $pPageId, $pAttachStrategy = null, $pData = null, $pEmailContent = array())
  {
    if (!is_array($pInformedUserAry) || empty($pInformedUserAry)) {
      return array();
    }

    $toolSettings = ToolSettingsAPI::getToolSettings($pToolid);
    $absender = self::_getAbsenderDatamodul($pUser, $pInformedUserBez);

    
    $userToInformAry = self::_getUserToInform($pInformedUserAry, $pInformedUserBez);


    
    if (isset($toolSettings->sendMail2Einrichtung) && $toolSettings->sendMail2Einrichtung) {
      $userToInformAry[] = self::_getEinrichtungToInform($pData, $pToolid, $pPageId);
    }

    $send2DozOrMa = (isset($toolSettings->sendMail2Dozent) && !empty($toolSettings->sendMail2Dozent))
                    || (isset($toolSettings->sendMail2Ma) && !empty($toolSettings->sendMail2Ma));

    
    if ($send2DozOrMa) {
      $userToInformAry[] = self::_getAbsenderToInform($absender);
    }

    
    return self::sendMails($userToInformAry, $absender, $pToolid, $pInformedUserBez, $pAttachStrategy, $pEmailContent);
  }

  

  
  private static function _getAbsenderDatamodul($pUser, $pInformedUserBez)
  {
    $dbwBasysUser = new DBWorkBASysUser();
    
    if ($pInformedUserBez == 'dozent') {
      if ($pUser->ben >= 0) {
        return $dbwBasysUser->getBASysUser($pUser->ben);
      }
      if ($pUser->tnr >= 0) {
        $dbwTeiln = new DBWorkTeilnehmer();

        return $dbwTeiln->getTeilnehm($pUser->tnr);
      }
      if ($pUser->dnr >= 0) {
        $dbwDoz = new DBWorkDozenten();

        return $dbwDoz->getDozent($pUser->dnr);
      }
    }
    
    else { 
      if ($pUser->ben >= 0) {
        return $dbwBasysUser->getBASysUser($pUser->ben);
      } elseif ($pUser->dnr >= 0) {
        $dbwDoz = new DBWorkDozenten();

        return $dbwDoz->getDozent($pUser->dnr);
      } elseif ($pUser->anr >= 0) {
        $dbwAdr = new DBWorkAdresse();

        return $dbwAdr->getAdresse($pUser->anr);
      }
    }

    throw new InvalidArgumentExceptionExtended('User', $pUser, '', 2, null, DebugOperations::getBackTrace());
  }

  
  private static function _getUserToInform($pPersonNrAry, $pPersonTyp)
  {
    $userToInformAry = array();
    foreach ($pPersonNrAry  as $personNr) {
      
      if ($pPersonTyp == 'dozent') {
        $dbwDoz = new DBWorkDozenten();
        $informedUser = $dbwDoz->getDozent($personNr);
      } else { 
        $dbwTeilnehmer = new DBWorkTeilnehmer();
        $informedUser = $dbwTeilnehmer->getTeilnehm($personNr);
      }
      $userToInformAry[] = array('user' => $informedUser, 'email' => $informedUser->getVarValueEx('email', 'kommunikation'));
    }

    return $userToInformAry;
  }

  
  private static function _getEinrichtungToInform($pData, $pToolId, $pPageId)
  {
    
    $dbwBasysUser = new DBWorkBASysUser();
    $einrichtung = $dbwBasysUser->getNewObject();
    
    $allgSettings = AllgSettingsAPI::getAllgSettings();
    $einrichtung->namevorname = $allgSettings->vhsname;
    $mailAddress4VHSAry = ToolsAPI::getEmailAdressForKursMA($pData, $pToolId, $pPageId, null);
    $mailAddress4VHS = \ArrayOperations::firstValue($mailAddress4VHSAry);
    $einrichtung->setValue2Var('email_anzeige', $mailAddress4VHS);

    return array('user' => $einrichtung, 'email' => $mailAddress4VHS);
  }

  
  private static function _getAbsenderToInform($pAbsender)
  {
    return array('user' => $pAbsender, 'email' => $pAbsender->getVarValueEx('email', 'kommunikation'));
  }

  
  protected static function setMailHeaderContent($pEmail, $pAbsender, $pToMailAdr, $pToolid, $pInformedUserBez, $pEmailContent = array())
  {
    
    
    $betreff = (isset($pEmailContent['betreff'])) ? $pEmailContent['betreff'] : PostOperations::getVarValue('betreff');
    $body = (isset($pEmailContent['body'])) ? $pEmailContent['body'] : PostOperations::getVarValue('info');
    
    $empfaenger = 'Andere';
    
    
    if ($pToolid == \ToolsAPI::TOOL_KURSPLANUNG_MA) {
      
      $empfaenger = ucfirst($pInformedUserBez);
    }
    $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($pAbsender, $empfaenger);

    $pEmail->SetVar2Value('from', $senderEmailData['email']);
    $pEmail->SetVar2Value('sendername', $senderEmailData['name']);
    $pEmail->SetVar2Value('reply', $senderEmailData['reply']);
    $pEmail->SetVar2Value('replyname', $senderEmailData['replyname']);
    $pEmail->SetVar2Value('to', $pToMailAdr);
    $pEmail->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
    $pEmail->SetVar2Value('doNotSplitHTMLBody', true);
    $pEmail->subject = $betreff;
    $pEmail->body = $body;
    
    
    
  }

  

  
  public static function getContent4PDFList($pDataId, $pToolId)
  {
    $settings = ToolSettingsAPI::getToolSettings($pToolId);
    if (isset($settings->pdf_liste_an_doz)) {
      if ($settings->pdf_liste_an_doz == 'antwortboxen') {
        $pdfList = new ListeMitAntwortboxenUndEmail($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'einzeilig') {
        $pdfList = new Teilnehmerliste($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'anwesenheitsliste') {
        $pdfList = new Anwesenheitsliste($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'telefonFaxEMail') {
        $pdfList = new TelefonFaxEmailliste($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'kindern') {
        $pdfList = new AnwesenheitslisteK($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'weitermeldeliste') {
        $pdfList = new Weitermeldeliste($pDataId, $pToolId);
      } elseif ($settings->pdf_liste_an_doz == 'AnwesenheitslisteMitAntwortboxNRW') {
        $pdfList = new AnwesenheitslisteMitAntwortboxNRW($pDataId, $pToolId);
      }
    } else {
      $pdfList = new Teilnehmerliste($pDataId, $pToolId);
    }
    $pdfList->loadSettings();
    
    return $pdfList->create(true);
  }

  
  public static function sendMails($pEmpfaengerAry, $pAbsender, $pToolid, $pInformedUserBez, $pAttachStrategy = null, $pEmailContent = array())
  {
    $versendet = array();
    $nichtVersendet = array();

    foreach ($pEmpfaengerAry as $empfaenger) {
      $email = new smtpMailTools();
      
      self::setMailHeaderContent($email, $pAbsender, $empfaenger['email'], $pToolid, $pInformedUserBez, $pEmailContent);
      
      
      if ($pAttachStrategy != null) {
        $pAttachStrategy->execute($email);
      }

      if ($email->sendMail()) {
        $versendet[] = $empfaenger['user'];
      } else {
        $nichtVersendet[] = $empfaenger['user'];
      }
    }

    return array('versendet' => $versendet, 'nichtVersendet' => $nichtVersendet);
  }
}



interface IAttachmentStrategy
{
  
  public function execute($pEmail);
}  



class FileAttachmentStrategy implements IAttachmentStrategy
{
  
  private $_fileAttachs;

  public function __construct($pFileAttachs)
  {
    $this->_fileAttachs = $pFileAttachs;
  }

  
  public function execute($pEmail)
  {
    if (count($this->_fileAttachs) > 0) {
      $pEmail->setAttachType('file');
      
      foreach ($this->_fileAttachs as $uploadfile) {
        $pEmail->addAttachment($uploadfile->name);
      }
    }
  }
}



class TextAttachmentStrategy implements IAttachmentStrategy
{
  
  private $_content;

  public function __construct($pContent)
  {
    $this->_content = $pContent;
  }

  
  public function execute($pEmail)
  {
    
    if ($this->_content != '') {
      $pEmail->setAttachType('pdf');
      $pEmail->addAttachment($this->_content);
    }
  }
}