<?php

class BenachrichtigungenController extends RISBaseController
{
    public function actionIndex($code = "")
    {
        $this->top_menu = "benachrichtigungen";

        $this->requireLogin($this->createUrl("index/benachrichtigungen"), $code);

        /** @var BenutzerIn $ich */
        $ich = $this->aktuelleBenutzerIn();

        if (AntiXSS::isTokenSet("einstellungen_speichern")) {
            $einstellungen = $ich->getEinstellungen();
            if (isset($_REQUEST["intervall"])) {
                if ($_REQUEST["intervall"] == "tag") {
                    $einstellungen->benachrichtigungstag = null;
                } else if ($_REQUEST["intervall"] == "woche" && isset($_REQUEST["wochentag"])) {
                    $einstellungen->benachrichtigungstag = IntVal($_REQUEST["wochentag"]);
                }
            }
            $ich->setEinstellungen($einstellungen);
            $ich->save();
            $this->msg_ok = "Die Einstellung wurde gespeichert.";
        }

        if (AntiXSS::isTokenSet("del_ben")) {
            foreach ($_REQUEST[AntiXSS::createToken("del_ben")] as $ben => $_val) {
                $bena = json_decode(rawurldecode($ben), true);
                $krit = new RISSucheKrits($bena);
                $deleted = $ich->delBenachrichtigung($krit);
                if ($deleted) {
                    $this->msg_ok = "Die Benachrichtigung wurde entfernt.";
                } else {
                    $this->msg_err = "Fehler: Die Benachrichtigung konnte nicht entfernt werden.";
                }
            }
        }

        if (AntiXSS::isTokenSet("benachrichtigung_add_text")) {
            $suchbegriff = trim($_REQUEST["suchbegriff"]);
            if ($suchbegriff == "") {
                $this->msg_err = "Bitte gib einen Suchausdruck an.";
            } else {
                $ben = new RISSucheKrits();
                $ben->addKrit('volltext', $suchbegriff);
                $ich->addBenachrichtigung($ben);
                $this->msg_ok = "Die Benachrichtigung wurde hinzugefügt.";
            }
        }

        if (AntiXSS::isTokenSet("benachrichtigung_add_ba")) {
            $ben = new RISSucheKrits();
            $ben->addKrit('ba', $_REQUEST["ba"]);
            $ich->addBenachrichtigung($ben);
            $this->msg_ok = "Die Benachrichtigung wurde hinzugefügt.";
        }

        if (AntiXSS::isTokenSet("benachrichtigung_add_geo")) {
            if ($_REQUEST["geo_lng"] == 0 || $_REQUEST["geo_lat"] == 0 || $_REQUEST["geo_radius"] <= 0) {
                $this->msg_err = "Ungültige Eingabe.";
            } else {
                $ben = new RISSucheKrits();
                $ben->addKrit('geo', $_REQUEST["geo_lng"] . '-' . $_REQUEST["geo_lat"] . '-' . $_REQUEST["geo_radius"]);
                $ich->addBenachrichtigung($ben);
                $this->msg_ok = "Die Benachrichtigung wurde hinzugefügt.";
            }
        }

        if (AntiXSS::isTokenSet("del_vorgang_abo")) {
            foreach (AntiXSS::getTokenVal("del_vorgang_abo") as $vorgang_id => $_tmp) {
                /** @var Vorgang $vorgang */
                $vorgang = Vorgang::model()->findByPk($vorgang_id);
                $vorgang->deabonnieren($ich);
                $this->msg_ok = "Der Vorgang wurde entfernt.";
            }
        }

        if (AntiXSS::isTokenSet("account_loeschen")) {
            $this->top_menu = "Accountlöschung";
            $this->requireLogin($this->createUrl("index/benachrichtigungen"));
            $ich = $this->aktuelleBenutzerIn();

            if ($ich != NULL) {
                $ich->email                         = NULL;
                $ich->email_bestaetigt              = 0;
                $ich->pwd_enc                       = NULL;
                $ich->datum_angelegt                = NULL;
                $ich->datum_letzte_benachrichtigung = NULL;
                $ich->berechtigungen_flags          = 0;
                $ich->einstellungen                 = NULL;
                $ich->save(false);

                Yii::app()->db
                    ->createCommand("DELETE FROM `benutzerInnen_vorgaenge_abos` WHERE `benutzerInnen_id` = :BenutzerInId")
                    ->bindValues([':BenutzerInId' => $ich->id])
                    ->execute();

                $this->msg_ok = "Account gelöscht";

                /** @var CWebUser $user */
                $user = Yii::app()->getUser();
                if ($user) $user->logout();
            } else {
                $this->msg_err = "Sie sind nicht angemeldet";
            }

            $this->redirect(Yii::app()->createUrl("index/startseite"));

            Yii::app()->end();
        }

        if (AntiXSS::isTokenSet("passwort_aendern")) {
            /** @var null|BenutzerIn $ich  */
            $ich = $this->aktuelleBenutzerIn();
            if ($ich) {
              if ($_REQUEST["password"] == $_REQUEST["password2"]) {
                    $ich->pwd_enc = BenutzerIn::create_hash($_REQUEST["password"]);
                    $ich->save();
                    $this->msg_ok = "Passwort geändert";
                } else {
                    $this->msg_err = "Die beiden Passwörter stimmen nicht überein";
                }
            } else {
                $this->render('/index/error', ["code" => 403, "message" => "Sie sind nicht angemeldet."]);
            }
        }

        $this->render("index", [
            "ich" => $ich,
        ]);
    }

