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




abstract class FarbeAPI
{
  
  abstract public static function getStatus($pObj);

  
  abstract protected static function getStatusAry();

  
  abstract protected static function getSettingsName();

  
  abstract protected static function getDescriptionForStatus($pStatus);

  
  protected static function getSetting($pRefreshCache = false)
  {
    $settingName = static::getSettingsName();
    static $settingCache = array();
    if ($pRefreshCache || !isset($settingCache[$settingName])) {
      $tool0Settings = ToolSettingsAPI::getToolSettings(0);
      $settingCache[$settingName] = SerializeOperations::unserialize($tool0Settings->{$settingName});
    }

    return $settingCache[$settingName];
  }

  
  protected static function getMandatoryStatus()
  {
    return array();
  }

  
  public static function getColor($pStatus)
  {
    $stat_kurs_farbe = static::getSetting();

    if (isset($stat_kurs_farbe[$pStatus], $stat_kurs_farbe[$pStatus]['color'])) {
      return '#' . $stat_kurs_farbe[$pStatus]['color'];
    }

    return '#FFFFFF';
  }

  
  protected static function getDescriptionForStatusFromSettings($pStatus)
  {
    $statSetting = static::getSetting();
    if (isset($statSetting[$pStatus]['description'])) {
      return $statSetting[$pStatus]['description'];
    }

    return '';
  }

  
  public static function getSetting4ZentraleEinstellungen($pName, $pShowInfoBox = false)
  {
    
    
    
    $statusAry = static::getStatusAry();
    $stat_kurs_farbe = static::getSetting();
    $mandatoryStatusAry = static::getMandatoryStatus();

    $result = '<div class="settings_status_div text_main_menu">';
    $result .= '<div class="settings_status_head">
                 <span class="head_status">Status</span>
                 <span class="head_aktiv">aktiv?</span>
                 <span class="head_bezeichnung">Ihre Bezeichnung</span>
                 <span class="head_farbe">Farbe</span>
               </div>';
    $result .= '<ul class="setting_status_farbe">';
    $i = 0;
    $name4Html = CleanOperations::cleanStringForHtml($pName);

    foreach ($statusAry as $status) {
      $checked = '';
      $color = 'FFFFFF';
      $disabled = '';

      if (in_array($status, $mandatoryStatusAry)) {
        $checked = 'checked="checked"';
        $disabled = 'disabled="disabled"';
      }

      if (isset($stat_kurs_farbe[$status], $stat_kurs_farbe[$status]['color'])) {
        $checked = 'checked="checked"';
        $color = CleanOperations::cleanStringForHtml($stat_kurs_farbe[$status]['color']);
      }

      $statusName = CleanOperations::cleanStringForHtml(static::getDescriptionForStatus($status));
      $statusNameFromSetting = CleanOperations::cleanStringForHtml(static::getDescriptionForStatusFromSettings($status));

      if (trim($statusNameFromSetting) == '') {
        $statusNameFromSetting = $statusName;
      }

      $status4Html = CleanOperations::cleanStringForHtml($status);

      $even = ($i % 2 == 0) ? 'class="even"' : '';
      $i++;
      $result .= '<li ' . $even . '>';
      $result .= '<label for="setting_status_' . $name4Html . '_' . $status4Html . '" class="setting_status_text">' . $statusName . '</label>';
      $result .= '<input id="setting_status_' . $name4Html . '_' . $status4Html . '" type="checkbox"  class="setting_status_checkbox" value="' . $status4Html . '" name="' . $name4Html . '[]" ' . $checked . ' ' . $disabled . '>';
      $result .= '<input type="text" class="setting_description_input" name="setting_description_' . $status4Html . '_' . $name4Html . '" value="' . $statusNameFromSetting . '" >';
      $result .= '<span class="setting_setColor" style="background-color:#' . $color . ';"><input type="hidden" name="setting_color_' . $status4Html . '_' . $name4Html . '" class="hidden_color" value="' . $color . '"></span>';
      $result .= '</li>';
    }
    $result .= '</ul>';

    if ($pShowInfoBox) {
      $infoBoxBody = array('<span class="farbInfoZeile"><span class="setting_info">aktiv?:</span>Entscheiden Sie, ob der Status berücksichtigt wird</span>',
                            '<span class="farbInfoZeile"><span class="setting_info">Bezeichnung:</span>Stellen Sie hier die Beschreibung für die Legende ein</span>',
                            '<span class="farbInfoZeile"><span class="setting_info">Farbe:</span>Klicken Sie in das Feld, um die Farbe zu ändern</span>');

      $result .= HTMLOperations::getInfoBox($infoBoxBody, 'Farben einstellen');
    }
    
    $result .= '</div>';

    return $result;
  }

  
  public static function getLegend($title = 'Status Legende')
  {
    $body = self::getLegendBody();

    return '<div class="status_legende">' . HTMLOperations::getInfoBox($body, CleanOperations::cleanStringForHtml($title)) . '</div>';
  }

