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


class AnmeldungDirektbetriebApi
{
  
  public function doAnmeldung($tnr, $knrs, $pEinbuchungsstatus = 'A', $pHauptteilnehmer = null)
  {
    $success = true;

    $anmeldeArt = $this->chooseAnmeldeart();
    $anmeldedatenArray = array();

    try {
      foreach ($knrs as $knr) {
        $argument = new AnmeldedatenSelectorArgument();
        
        $argument->setStatus($pEinbuchungsstatus);
        $argument->setHauptTeilnehmerNr($tnr);
        $argument->setKursnummer($knr);
        if (!is_null($pHauptteilnehmer)) {
          $argument->setHauptTeilnehmer($pHauptteilnehmer);
        }

        $anmeldedaten = $anmeldeArt->getAnmeldedatenSelector()->getAnmeldedaten($argument);
        $anmeldeArt->getAnmeldedatenValidator()->validateAnmeldedaten($anmeldedaten); 
        $anmeldeArt->getAnmeldedatenWriter()->writeAnmeldedaten($anmeldedaten);
        $anmeldedatenArray[] = $anmeldedaten; 
        $anmeldeArt->getAnmeldedatenSender()->sendAnmeldedaten($anmeldedaten);
      }
    } catch (Exception $ex) {
      Logger::logg('Anmeldung Direktbetrieb: ' . $ex->getMessage() . ' [' . $ex->getTraceAsString() . ']', 200);

      foreach ($anmeldedatenArray as $value) {
        $anmeldeArt->getAnmeldedatenWriter()->rollBackWriteAnmeldedaten($value);
      }

      $success = false;
    }

    return $success;
  }

  
  private function chooseAnmeldeart()
  {
    $anmeldeArtint = SessionOperations::getVarValueAnm(ANMELDEART);

    switch ($anmeldeArtint) {
      case ANMELDEART_INTERN_ELTERNKIND:
        if (System::isKuferSql5()) {
          $anmeldeart = new AnmeldeartElternKind(
            new AnmeldedatenSelectorElternKind50(),
            new AnmeldedatenValidatorNormal(),
            new AnmeldedatenSenderDummy(),
            new AnmeldedatenWriterElternKind50()
          );
        } else {
          $anmeldeart = new AnmeldeartElternKind(
            new AnmeldedatenSelectorElternKind(),
            new AnmeldedatenValidatorNormal(),
            new AnmeldedatenSenderDummy(),
            new AnmeldedatenWriterNormal()
          );
        }
        break;
      case ANMELDEART_INTERN_FIRMA:
        
        if (SessionOperations::isSofortEinbuchen() && false) { 
          $anmeldedatenSelector = new AnmeldedatenSelectorFirmaSofortEinbuchen();
          $anmeldedatenWriter = new AnmeldedatenWriterNormalSofortEinbuchen();
        } else {
          $anmeldedatenSelector = new AnmeldedatenSelectorFirma();
          $anmeldedatenWriter = new AnmeldedatenWriterNormal();
        }

        $anmeldeart = new AnmeldeartFirma(
          $anmeldedatenSelector,
          new AnmeldedatenValidatorNormal(),
          new AnmeldedatenSenderDummy(),
          $anmeldedatenWriter
        );
        break;
      case ANMELDEART_INTERN_PAAR:
        
        
        throw new Exception('Für die Paaranmeldung gibt es in den KuferTools keine Auswahlmöglichkeit');
      case ANMELDEART_INTERN_MEHRFACH:
        if (SessionOperations::isSofortEinbuchen() && false) { 
          $anmeldedatenSelector = new AnmeldedatenSelectorMehrfachSofortEinbuchen();
          $anmeldedatenWriter = new AnmeldedatenWriterNormalSofortEinbuchen();
        } else {
          $anmeldedatenSelector = new AnmeldedatenSelectorMehrfach();
          $anmeldedatenWriter = new AnmeldedatenWriterNormal();
        }
        $anmeldeart = new AnmeldeartMehrfach(
          new $anmeldedatenSelector(),
          new AnmeldedatenValidatorNormal(),
          new AnmeldedatenSenderDummy(),
          new $anmeldedatenWriter()
        );
        break;
      case ANMELDEART_INTERN_NORMAL:
      default:
        if (SessionOperations::isSofortEinbuchen() && false) { 
          $anmeldedatenSelector = new AnmeldedatenSelectorNormalSofortEinbuchen();
          $anmeldedatenWriter = new AnmeldedatenWriterNormalSofortEinbuchen();
        } else {
          $anmeldedatenSelector = new AnmeldedatenSelectorNormal();
          $anmeldedatenWriter = new AnmeldedatenWriterNormal();
        }
        $anmeldeart = new AnmeldeartNormal(
          $anmeldedatenSelector,
          new AnmeldedatenValidatorNormal(),
          new AnmeldedatenSenderDummy(),
          $anmeldedatenWriter
        );
        break;
    }

    return $anmeldeart;
  }
}