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


class BucherSingletonFactory
{
  protected static $bucher = array();

  public static function resetBucher()
  {
    self::$bucher = array();
  }

  
  public static function &getInstanceForAS($pAS, $pZentraleEinstellungen)
  {

    $logger = Logger::getInstance();
    $logger->logg("Bucher für $pAS angefordert");

    if (!isset(self::$bucher[$pAS])) {
      $logger->logg("erzeuge neuen Bucher für Aussenstelle $pAS <br>");
      self::$bucher[$pAS] = self::getNewBucherForAS($pAS, $pZentraleEinstellungen);
    }

    return self::$bucher[$pAS];
  }

  private static function getTarget($pAS, $pDefaultTarget, $pUebermittlungsart)
  {
    $target = $pDefaultTarget;
    if ($pAS != '' && $pUebermittlungsart == ANMELDUNGPER_MAIL) {
      $logger = Logger::getInstance();
      $dbas = new DBWorkHLAussenstellen();
      $as = $dbas->getAussenstelleByBezeichner($pAS);
      if ($as->webanmeld == 2) {
        $logger->logg('mail zentral(' . $target . ')', 1);
      } elseif ($as->webanmeld == 3) {
        $target = $as->webanmeldemail;
        $logger->logg('mail an ' . $target, 1);
      }
    }

    return $target;
  }

  
  public static function getNewBucherForAS($pAS, $pZentraleEinstellungen)
  {
    $logger = Logger::getInstance();

    if ($pAS != '') {
      $dbas = new DBWorkHLAussenstellen();
      $as = $dbas->getAussenstelleByBezeichner($pAS);
      if ($as == null) {
        $logger->logg('Beim Kurs ist die Aussenstelle "' . $pAS . '" eingetragen, diese gibt es aber nicht'
        . 'in der Hinterlegung');
        $as = new Aussenstelle();
      }
    } else {
      $as = new Aussenstelle();
    }

    $uebermittlungsart = AussenstellenAPI::ermittleUebermittlungsart(
      $as,
      $pZentraleEinstellungen->uebermittlungsart,
      $pZentraleEinstellungen->verificationident
    );
    $target = self::getTarget($pAS, $pZentraleEinstellungen->target, $uebermittlungsart);

    return self::ermittleBucher($logger, $target, $uebermittlungsart, $pZentraleEinstellungen);
  }

  public static function ermittleBucher($pLogger, $pTarget, $pUebermittlungsart, \ZentraleEinstellungen $pZentraleEinstellungen)
  {
    
    switch ($pUebermittlungsart) {
      case ANMELDUNGPER_FILEVERIFICATION:
        $pLogger->logg('Resultat: Dateibuchung mit Verifikation (' . $pTarget . ')<br>');

        return new BucherDateiVerification($pZentraleEinstellungen);
      case ANMELDUNGPER_FILE:
        
        $pLogger->logg('Resultat: Dateibuchung(' . $pTarget . ')<br>');

        return new BucherDatei($pZentraleEinstellungen);
      case ANMELDUNGPER_ONLINE:
        
        
        
          
          

          $conInfo = DBConnectionInfo::getInstance();
          if (!$conInfo->db_replikat || (REPLIKATMITONLINEBUCHUNG && $conInfo->db_hybrid)) {
            if ($pZentraleEinstellungen->savebak) {
              $pLogger->logg('Resultat: bucheroffonline (wie immer db2), aber mit XML-BAK<br>');


              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherOffOnlineBeratungstageBak($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherOffOnlineGrillhuettenBak($pZentraleEinstellungen);
              }

              return new BucherOffOnlineBak($pZentraleEinstellungen);
            } else {
              $pLogger->logg('Resultat: bucheroffonline (wie immer db2)<br>');

              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherOffOnlineBeratungstage($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherOffOnlineGrillhuetten($pZentraleEinstellungen);
              }

              return new BucherOffOnline($pZentraleEinstellungen);
            }
          }
        
        
      case ANMELDUNGPER_DMZ:
        if (SessionOperations::isDmzBetrieb()) {
          
          if ($pZentraleEinstellungen->soforteinbuchen) {
            if ($pZentraleEinstellungen->savebak) {
              $pLogger->logg('Resultat: bucherdmz sofort einbuchen, aber mit XML-BAK<br>');

              
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherDMZBeratungstageBak($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherDMZGrillhuettenBak($pZentraleEinstellungen);
              }

              return new BucherDMZBakSofortEinbuchen($pZentraleEinstellungen);
            } else {
              $pLogger->logg('Resultat: bucherdmz sofort einbuchen<br>');

              
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherDMZBeratungstage($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherDMZGrillhuetten($pZentraleEinstellungen);
              }

              return new BucherDMZSofortEinbuchen($pZentraleEinstellungen);
            }
          } else {
            if ($pZentraleEinstellungen->savebak) {
              $pLogger->logg('Resultat: bucherdmz, aber mit XML-BAK<br>');

              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherDMZBeratungstageBak($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherDMZGrillhuettenBak($pZentraleEinstellungen);
              }

              return new BucherDMZBak($pZentraleEinstellungen);
            } else {
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_BERATUNGSTAGE) {
                return new BucherDMZBeratungstage($pZentraleEinstellungen);
              }
              if (RequestOperations::getVarValue('anmart', '') == ANMELDEART_URL_GRILLHUETTEN) {
                return new BucherDMZGrillhuetten($pZentraleEinstellungen);
              }

              return new BucherDMZ($pZentraleEinstellungen);
            }
          }
        }
        
      case ANMELDUNGPER_MAIL: 
      default:
        $pLogger->logg('Resultat: BucherEmail(' . $pTarget . ')<br>');

        return new BucherEmail($pZentraleEinstellungen, $pTarget);
    }
  }
}