  public static function getLegendBody()
  {
    $statusAry = static::getStatusAry();
    $colorAry = static::getSetting();

    if (empty($colorAry)) {
      return '';
    }

    $result = '<ul class="status_legende_list">';

    foreach ($statusAry as $status) {
      $color = 'FFFFFF';

      if (isset($colorAry[$status], $colorAry[$status]['color'])) {
        $color = $colorAry[$status]['color'];
      } else {
        continue;
      }

      $statusNameFromSetting = static::getDescriptionForStatusFromSettings($status);
      if (trim($statusNameFromSetting) == '') {
        $statusNameFromSetting = static::getDescriptionForStatus($status);
      }

      $result .= '<li class="status_legende_' . CleanOperations::cleanStringForHtml($status) . '">';
      $result .= '<span class="status_legende_colorSpan" style="background-color:#' . CleanOperations::cleanStringForHtml($color) . ';"></span>';
      $result .= '<span">' . CleanOperations::cleanStringForHtml($statusNameFromSetting) . '</span>';
      $result .= '</li>';
    }
    $result .= '</ul>';

    return $result;
  }

  
  public static function getSetting4Obj($pName)
  {
    $statusAry = PostOperations::getVarValue($pName, array());
    $mandatoryStatusAry = static::getMandatoryStatus();
    $statusAry = array_merge($statusAry, $mandatoryStatusAry);
    $settingsAry = array();
    foreach ($statusAry as $status) {
      $color = PostOperations::getVarValue('setting_color_' . $status . '_' . $pName, 'FFFFFF');
      $description = PostOperations::getVarValue('setting_description_' . $status . '_' . $pName, '');
      $settingsAry[$status]['color'] = $color;
      $settingsAry[$status]['description'] = $description;
    }

    return SerializeOperations::serialize4Settings($settingsAry);
  }
}

