<?php

if (! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * The controller Lehrauftrag displays all Lehrauftraege within a study semester.
 * Heads of degree programs can order Lehrauftraege, which subsequently will generate the corresponding contracts
 * automatically.
 * Department leaders can approve the ordered Lehrauftraege.
 */
class Lehrauftrag extends Auth_Controller
{
    const APP = 'lehrauftrag';
    const LEHRAUFTRAG_URI = 'lehre/lehrauftrag/Lehrauftrag';    // URL prefix for this controller
    const BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN = 'lehre/lehrauftrag_bestellen';

    private $_uid;  // uid of the logged user

    /**
     * Constructor
     */
    public function __construct()
    {
        // Set required permissions
        parent::__construct(
            array(
                'index' => 'lehre/lehrauftrag_bestellen:r',
                'orderLehrauftrag' => 'lehre/lehrauftrag_bestellen:rw',
				'Dashboard' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r'),
				'LehrendeUebersicht' => array('lehre/lehrauftrag_erteilen:r')
            )
        );

        // Load models
        $this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel');
        $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
        $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
        $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
        $this->load->model('accounting/Vertrag_model', 'VertragModel');

        // Load libraries
        $this->load->library('WidgetLib');
        $this->load->library('PermissionLib');

        // Load helpers
        $this->load->helper('array');
        $this->load->helper('url');
        $this->load->helper('hlp_sancho_helper');

        // Load language phrases
        $this->loadPhrases(
            array(
                'global',
                'ui',
				'lehre',
	            'table'
            )
        );

        $this->_setAuthUID(); // sets property uid

        $this->setControllerId(); // sets the controller id
    }

	/**
	 * Display of Custom Dashboard for Lehraufträge App
	 * Charts are hooked from Reporting Addon
	 */
	public function Dashboard()
	{
		$this->load->view('lehre/lehrauftrag/Dashboard.php');
	}

	/**
	 * Display of Lehrauftragsübersicht report
	 */
	public function LehrendeUebersicht()
	{
		$this->load->view('lehre/lehrauftrag/LehrendeUebersicht.php');
	}

    // -----------------------------------------------------------------------------------------------------------------
    // Public methods
    /**
     * Main page of Lehrauftrag
     */
    public function index()
    {
        // Set studiengang selected for studiengang dropdown
        $studiengang_kz = $this->input->get('studiengang'); // if provided by selected studiengang
        $studiengang_kz = ($studiengang_kz == 'null' ? null : $studiengang_kz);

        // Retrieve studiengaenge the user is entitled for to populate studiengang dropdown
        if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN)) {
            show_error('Keine Studiengänge gefunden.<br>
                Es muss eine passende Organisationseinheit hinterlegt werden.<br>');
        }

        // If studiengang_kz get param was set, check against entitled stg
        if (!is_null($studiengang_kz))
        {
            if (!in_array($studiengang_kz, $studiengang_kz_arr))
            {
                show_error('Keine Berechtigung für diesen Studiengang');
            }
        }

        // Set studiensemester selected for studiengang dropdown
        $studiensemester_kurzbz = $this->input->get('studiensemester'); // if provided by selected studiensemester
        if (is_null($studiensemester_kurzbz)) // else set next studiensemester as default value
        {
            $studiensemester = $this->StudiensemesterModel->getAktOrNextSemester();
            if (hasData($studiensemester))
            {
                $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
            }
            elseif (isError($studiensemester))
            {
                show_error(getError($studiensemester));
            }
        }

        // Set ausbildungssemester selected for ausbildungssemester dropdown
        $ausbildungssemester = $this->input->get('ausbildungssemester'); // if provided by selected ausbildungssemester
        $ausbildungssemester = ($ausbildungssemester == 'null' ? null : $ausbildungssemester);

        $view_data = array(
            'studiengang_selected' => $studiengang_kz,
            'studiengang' => $studiengang_kz_arr,
            'studiensemester_selected' => $studiensemester_kurzbz,
            'ausbildungssemester_selected' => $ausbildungssemester,
        );

        $this->load->view('lehre/lehrauftrag/orderLehrauftrag.php', $view_data);
    }

    public function orderLehrauftrag()
    {
        $new_lehrvertrag_data_arr = array();    // information of new lehrvertraege to be used in mail
        $lehrauftrag_arr = json_decode($this->input->post('selected_data'));

        // Loop through lehraufträge
        if(is_array($lehrauftrag_arr))
        {
            foreach($lehrauftrag_arr as $lehrauftrag)
            {
                $lehreinheit_id = (isset($lehrauftrag->lehreinheit_id)) ? $lehrauftrag->lehreinheit_id : null;
                $lehrveranstaltung_id = (isset($lehrauftrag->lehrveranstaltung_id)) ? $lehrauftrag->lehrveranstaltung_id : null;
                $person_id = (isset($lehrauftrag->person_id)) ? $lehrauftrag->person_id : null;
                $mitarbeiter_uid = (isset($lehrauftrag->mitarbeiter_uid)) ? $lehrauftrag->mitarbeiter_uid : null;
                $vertrag_id = (isset($lehrauftrag->vertrag_id)) ? $lehrauftrag->vertrag_id : null;
                $projektarbeit_id = (isset($lehrauftrag->projektarbeit_id)) ? $lehrauftrag->projektarbeit_id : null;
                $stunden = (isset($lehrauftrag->stunden)) ? $lehrauftrag->stunden : 0;
                $betrag = (isset($lehrauftrag->betrag)) ? $lehrauftrag->betrag : 0;
                $studiensemester_kurzbz = (isset($lehrauftrag->studiensemester_kurzbz)) ? $lehrauftrag->studiensemester_kurzbz : null;
                $studiengang_kz = (isset($lehrauftrag->studiengang_kz)) ? $lehrauftrag->studiengang_kz : null;

                // Check if user is entitled to order this Lehrauftrag
                if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN, 'suid', $studiengang_kz))
                {
					return $this->outputJsonError('Sie haben keine Bestellberechtigung für diesen Studiengang: '. $studiengang_kz);
                }

                // update contract if contract exists and the betrag was changed
                if (!is_null($vertrag_id))
                {
                    $this->VertragModel->addSelect('vertragsstunden, betrag');

                    if($result = getData($this->VertragModel->load($vertrag_id)))
                    {
                        $vertrag_betrag = $result[0]->betrag;
                        $vertrag_stunden = $result[0]->vertragsstunden;
                    }
                    elseif (isError($result))
					{
						return $this->outputJsonError('Fehler beim Laden des Vertrags');
					}

                    $hasChanged = ($betrag != floatval($vertrag_betrag) || $stunden != $vertrag_stunden) ? true : false;

                    if ($hasChanged)
                    {
                        $result = $this->VertragModel->updateVertrag(
                            $vertrag_id,
                            $stunden,
                            $betrag,
                            $mitarbeiter_uid
                        );

                        if (isSuccess($result))
                        {
                            $json []= array(
                                'row_index' => $lehrauftrag->row_index,
                                'bestellt' => date('Y-m-d'),
                                'vertrag_betrag' => $betrag,
                                'vertrag_stunden' => $stunden,
                                'erteilt' => null
                            );
                        }
                        else
						{
							return $this->outputJsonError('Fehler beim Vertragsupdate');
						}
                    }
                }
                // else save new contract
                else
                {
                    $result = $this->VertragModel->save(
                        $person_id,
                        $mitarbeiter_uid,
                        $lehrveranstaltung_id,
                        $lehreinheit_id,
                        $projektarbeit_id,
                        $stunden,
                        $betrag,
                        $studiensemester_kurzbz
                    );

                    if (isSuccess($result))
                    {
                        $json []= array(
                            'row_index' => $lehrauftrag->row_index,
                            'bestellt' => date('Y-m-d'),
                            'vertrag_betrag' => $betrag,
							'vertrag_stunden' => $stunden
                        );
                    }
                    elseif (isError($result) && $result->retval)
					{
						return $this->outputJsonError($result->retval);
					}
                    else
					{
						return $this->outputJsonError('Fehler beim Speichern des Vertrags');
					}

                    $new_lehrvertrag_data_arr[] = array(
                        'studiensemester_kurzbz' => $lehrauftrag->studiensemester_kurzbz,
                        'studiengang_kz' => $lehrauftrag->studiengang_kz,
                        'lv_oe_kurzbz' => $lehrauftrag->lv_oe_kurzbz
                    );
                }
            }
        }
		else
		{
			return $this->outputJsonError('Fehler beim Übertragen der Daten.');
		}

        if (isset($json) && !isEmptyArray($json))
        {
            $this->outputJsonSuccess($json);
        }
    }

    // -----------------------------------------------------------------------------------------------------------------
    // Private methods

    /**
     * Retrieve the UID of the logged user and checks if it is valid
     */
    private function _setAuthUID()
    {
        $this->_uid = getAuthUID();

        if (!$this->_uid) show_error('User authentification failed');
    }

    private function _sendMail($lehrvertrag_data_arr)
    {
        // Cluster data of new lehrvertraege as needed to send mail

        foreach ($lehrvertrag_data_arr as $lehrvertrag_data)
        {
            // Get mail recipients
            $result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $lehrvertrag_data['lv_oe_kurzbz']);

            // If given lv organisational unit has no authorized user, check if is a Kompetenzfeld.
            // If so, look up for authorized user on Department level.
            if (!hasData($result)) {
                $result = $this->OrganisationseinheitModel->getParent($lehrvertrag_data['lv_oe_kurzbz']);

                if (hasData($result)) {
                    if ($result->retval[0]->organisationseinheittyp_kurzbz === 'Department') {
                        $result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $result->retval[0]->oe_kurzbz);
                    }
                }
            }

            // Set mail recipients (department assistance/leader)
            $to = '';
            $to_arr = array();
            foreach ($result->retval as $berechtigung) {
                $to_arr []= $berechtigung->uid . '@' . DOMAIN; // TODO: als array, dann splitten mit ;? oder als array lassen?
            }
            $to = implode(', ', $to_arr);

            // Set link to lehrauftrag-site with preselected studiengang and studiensemester of new lehrauftraege
            $url = site_url(self::LEHRAUFTRAG_URI).'?studiensemester='. $lehrvertrag_data['studiensemester_kurzbz']. '&studiengang='. $lehrvertrag_data['studiengang_kz'];

            // Prepare mail content
            $content_data_arr = array(
                'anzahl' => $lehrvertrag_data['amount_new_lehrvertraege'],
                'studiengang' => $lehrvertrag_data['studiengang_kz'],
                'studiensemester' => $lehrvertrag_data['studiensemester_kurzbz'],
                'link' => anchor($url, 'Lehrverträge Übersicht')
            );

            // Send mail
            sendSanchoMail(
                'LehrauftragBestellMail',
                $content_data_arr,
                $to,
                'Bestellung neuer Lehraufträge',
                'sancho_header_min_bw.jpg',
                'sancho_footer_min_bw.jpg'
            );
        }
    }

    /**
     * Clusters data as needed for _sendMail.
     * Makes array of new lehrvertraege unique (by studiensemester, studiengang and lv_oe_kurzbz)
     * Adds the amount of lehrvertraege of each unique array element.
     * @param $new_lehrvertrag_data_arr
     * @return array
     */
    private function _cluster_newVertragData($new_lehrvertrag_data_arr)
    {
        $unique_new_lehrvertrag_data_arr = array_unique($new_lehrvertrag_data_arr, SORT_REGULAR);
        foreach ($unique_new_lehrvertrag_data_arr as &$new_lehrvertrag)
        {
            $cnt = 1;
            foreach ($new_lehrvertrag_data_arr as $item)
            {
                if ($new_lehrvertrag['studiensemester_kurzbz'] === $item['studiensemester_kurzbz'] &&
                    $new_lehrvertrag['studiengang_kz'] === $item['studiengang_kz'] &&
                    $new_lehrvertrag['lv_oe_kurzbz'] === $item['lv_oe_kurzbz'])
                {
                    $new_lehrvertrag['amount_new_lehrvertraege'] = $cnt++;
                }
            }
        }

        return $unique_new_lehrvertrag_data_arr;
    }
}
