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

namespace Kufer\KuferTools\Ausgaben\SammelSms;

use Kufer\KuferTools\Ausgaben\CommonTasks\SendPrepare as SendPrepare;

abstract class SendSammelSmsUseCase extends \Kufer\KuferTools\Mitarbeiter\KursUebersicht\EinzelKursUseCase
{
  const SMSVERSAND_SUCCESS = 0;
  const SMSVERSAND_FEHLER_BEIM_VERSENDEN = 1;
  
  protected $sendPreparer;
  protected $kontaktUser;
  protected static $toolId;
  protected static $toolSectionId;
  protected $rechteKey;

  public function __construct($request, $pToolId, $pToolSectionId, $pRechteKey)
  {
    
    
    static::$toolId = $pToolId;
    static::$toolSectionId = $pToolSectionId;
    parent::__construct($request, new SendSammelSmsResponse());
    $this->sendPreparer = new SendPrepare();
    $this->rechteKey = $pRechteKey;
  }

  
  abstract protected function getKontakte();

  abstract protected function getAttributeName4KontaktId();

  abstract protected function getMobilNummer($pKontakt);

  abstract protected function sendSmsAnKontakte($pKontaktIds, $pMobilNummern);

  
  abstract protected function sendSmsKopieAnUser($pUser);

  public static function getToolId()
  {
    return self::$toolId;
  }

  public static function getToolSectionId()
  {
    return self::$toolSectionId; 
  }

  protected function getRechteKey()
  {
    return $this->rechteKey; 
  }

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

    return true;
  }

  public function action()
  {
    $errorMessage = '';
    $this->kontaktUser = array();
    $kurs = $this->getKurs($this->request->knr);
    try {
      $versandtStatus = false;
      
      
      $this->kontaktUser = $this->getKontakte();
      
      if (!$this->request->isRefresh) {
        $errorMessage = $this->sendSms();
        $versandtStatus = true;
      }
    } 
    catch (\Exception $e) {
      $errorMessage = $e->getMessage();
      \Logger::logg(' Fehler beim Versenden der Sammel Sms. ' . $errorMessage, 41);
    }

    return $this->getResponse($kurs, $versandtStatus, $errorMessage);
  }

  
  private function sendSms()
  {
    $kontaktNummern = array();
    $selectierteMobilnummern = array();
    $errorMessage = '';
    $id = $this->getAttributeName4KontaktId();

    foreach ($this->kontaktUser as $kontakt) {
      $mobilnummer = $this->getMobilNummer($kontakt);
      if (trim($mobilnummer) != '') {
        $kontaktNummern[] = $kontakt->{$id};
        $selectierteMobilnummern[] = $kontakt->{$id} . '_' . $mobilnummer;
      }
    }

    try {
      $fehlerhaftVersendetAry = $this->sendSmsAnKontakte($kontaktNummern, $selectierteMobilnummern);


      
      foreach ($fehlerhaftVersendetAry as $fehlerhaftVersendet) {
        
        
        $fehlerhaftVersendetPerson[$fehlerhaftVersendet['errorperson']->id] = $fehlerhaftVersendet['errorperson'];
      }

      $smsStatus = array();
      foreach ($this->kontaktUser as $kontakt) {
        
        
        
        if (isset($fehlerhaftVersendetPerson[$kontakt->{$id}])) {
          
          $smsStatus[$kontakt->id] = self::SMSVERSAND_FEHLER_BEIM_VERSENDEN;
        } else {
          $smsStatus[$kontakt->id] = self::SMSVERSAND_SUCCESS;
        }
      }
    } catch (\Exception $e) {
      $errorMessage = $e->getMessage();
      
      \Logger::logg('Sammel-SMS: SMS konnte nicht versendet werden:' . $e, 300);

      $smsStatus = array();
      foreach ($this->kontaktUser as $kontakt) {
        $smsStatus[$kontakt->id] = self::SMSVERSAND_FEHLER_BEIM_VERSENDEN;
      }
    }

    
    try {
      $user = $this->getUser();
      $smsKopieStatus = array();
      $kopieAnUser = $this->doSendKopieAnUser(); 
      if ($kopieAnUser) {
        $smsKopieStatus = $this->sendSmsKopieAnUser($user);
      }
    } catch (\Exception $ex) {
      $errorMessage = $e->getMessage();
      
      \Logger::logg('Sammel-SMS: Kopie der SMS an den eingeloggten User konnte nicht versendet werden:' . $e, 300);
    }

    
    
    
    
    
    
    
    
    

    $this->response->sendSmsStatus = $smsStatus + $smsKopieStatus;

    return $errorMessage;
  }

  
  protected function doSendKopieAnUser()
  {
    switch (self::getToolId()) {
      case \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ:
        return isset($this->toolSettings->sendSms2Dozent) && !empty($this->toolSettings->sendSms2Dozent);
      case \ToolsAPI::TOOL_KURSPLANUNG_MA:
        
        if (self::getToolSectionId() == 242) { 
          $sendSms2Ma = 'sendSms2MaTabTn';
        } else { 
          $sendSms2Ma = 'sendSms2MaTabDoz';
        }

        return isset($this->toolSettings->{$sendSms2Ma}) && !empty($this->toolSettings->{$sendSms2Ma});
      case \ToolsAPI::TOOL_RAUMBELEGUNG_HM: 
        return false;
    } 

    return false;
  }

  protected function getResponse($pKurs, $versandtStatus, $pErrorMessage = '')
  {
    $this->handleResponseStrategies();
    $this->response->kurs = $pKurs;
    $this->response->errorMessage = $pErrorMessage;
    
    $this->response->kontakte = $this->kontaktUser;
    $this->response->noData = false;
    if (count($this->kontaktUser) == 0) {
      $this->response->noData = true;
    }
    $this->response->smsVersandt = $versandtStatus;
    $this->response->toolId = $this->getToolId();

    return $this->response;
  }

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

class SendSammelSmsRequest
{
  public $knr;
  
  
  public $smsBody;

  public $isRefresh;
  public $isXsrfOk;
}

class SendSammelSmsResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $kurs;
  
  public $kontakte;
  public $user;
  public $menuBar;
  public $sendSmsStatus;
  public $smsVersandt;
  public $noData = false;
  public $toolId;
}