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

namespace Kufer\Web\Classes\api;

class TerminAPI
{
  private function __construct()
  {
  }

  
  public static function insertTermin(\Termine $termin): void
  {
    $dbwTermine = \DBWorkTermine::getDefaultInstance();

    if (\SessionOperations::isDmzBetrieb()) {
      if (!empty($dbwTermine->insert($termin, true, true))) {
        try {
          static::insertDmz($termin);
        } catch (\Exception $ex) {
          
          $dbwTermine->delete($termin->id, true, true);

          throw $ex;
        }
      }
    } elseif (!\SessionOperations::isReplikat()) { 
      $dbwTermine->insert($termin, false);
    } else {
      throw new \InvalidArgumentException('Im Replikatsbetrieb ist kein Insert möglich');
    }
  }

  
  public static function updateTermin(\Termine $origTermine, array $changedFields, \Termine $changedTermine): void
  {
    $dbwTermine = \DBWorkTermine::getDefaultInstance();

    if (\SessionOperations::isDmzBetrieb()) {
      static::updateDmz($origTermine, $changedFields, $changedTermine);
      $dbwTermine->update($changedTermine, true);
    } elseif (!\SessionOperations::isReplikat()) { 
      $dbwTermine->update($changedTermine, false);
    } else {
      throw new \InvalidArgumentException('Im Replikatsbetrieb ist kein Update möglich');
    }
  }

  
  public static function deleteTermin(\Termine $termin): void
  {
    $dbwTermine = \DBWorkTermine::getDefaultInstance();

    if (\SessionOperations::isDmzBetrieb()) {
      static::deleteDmz($termin);
      $dbwTermine->delete($termin->id, true, true);
    } elseif (!\SessionOperations::isReplikat()) { 
      $dbwTermine->delete($termin->id, false);
    } else {
      throw new \InvalidArgumentException('Im Replikatsbetrieb ist kein Update möglich');
    }
  }

  
  private static function insertDmz(\Termine $termin)
  {
    return \AbgleichAPI::correctDatamodul(
      \DBWorkTermine::getDefaultInstance(),
      new \Tuple($termin, $termin->getAttributeNames()),
      'insert',
      'termin',
      'termine',
      'termine',
      \AbgleichAPI::ABGLEICH_INSERT_TERMIN,
      \AbgleichAPI::ABGLEICH_NOTHING,
      \AbgleichAPI::ABGLEICH_NOTHING
    );
  }

  
  private static function updateDmz(\Termine $origTermine, array $changedFields, \Termine $changedTermine)
  {
    return \AbgleichAPI::correctDatamodul(
      \DBWorkTermine::getDefaultInstance(),
      new \Tuple($changedTermine, $changedFields, $origTermine),
      'update',
      'termin',
      'termine',
      'termine',
      \AbgleichAPI::ABGLEICH_NOTHING,
      \AbgleichAPI::ABGLEICH_NOTHING,
      \AbgleichAPI::ABGLEICH_UPDATE_TERMIN
    );
  }

  
  private static function deleteDmz(\Termine $termin)
  {
    return \AbgleichAPI::correctDatamodul(
      \DBWorkTermine::getDefaultInstance(),
      new \Tuple($termin, $termin->getAttributeNames()),
      'delete',
      'termin',
      'termine',
      'termine',
      \AbgleichAPI::ABGLEICH_NOTHING,
      \AbgleichAPI::ABGLEICH_DELETE_TERMIN,
      \AbgleichAPI::ABGLEICH_NOTHING
    );
  }
}