    /**
     * @param Solarium\Client $solr
     * @param BenutzerIn $benutzerIn
     * @return \Solarium\QueryType\Select\Query\Query
     */
    protected function getAlleSuchergebnisse(&$solr, $benutzerIn)
    {
        $select = $solr->createSelect();

        $select->addSort('sort_datum', $select::SORT_DESC);
        $select->setRows(100);

        /** @var Solarium\QueryType\Select\Query\Component\DisMax $dismax */
        $dismax = $select->getDisMax();
        $dismax->setQueryParser('edismax');
        $dismax->setQueryFields("text text_ocr");

        $benachrichtigungen = $benutzerIn->getBenachrichtigungen();
        $krits_solr         = [];

        foreach ($benachrichtigungen as $ben) $krits_solr[] = "(" . $ben->getSolrQueryStr($select) . ")";
        $querystr = implode(" OR ", $krits_solr);

        $select->setQuery($querystr);

        /** @var Solarium\QueryType\Select\Query\Component\Highlighting\Highlighting $hl */
        $hl = $select->getHighlighting();
        $hl->setFields(['text', 'text_ocr', 'antrag_betreff']);
        $hl->setSimplePrefix('<b>');
        $hl->setSimplePostfix('</b>');

        return $select;
    }

    /**
     * @param string $code
     */
    public function actionAlleFeed($code)
    {
        $benutzerIn = BenutzerIn::getByFeedCode($code);
        if (!$benutzerIn) {
            $this->render('../index/error', ["code" => 400, "message" => "Das Feed konnte leider nicht gefunden werden."]);
            return;
        }

        $titel       = "Suchergebnisse";
        $description = "Neue Dokumente, die einem der folgenden Kriterien entsprechen:<br>";
        $bens        = $benutzerIn->getBenachrichtigungen();
        foreach ($bens as $ben) $description .= "- " . CHtml::encode($ben->getBeschreibungDerSuche()) . "<br>";

        $solr       = RISSolrHelper::getSolrClient();
        $select     = $this->getAlleSuchergebnisse($solr, $benutzerIn);
        $ergebnisse = $solr->select($select);
        $data       = RISSolrHelper::ergebnisse2FeedData($ergebnisse);

        $this->render("../index/feed", [
            "feed_title"       => $titel,
            "feed_description" => $description,
            "data"             => $data,
        ]);

    }


    public function actionAlleSuchergebnisse()
    {
        $this->requireLogin($this->createUrl("index/benachrichtigungen"));

        /** @var BenutzerIn $ich */
        $ich = $this->aktuelleBenutzerIn();

        $solr   = RISSolrHelper::getSolrClient();
        $select = $this->getAlleSuchergebnisse($solr, $ich);

        $facetSet = $select->getFacetSet();
        $facetSet->createFacetField('antrag_typ')->setField('antrag_typ');
        $facetSet->createFacetField('antrag_wahlperiode')->setField('antrag_wahlperiode');

        $ergebnisse = $solr->select($select);


        $this->render("alle_suchergebnisse", [
            "ergebnisse" => $ergebnisse,
        ]);
    }


    public function actionNewsletterHTMLTest()
    {
        $benutzerIn = $this->aktuelleBenutzerIn();
        $data       = $benutzerIn->benachrichtigungsErgebnisse(31);

        $path = Yii::getPathOfAlias('application.views.benachrichtigungen') . '/suchergebnisse_email_html.php';
        if (!file_exists($path)) throw new Exception('Template ' . $path . ' does not exist.');
        require($path);
        Yii::app()->end();
    }

    public function actionPasswortZuruecksetzen()
    {
        if (AntiXSS::isTokenSet("reset_password")) {
            /** @var null|BenutzerIn $benutzerIn */
            $benutzerIn = BenutzerIn::model()->findByAttributes(["email" => $_REQUEST["email"]]);
            if ($benutzerIn) {
                $ret = $benutzerIn->resetPasswordStart();
                if ($ret === true) {
                    $this->render('reset_password_sent');
                } else {
                    $this->msg_err = $ret;
                    $this->render('reset_password_form');
                }
            } else {
                $this->msg_err = "Es gibt keinen Zugang mit dieser E-Mail-Adresse";
                $this->render('reset_password_form');
            }
        } else {
            $this->render('reset_password_form');
        }
    }

    /**
    * @param string $id
    * @param string $code
    */
    public function actionNeuesPasswortSetzen($id = "", $code = "")
    {
        $my_url = $this->createUrl("benachrichtigungen/NeuesPasswortSetzen", ["id" => $id, "code" => $code]);
        if (AntiXSS::isTokenSet("reset_password")) {
            /** @var null|BenutzerIn $benutzerIn */
            $benutzerIn = BenutzerIn::model()->findByPk($id);

            if (!$benutzerIn) {
                $this->msg_err = "BenutzerIn nicht gefunden";
                $this->render('reset_password_form', [
                    "current_url" => $this->createUrl("benachrichtigungen/PasswortZuruecksetzen"),
                ]);
                return;
            }

            if ($_REQUEST["password"] != $_REQUEST["password2"]) {
                $this->msg_err = "Die beiden Passwörter stimmen nicht überein";
                $this->render('reset_password_set_form', [
                    "current_url" => $my_url,
                ]);
                return;
            }

            $ret = $benutzerIn->resetPasswordDo($code, $_REQUEST["password"]);
            if ($ret === true) {
                $this->render('reset_password_done');
            } else {
                $this->msg_err = $ret;
                $this->render('reset_password_set_form', [
                    "current_url" => $my_url,
                ]);
            }
        } else {
            $this->render('reset_password_set_form', [
                "current_url" => $my_url,
            ]);
        }
    }



}
