package org.texttechnologylab.project.gruppe_05_1.rest;

import io.javalin.http.Context;
import io.javalin.openapi.*;
import org.texttechnologylab.project.gruppe_05_1.domain.html.Parlamentarier;
import org.texttechnologylab.project.gruppe_05_1.domain.html.ParlamentarierDetails;
import org.texttechnologylab.project.gruppe_05_1.database.MongoPprUtils;
import org.texttechnologylab.project.gruppe_05_1.util.Logger;
import org.texttechnologylab.project.gruppe_05_1.util.PPRUtils;
import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Dieser Kontroller zeigt Informationen um den Parlamentariern:
 * 1. Die Einstiegsseite: eine Filter-fähige Auflistung der Parlamentariern.
 *    Angezeigt werden Vor- und Nachname, Partei sowie ID.
 *    Die Filter-Funktion funktioniert für all diese Felder.
 * 2. Ein Parlamentarierportfolio. Dieses beinhaltet:
 *    - Name und Partei im Header
 *    - Foto, falls ein Foto als Primärfoto angegeben wurde
 *    - Die Anzahl der Reden + Link auf die Redenseite des Parlamentariers
 *    - Persönliche Daten (Titel, Geschlecht, Religion, Beruf, Vita etc.)
 *    - Eine Auflistung aller Mitgliedschaften
 *    - Eine Auflistung aller vorhandenen Fototupeln. Für jedes Tupel steht einen Link, um diese zu editieren
 */
public class ParlamentarierController {
    /**
     * Liste alle Abgeordnete.
     * Der Query-Parameter "filter" kann die Menge der Ergebnisse einschränken
     * @param ctx JavaLin-Context
     */

    private static List<Integer> emptyList = new ArrayList<>();     // passed as an indicator if a certain list exists or not (in latter case: pass null)

    @OpenApi(
            summary = "Get alle Parlamentarier. Man kann nach Vor-, Nachname oder Partei filtern.",
            description = "Listet alle Parlamentarier bzw. diejenige, welche den Filter entsprechen",
            operationId = "getAllParlamentarier",
            path = "/",
            methods = HttpMethod.GET,
            tags = {"Parlamentarier"},
            queryParams = {
                    @OpenApiParam(name = "filter", description = "Full-Text-Filter. Kann Vorname, Nachname oder Partei filtern", required = false),
            },
            responses = {
                    @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Parlamentarier[].class)})
            })
    public static void getAllParlamentarier(Context ctx) {
        String filter = ctx.queryParam("filter");
        Logger.info("Filter: '" + filter + "'");

        List<Parlamentarier> parlamentarier = MongoPprUtils.getAllParlamentarier(filter);
        PPRUtils.sortParlamentarierByName(parlamentarier);
        Logger.info(parlamentarier.size() + " MdBs gefunden");

        Map<String, Object> attributes = new HashMap<>();
        attributes.put("parlamentarier", parlamentarier);
        attributes.put("filter", filter);
        ctx.render("parlamentarier.ftl", attributes);
    }


    /**
     * Zeigt die Details eines Parlamentariers an:
     * - persönliche Daten (Geburtsdatum, -ort, Vita, Religion etc.).
     * - Mitgliederschaften, falls vorhanden
     * - Fotos, falls vorhanden
     * @param ctx JavaLin-Context
     */

    @OpenApi(
            summary = "Zeigt die Details eines Parlamentariers an",
            description = "Zeigt persönliche Daten, Mitgliederschaften, Fotos",
            operationId = "getParlamentarierDetails",
            path = "/portfolio/{id}",
            methods = HttpMethod.GET,
            tags = {"Parlamentarier"},
            pathParams = {
                    @OpenApiParam(name = "id", description = "id des Parlamentariers", required = true),
            },
            responses = {
                    @OpenApiResponse(status = "200", content = {@OpenApiContent(from = ParlamentarierDetails.class)})
            })
    public static void getParlamentarierDetails(Context ctx) {
        String id = ctx.pathParam("id");
        Logger.info("getParlamentarierDetails, ID = " + id);

        // Alle Details des Abgeordnetes (Vor- und Nachname, Geburts- und Sterbeort, Partei, Vita etc.)
        ParlamentarierDetails pd = MongoPprUtils.getParlamentarierDetailsByID(id);

        Map<String, Object> attributes = new HashMap<>();
        attributes.put("p", pd);
        Long speechCount = MongoPprUtils.countSpeechesOfSpeaker(pd.getId());
        attributes.put("speechesCount", speechCount);
        if (speechCount == 0) {
            attributes.put("speechesPlaceholder", null);
        } else {
            attributes.put("speechesPlaceholder", emptyList);
        }

        // Foto des Abgeordnetes
        String picture = MongoPprUtils.getParlamentarierPictureByID(id);
        attributes.put("pic", picture);

        ctx.render("parlamentarierDetails.ftl", attributes);
    }

}
