<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf 
 */

abstract class Cache
{
  
  static $_cache = array();
  
  protected abstract static function getKey($datamodul);
  protected abstract static function getCacheName();
  
  public static function inCache($key)
  {
    $name = static::getCacheName();
    return isset(static::$_cache[$name]) && isset(static::$_cache[$name][$key]);
  }
  
  public static function getByKey($key)
  {
    if(static::inCache($key)) {
      return static::$_cache[static::getCacheName()][$key];
    } else {
      return null;
    }
  }
  
  public static function getByKeys($keyAry)
  {
    $result = array();
    foreach($keyAry as $key) {
      $datamodul = static::getByKey($key);
      if($datamodul != null) {
        $result[] = $datamodul;
      }
    }
    return $result;
  }
  
  /**
   * Speichert Datamodule im Cache ab. Wenn es mehrere Datamodule zu einem Key gibt,
   * so werden bisherige Werte im Cache überschrieben.
   * 
   * @param Datamodul $datamodul
   */
  public static function fillDatamodulInCache($datamodul)
  {
    // Vorsicht: wird derzeit per Referenz zurückgegeben und nicht per Clone oder unserialize/serialize.
    // Könnte beim Bearbeiten von Datensätzen probleme verursachen.
    $key = static::getKey($datamodul);
    static::$_cache[static::getCacheName()][$key] = $datamodul;
  }
  
  public static function fillDatamoduleInCache($datamodule)
  {
    foreach($datamodule as $datamodul) {
      static::fillDatamodulInCache($datamodul);
    }
  }
  
  public static function getKeysNotInCache($keyAry, $refreshCache = false)
  {
    if($refreshCache) {
      return $keyAry;
    }
    
    $result = array();
    foreach($keyAry as $key) {
      if(!static::inCache($key)) {
        $result[] = $key;
      }
    }
    return $result;
    //return array_filter($keyAry, function($key) {return !static::inCache($key);}); //macht in php5 Probleme
  }
}

class KurseCache extends Cache
{
  protected static function getKey($datamodul)
  {
    return $datamodul->id;
  }
  
  protected static function getCacheName()
  {
    return 'kurse';
  }
}

class TnStammbvCache extends Cache
{
  protected static function getKey($datamodul)
  {
    return $datamodul->nr;
  }
  
  protected static function getCacheName()
  {
    return 'tnstammbv';
  }
  
  /**
   * Speichert nur die erste StammBv eines Teilnehmers im Cache ab und ignoriert die weiteren.
   * Achtung: Damit die HauptstammBv gespeichert wird, müssen die StammBvs nach
   * der Spalte lfd aufsteigend sortiert sein. (kleinste lfd = HauptstammBv)
   * 
   * @param StammBv $datamodul
   */
  public static function fillDatamodulInCache($datamodul)
  {
    // Vorsicht: wird derzeit per Referenz zurückgegeben und nicht per Clone oder unserialize/serialize.
    // Könnte beim Bearbeiten von Datensätzen probleme verursachen.
    $cacheName = static::getCacheName();
    $key = static::getKey($datamodul);
    if (!isset(static::$_cache[$cacheName][$key])) {
      static::$_cache[$cacheName][$key] = $datamodul;
    }
  }
}

/*
class ArtikelCache extends Cache
{
  protected static function getKey($datamodul)
  {
    return $datamodul->id;
  }
  
  protected static function getCacheName()
  {
    return 'artikel';
  }
}
 */