class KursFarbeAPI extends FarbeAPI
{
  const STAT_NORMAL = 'normal';
  const STAT_AUSFALL = 'ausfall';
  const STAT_ABSCHLUSS = 'abschluss';
  const STAT_KURS_IN_ZUKUNFT = 'in_zukunft';
  const STAT_KURS_LAEUFT = 'laeuft';
  const STAT_KURS_VORBEI = 'vorbei';

  
  protected static function getSettingsName()
  {
    return 'kurs_status_farben';
  }

  
  protected static function getStatusAry()
  {
    static $statusAry = array(self::STAT_AUSFALL, self::STAT_ABSCHLUSS, self::STAT_KURS_IN_ZUKUNFT,
                                 self::STAT_KURS_LAEUFT, self::STAT_KURS_VORBEI, self::STAT_NORMAL);

    $user = SessionOperations::getCurrentWebToolsUser();
    if (!SessionOperations::isAdmin() && $user->dnr < 0 && $user->ben < 0) {
      return array_diff($statusAry, array(self::STAT_ABSCHLUSS));
    }

    return $statusAry;
  }

  
  protected static function getDescriptionForStatus($pStatus)
  {
    $sprachsettings = new SprachSettingsObject();
    $kursTxt = $sprachsettings->Kurs['Singular']['Nominativ'];
    switch ($pStatus) {
      default:
      case self::STAT_NORMAL:          return 'Normal';
      case self::STAT_AUSFALL:         return $kursTxt . ' ist ausgefallen';
      case self::STAT_ABSCHLUSS:       return $kursTxt . ' abgeschlossen';
      case self::STAT_KURS_IN_ZUKUNFT: return $kursTxt . ' hat noch nicht begonnen';
      case self::STAT_KURS_LAEUFT:     return $kursTxt . ' läuft derzeit';
      case self::STAT_KURS_VORBEI:     return $kursTxt . ' ist beendet';
    }
  }

  
  public static function getStatus($pKurs)
  {
    $stat_kurs_farbe = self::getSetting();
    $user = SessionOperations::getCurrentWebToolsUser();

    if (isset($stat_kurs_farbe[self::STAT_AUSFALL]) && ($pKurs->getVarValueEx('ausfall', 'kurs') == 'J' || $pKurs->getVarValueEx('ausfall', 'kurs') == 'j')) {
      return self::STAT_AUSFALL;
    } elseif (isset($stat_kurs_farbe[self::STAT_ABSCHLUSS]) && ($pKurs->getVarValueEx('abschluss', 'kurs') == 'J' || $pKurs->getVarValueEx('ausfall', 'kurs') == 'j')
               && ($user->ben >= 0 || $user->dnr >= 0)) {
      return self::STAT_ABSCHLUSS;
    } else {
      $dateObjNow = new DateObj(DateTimeOperations::getDateNow());
      $dateVon = $pKurs->getVarValueEx('beginn_dat', 'kurs');
      $dateBis = $pKurs->getVarValueEx('ende_dat', 'kurs');
      if (DateTimeOperations::isValidDate($dateVon) && DateTimeOperations::isValidDate($dateBis)) {
        $dateObjKursVon = new DateObj($dateVon);
        $dateObjKursBis = new DateObj($dateBis);
        if (isset($stat_kurs_farbe[self::STAT_KURS_IN_ZUKUNFT]) && $dateObjNow->compare($dateObjKursVon) < 0) {
          return self::STAT_KURS_IN_ZUKUNFT;
        } elseif (isset($stat_kurs_farbe[self::STAT_KURS_VORBEI]) && $dateObjNow->compare($dateObjKursBis) > 0) {
          return self::STAT_KURS_VORBEI;
        } elseif (isset($stat_kurs_farbe[self::STAT_KURS_LAEUFT])
                        && ($dateObjNow->compare($dateObjKursVon) >= 0 || $dateObjNow->compare($dateObjKursBis) <= 0)) {
          return self::STAT_KURS_LAEUFT;
        }
      }
    }

    return self::STAT_NORMAL;
  }
}

