<?php

class Studienplan_model extends DB_Model
{
	/**
	 * Constructor
	 */
	public function __construct()
	{
		parent::__construct();
		$this->dbTable = "lehre.tbl_studienplan";
		$this->pk = "studienplan_id";
	}

	public function getStudienplaene($studiengang_kz)
	{
		$this->addJoin("lehre.tbl_studienordnung", "studienordnung_id");

		return $this->loadWhere(array("studiengang_kz" => $studiengang_kz));
	}

	public function getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester = null, $orgform_kurzbz = null, $sprache = null)
	{
		$this->addJoin("lehre.tbl_studienordnung", "studienordnung_id");
		$this->addJoin("lehre.tbl_studienplan_semester", "studienplan_id");

		$whereArray = array(
			"tbl_studienplan.aktiv" => "TRUE",
			"tbl_studienordnung.studiengang_kz" => $studiengang_kz,
			"tbl_studienplan_semester.studiensemester_kurzbz" => $studiensemester_kurzbz
		);

		if(!is_null($ausbildungssemester))
		{
			$whereArray["tbl_studienplan_semester.semester"] = $ausbildungssemester;
		}

		if(!is_null($orgform_kurzbz))
		{
			$whereArray["orgform_kurzbz"] = $orgform_kurzbz;
		}

		if(!is_null($sprache))
		{
			$whereArray["tbl_studienplan.sprache"] = $sprache;
		}

		return $this->loadWhere($whereArray);
	}

	public function getStudienplanLehrveranstaltung($studienplan_id, $semester)
	{
		$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id');
		$this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
		$this->addOrder('tbl_lehrveranstaltung.sort');

		return $this->loadWhere(array(
			'studienplan_id' => $studienplan_id,
			'tbl_studienplan_lehrveranstaltung.semester' => $semester
		));
	}

	public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id)
	{
		$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
		$sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id);

		$this->addSelect($this->dbTable . '.*');
		$this->addSelect('lv.*');
		$this->addSelect('COALESCE(n.bezeichnung_mehrsprachig[(' . $lang . ')], NULL) AS note');
		$this->addSelect('n.positiv');
		$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id');
		$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.sort plan_sort');
		$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent');

		$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id');
		$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
		// NOTE(chris): last offizell note
		$this->addJoin('(
			SELECT z.* 
			FROM lehre.tbl_zeugnisnote z
			LEFT JOIN public.tbl_studiensemester zs 
				USING(studiensemester_kurzbz)
			JOIN (
				SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start 
				FROM lehre.tbl_zeugnisnote zi
				LEFT JOIN lehre.tbl_note zin
					USING(note)
				LEFT JOIN public.tbl_studiensemester zis
					USING(studiensemester_kurzbz)
				WHERE zin.aktiv AND zin.offiziell
				GROUP BY zi.lehrveranstaltung_id, zi.student_uid
			) zx
				ON (
					z.lehrveranstaltung_id=zx.lehrveranstaltung_id
					AND z.student_uid=zx.student_uid
					AND zs.start = zx.start
				)) zn', 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=( ' . $sql . ')', 'LEFT');
		$this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT');

		$this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort');
		$this->addOrder('lv.sort');

		return $this->loadWhere(array(
			'studienplan_id' => $studienplan_id,
			'tbl_studienplan_lehrveranstaltung.semester' => $semester
		));
	}

	// Deprecated
	// im Lehrveranstaltung_model vorhanden
	public function getAllOesForLv($lehrveranstaltung_id)
	{
		$this->addDistinct('oe_kurzbz');

		$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung lv', 'studienplan_id');
		$this->addJoin('lehre.tbl_studienordnung', 'studienordnung_id');
		$this->addJoin('public.tbl_studiengang', 'studiengang_kz');

		return $this->loadWhere([
			'lv.lehrveranstaltung_id' => $lehrveranstaltung_id
		]);
	}

	public function getStudienplaeneByPrestudents($prestudent_id)
	{
		$this->addDistinct();
		$this->addSelect($this->dbTable . '.*');
		$this->addSelect('sem.start AS start_stsem');
		$this->addJoin('lehre.tbl_studienordnung o', 'studienordnung_id');
		$this->addJoin('public.tbl_prestudent p', 'studiengang_kz');
		$this->addJoin('public.tbl_studiensemester sem', 'sem.studiensemester_kurzbz = o.gueltigvon', 'LEFT');
		$this->addOrder('sem.start');

		return $this->loadWhere([
			'prestudent_id' => $prestudent_id
		]);
	}

	public function loadStudienplanLehrveranstaltung($lv_id)
	{
		$qry = "SELECT studienplan_lehrveranstaltung_id,
					semester,
					pflicht,
					studienplan_id,
					koordinator,
 					studienplan_lehrveranstaltung_id_parent,
					lehrveranstaltung_id,
					insertamum,
					insertvon,
					updateamum,
					updatevon,
					sort,
					curriculum,
					export
				FROM lehre.tbl_studienplan_lehrveranstaltung WHERE studienplan_lehrveranstaltung_id = ? ";
		return $this->execReadOnlyQuery($qry, array($lv_id));
	}

	public function getStudienplaeneForPerson($person_id)
	{
		$this->addDistinct();
		$this->addSelect($this->dbTable . '.*');
		$this->addSelect('ps.*');
		$this->addJoin('public.tbl_prestudentstatus pss', 'studienplan_id');
		$this->addJoin('public.tbl_prestudent ps', 'prestudent_id');

		return $this->loadWhere([
			'person_id' => $person_id
		]);
	}
}
