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


class DataMenuSucheKurseGroupByCategory extends DataMenuSucheKurse
{
  private $kategorien;
  private $kurseGroupedByCategoryAndStandort;

  public function __construct($urlparameter)
  {
    parent::__construct($urlparameter);
  }

  public function mainmenu()
  {
    $this->prepare();
    if (count($this->kategorien) === 0) {
      $this->getsight(510);

      $this->setStatusMeldung();
      $this->dataarraynodata = array(new Datamodul());
      $this->exportadapter->setSightInfo('statustext', $this->status2);
      echo $this->getnodata();
    } else {
      foreach ($this->kategorien as $kategorie) {
        $this->getsight(510);
        $this->dataarrayheader = array($kategorie);
        $this->dataarrayfooter = array($kategorie);
        $this->exportadapter = new ExpKategorien();

        $kategorieHeader = $this->getheader();
        $kategorieFooter = $this->getfooter();

        echo $kategorieHeader;

        $kurseGroupedByStandort = $this->kurseGroupedByCategoryAndStandort[$kategorie->id];
        foreach ($kurseGroupedByStandort as $standort => $kurse) {
          $standortDm = new Datamodul();
          $standortDm->standort = $standort;
          $standortDm->standortUrlEnc = urlencode($standort);
          $standortDm->katid = $kategorie->id;

          $this->getsight(511);
          $this->dataarrayheader = array($standortDm);
          $this->dataarrayfooter = array($standortDm);
          $this->exportadapter = new ExpBasis();

          $standortHeader = $this->getheader();
          $standortFooter = $this->getfooter();

          echo $standortHeader;

          foreach ($kurse as $key => $kurs) {
            $kurse[$key]->katid = $kategorie->id;
          }

          $this->getsight(12);
          $this->dataarrayheader = array(new Datamodul());
          $this->dataarraybody = $kurse;
          $this->dataarrayfooter = array(new Datamodul());
          $this->exportadapter = new ExpKurse();
          $this->showheader();
          $this->showbody();
          $this->showfooter();

          echo $standortFooter;
        }

        echo $kategorieFooter;
      }
    }
  }

  private function prepare($pZeitBereich = 'noRestrict')
  {
    $kurse = $this->getKurse($pZeitBereich);
    $this->kurseGroupedByCategoryAndStandort = $this->groupKurse($kurse);
    $kategorieIds = array_keys($this->kurseGroupedByCategoryAndStandort);
    $this->kategorien = $this->getCategories($kategorieIds);
  }

  protected function getKurse($pZeitBereich)
  {
    parent::getdataarraybody($pZeitBereich);

    return $this->dataarraybody;
  }

  private function getCategories($pKategorieIds)
  {
    $dbwKategorien = new DBWorkCategories(1, true);
    $kategorien = $dbwKategorien->getCategoriesByIdOrderByBezeichnung($pKategorieIds);

    return ArrayOperations::setAttributAsKey($kategorien, 'id');
  }

  private function groupKurse($pKurse)
  {
    $kurseGroupedByStandort = $this->groupKurseByStandort($pKurse);

    return $this->groupKurseByKategorie($kurseGroupedByStandort, $pKurse);
  }

  private function groupKurseByStandort($pKurse)
  {
    
    
    
    
    
    

    $mkTextAry = ArrayOperations::mapAttribut($pKurse, 'ort');

    $dbwOrt = new DBWorkKursorte(1, true);
    $kursorte = $dbwOrt->getKursorteByMktextary($mkTextAry);

    $mktextStandortMap = array();
    foreach ($kursorte as $ort) {
      $mktextStandortMap[$ort->mktext] = $ort->progheft1;
    }

    $groupedKurse = array();
    foreach ($pKurse as $kurs) {
      if (isset($mktextStandortMap[$kurs->ort])) {
        $standort = $mktextStandortMap[$kurs->ort];
      } else {
        $standort = 'Sonstige Orte';
      }

      if (!isset($groupedKurse[$standort])) {
        $groupedKurse[$standort] = array();
      }

      $groupedKurse[$standort][] = $kurs;
    }

    return $groupedKurse;
  }

  private function groupKurseByKategorie($kurseGroupedByStandort, $pKurse)
  {
    $alleKursnummern = ArrayOperations::mapAttribut($pKurse, 'id');
    
    $dbwKK = new DBWorkKurseKategorien(1, true);
    $kurseKats = $dbwKK->getKurseKategorienByKnrsAndBez($alleKursnummern);
    $knrKategorieIdMap = array();
    foreach ($kurseKats as $kkats) {
      if (!isset($knrKategorieIdMap[$kkats->knr])) {
        $knrKategorieIdMap[$kkats->knr] = $kkats->kategorie_id;
      }
    }
    $kurseGroupedByKategorieStandort = array();
    foreach ($kurseGroupedByStandort as $standort => $kurse) {
      foreach ($kurse as $kurs) {
        if (isset($knrKategorieIdMap[$kurs->id])) {
          $kategorieId = $knrKategorieIdMap[$kurs->id];
          if (!isset($kurseGroupedByKategorieStandort[$kategorieId])) {
            $kurseGroupedByKategorieStandort[$kategorieId] = array();
          }
          if (!isset($kurseGroupedByKategorieStandort[$kategorieId][$standort])) {
            $kurseGroupedByKategorieStandort[$kategorieId][$standort] = array();
          }

          $kurseGroupedByKategorieStandort[$kategorieId][$standort][] = $kurs;
        }
      }
    }

    return $kurseGroupedByKategorieStandort;
  }
}