class KurstagFarbeAPI extends FarbeAPI
{
  const STAT_AUSFALL = 'A';
  const STAT_AUSFALL_NORMAL_GEZAEHLT = 'X';
  const STAT_VORBESPRECHUNG = 'V';
  const STAT_NACHBESPRECHUNG = 'N';
  const STAT_ELTERNABEND = 'E';
  const STAT_INFORMATIONSABEND = 'I';
  const STAT_PRUEFUNG = 'P';
  const STAT_EXKURSION = 'K';
  const STAT_NICHT_DEPUTAT = 'D';
  const STAT_ZUSATZ = 'Z';
  const STAT_IN_ZUKUNFT = 'in_zukunft';
  const STAT_HEUTE = 'laeuft';
  const STAT_VORBEI = 'vorbei';
  const STAT_NORMAL = 'normal';

  
  protected static function getSettingsName()
  {
    return 'kurstag_status_farben';
  }

  
  protected static function getStatusAry()
  {
    static $statusAry = array(self::STAT_AUSFALL, self::STAT_AUSFALL_NORMAL_GEZAEHLT, self::STAT_VORBESPRECHUNG, self::STAT_NACHBESPRECHUNG,
                               self::STAT_ELTERNABEND, self::STAT_INFORMATIONSABEND, self::STAT_PRUEFUNG, self::STAT_EXKURSION, self::STAT_NICHT_DEPUTAT,
                               self::STAT_ZUSATZ, self::STAT_IN_ZUKUNFT, self::STAT_HEUTE, self::STAT_VORBEI, self::STAT_NORMAL);

    $user = SessionOperations::getCurrentWebToolsUser();
    if (!SessionOperations::isAdmin() && $user->dnr < 0 && $user->ben < 0) {
      return array_diff($statusAry, array(self::STAT_AUSFALL_NORMAL_GEZAEHLT, self::STAT_NICHT_DEPUTAT));
    }

    return $statusAry;
  }

  
  protected static function getDescriptionForStatus($pStatus)
  {
    $sprachsettings = new SprachSettingsObject();
    $user = SessionOperations::getCurrentWebToolsUser();
    if (!SessionOperations::isAdmin() && $user->dnr < 0 && $user->ben < 0 && $user->anr < 0) {
      $kurstag = $sprachsettings->Kurstermine['Singular']['Nominativ'];
    } else {
      $kurstag = $sprachsettings->Kurstag['Singular']['Nominativ'];
    }

    switch ($pStatus) {
      case self::STAT_AUSFALL:                 return $kurstag . ' ausgefallen';
      case self::STAT_AUSFALL_NORMAL_GEZAEHLT: return $kurstag . ' ausgefallen, zählt jedoch wie durchgeführt';
      case self::STAT_VORBESPRECHUNG:          return 'Vorbesprechung';
      case self::STAT_NACHBESPRECHUNG:         return 'Nachbesprechung';
      case self::STAT_ELTERNABEND:             return 'Elternabend';
      case self::STAT_INFORMATIONSABEND:       return 'Informationsabend';
      case self::STAT_PRUEFUNG:                return 'Prüfung';
      case self::STAT_EXKURSION:               return 'Exkursion';
      case self::STAT_NICHT_DEPUTAT:           return 'nicht für Deputatsberechnung';
      case self::STAT_ZUSATZ:                  return 'Zusatztag';
      case self::STAT_IN_ZUKUNFT:              return 'zukünftiger ' . $kurstag;
      case self::STAT_HEUTE:                   return $kurstag . ' findet heute statt';
      case self::STAT_VORBEI:                  return $kurstag . ' ist vorbei';
      default:
      case self::STAT_NORMAL:                  return 'Normal';
    }
  }

  
  public static function getStatus($pKurstag)
  {
    $stat_kurs_farbe = self::getSetting();

    $ausfall = $pKurstag->getVarValue('ausfall');
    if (isset($stat_kurs_farbe[self::STAT_AUSFALL_NORMAL_GEZAEHLT]) && ($ausfall == 'X' || $ausfall == 'x')) {
      return self::STAT_AUSFALL_NORMAL_GEZAEHLT;
    } elseif (isset($stat_kurs_farbe[self::STAT_AUSFALL]) && ($ausfall == 'A' || $ausfall == 'a')) {
      return self::STAT_AUSFALL;
    } elseif (isset($stat_kurs_farbe[self::STAT_VORBESPRECHUNG]) && ($ausfall == 'V' || $ausfall == 'v')) {
      return self::STAT_VORBESPRECHUNG;
    } elseif (isset($stat_kurs_farbe[self::STAT_NACHBESPRECHUNG]) && ($ausfall == 'N' || $ausfall == 'n')) {
      return self::STAT_NACHBESPRECHUNG;
    } elseif (isset($stat_kurs_farbe[self::STAT_ELTERNABEND]) && ($ausfall == 'E' || $ausfall == 'e')) {
      return self::STAT_ELTERNABEND;
    } elseif (isset($stat_kurs_farbe[self::STAT_INFORMATIONSABEND]) && ($ausfall == 'I' || $ausfall == 'i')) {
      return self::STAT_INFORMATIONSABEND;
    } elseif (isset($stat_kurs_farbe[self::STAT_PRUEFUNG]) && ($ausfall == 'P' || $ausfall == 'p')) {
      return self::STAT_PRUEFUNG;
    } elseif (isset($stat_kurs_farbe[self::STAT_EXKURSION]) && ($ausfall == 'K' || $ausfall == 'k')) {
      return self::STAT_EXKURSION;
    } elseif (isset($stat_kurs_farbe[self::STAT_NICHT_DEPUTAT]) && ($ausfall == 'D' || $ausfall == 'd')) {
      return self::STAT_NICHT_DEPUTAT;
    } elseif (isset($stat_kurs_farbe[self::STAT_ZUSATZ]) && ($ausfall == 'Z' || $ausfall == 'z')) {
      return self::STAT_ZUSATZ;
    } else {
      $dateObjNow = new DateObj(DateTimeOperations::getDateNow());
      $date = $pKurstag->getVarValue('datum');

      if (DateTimeOperations::isValidDate($date)) {
        $dateObjKt = new DateObj($date);

        $compare = $dateObjNow->compare($dateObjKt);
        if (isset($stat_kurs_farbe[self::STAT_HEUTE]) && $compare === 0) {
          return self::STAT_HEUTE;
        } elseif (isset($stat_kurs_farbe[self::STAT_IN_ZUKUNFT]) && $compare < 0) {
          return self::STAT_IN_ZUKUNFT;
        } elseif (isset($stat_kurs_farbe[self::STAT_IN_ZUKUNFT]) && $compare > 0) {
          return self::STAT_VORBEI;
        }
      }
    }

    return self::STAT_NORMAL;
  }
}

class BelegungFarbeAPI extends FarbeAPI
{
  const STAT_ANGEMELDET = 'A';
  const STAT_TEILGENOMMEN = 'T';
  const STAT_PLATZRESERVIERUNG = 'P';
  const STAT_WARTELISTE = 'W';
  const STAT_STORNO = 'S';
  const STAT_INTERESSE = 'I';
  const STAT_UMMELDUNG = 'U';
  const STAT_VORMERKUNG = 'V';
  const STAT_STORNO_MIT_ZAHLUNG = 'Z';
  const STAT_FIRMA = 'F';

  
  protected static function getSettingsName()
  {
    return 'belegung_status_farben';
  }

  
  protected static function getStatusAry()
  {
    static $statusAry = array(self::STAT_ANGEMELDET, self::STAT_TEILGENOMMEN, self::STAT_PLATZRESERVIERUNG, self::STAT_WARTELISTE,
                               self::STAT_STORNO, self::STAT_STORNO_MIT_ZAHLUNG, self::STAT_UMMELDUNG, self::STAT_FIRMA, self::STAT_INTERESSE,
                               self::STAT_VORMERKUNG);

    
    $dbStatus = self::_getStatusFromDB();
    foreach ($dbStatus as $stat) {
      if (!in_array(StringOperations::strtoupper($stat->kennz), $statusAry) && trim($stat->kennz) != '') {
        $statusAry[] = StringOperations::strtoupper($stat->kennz);
      }
    }

    return $statusAry;
  }

  
  private static function _getStatusFromDB()
  {
    static $status = null;
    if (is_null($status)) {
      $dbwStatus = new DBWorkHLStatusKZ(1, true);
      $status = $dbwStatus->getAll();
    }

    return $status;
  }

  
  protected static function getDescriptionForStatus($pStatus)
  {
    switch ($pStatus) {
      case self::STAT_ANGEMELDET:         return 'Angemeldet';
      case self::STAT_TEILGENOMMEN:       return 'Teilgenommen';
      case self::STAT_PLATZRESERVIERUNG:  return 'Platzreservierung';
      case self::STAT_WARTELISTE:         return 'Warteliste';
      case self::STAT_STORNO:             return 'Storno';
      case self::STAT_STORNO_MIT_ZAHLUNG: return 'Storno, aber noch zu zahlen';
      case self::STAT_FIRMA:              return 'Firmenanmeldung';
      case self::STAT_INTERESSE:          return 'Interesse';
      case self::STAT_UMMELDUNG:          return 'Ummeldung';
      case self::STAT_VORMERKUNG:         return 'Vormerkung';
    }

    $dbStatus = self::_getStatusFromDB();
    foreach ($dbStatus as $stat) {
      if ($pStatus == StringOperations::strtoupper($stat->kennz)) {
        return $stat->text;
      }
    }

    return '';
  }

  
  public static function getStatus($pBelegung)
  {
    $stat_kurs_farbe = self::getSetting();
    switch ($pBelegung->getVarValue('status')) {
      case '':
      case ' ':
      case 'A':
        return self::STAT_ANGEMELDET;
      case 'T':
        return self::STAT_TEILGENOMMEN;
      case 'P':
        return self::STAT_PLATZRESERVIERUNG;
      case 'W':
        return self::STAT_WARTELISTE;
      case 'Z':
        
        if (isset($stat_kurs_farbe['Z'])) {
          return self::STAT_STORNO_MIT_ZAHLUNG;
        }
        
      case 'S':
        return self::STAT_STORNO;
      case 'F':
        return self::STAT_FIRMA;
      case 'I':
        return self::STAT_INTERESSE;
      case 'U':
        return self::STAT_UMMELDUNG;
      case 'V':
        return self::STAT_VORMERKUNG;
      default:
        return $pBelegung->getVarValue('status');
    }
  }
}