package org.texttechnologylab.project.gruppe_05_1;


import org.texttechnologylab.project.gruppe_05_1.database.*;
import org.texttechnologylab.project.gruppe_05_1.nlp.NlpUtils;
import org.texttechnologylab.project.gruppe_05_1.nlp.XmiExtractor;
import org.texttechnologylab.project.gruppe_05_1.rest.RESTHandler;
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.FileObjectFactory;
import org.texttechnologylab.project.gruppe_05_1.xml.speeches.SpeechParser;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;

/*
import com.mongodb.client.*;
import org.bson.Document;

import org.texttechnologylab.project.Schelp_Valentin.database.MongoDBHandler;
import org.texttechnologylab.project.Schelp_Valentin.database.MongoObjectFactory;
import org.texttechnologylab.project.Schelp_Valentin.domain.mdb.MdbDocument;
import org.texttechnologylab.project.Schelp_Valentin.domain.mdb.Mdb;
import org.texttechnologylab.project.Schelp_Valentin.domain.reden.PlenarProtokoll;
import org.texttechnologylab.project.Schelp_Valentin.html.HtmlGenerationUtils;
import org.texttechnologylab.project.Schelp_Valentin.html.SortPossibilities;
import org.texttechnologylab.project.Schelp_Valentin.util.FileUtils;
import org.texttechnologylab.project.Schelp_Valentin.util.PPRUtils;
import org.texttechnologylab.project.Schelp_Valentin.util.PropertiesUtils;
import org.texttechnologylab.project.Schelp_Valentin.util.XmlUtils;
import org.texttechnologylab.project.Schelp_Valentin.xml.FileObjectFactory;
import org.texttechnologylab.project.Schelp_Valentin.xml.reden.PlenarProtokoll_File_Impl;
import org.w3c.dom.Element;

import java.util.*;
import java.util.stream.Collectors;
 */
public class Main {

    public static final String RESOURCES_DIR="src/main/resources/";
    private static final FileObjectFactory xmlFactory = FileObjectFactory.getFactory();
    private static final MongoObjectFactory mongoFactory = MongoObjectFactory.getFactory();
    private static final SpeechParser speechParser = new SpeechParser();

    public static void main(String[] args) throws Exception {

        //TEST
        MongoDBHandler mongoDBHandler = new MongoDBHandler();

        SpeechIndexFactoryImpl speechIndexFactory = new SpeechIndexFactoryImpl();
        if (mongoDBHandler.getDatabase().getCollection(MongoPprUtils.SPEECH_COLLECTION_NAME).countDocuments() != 0) {
            System.out.println("Speeches werden nicht gelesen, da sie bereits in der Datenbank stehen");
        }
        else {
            Logger.pink("Parsing XML and inserting data into DB (Uebung 2)...");
            SpeechIndex speechIndex = speechIndexFactory
                    .parseLegislativePeriods(TRUE)
                    .builder()
                    .parseSessions()
                    .filterForCurrentMembers(FALSE)
                    .build();

            //speechIndex.printInfo();

            System.out.println("Data retrieved from DB:");
            System.out.println("SPEECHCOUNT: " + speechIndex.getSpeeches().size());
            System.out.println("SESSIONCOUNT: " + speechIndex.getSessions().size());
            System.out.println("AGENDAITEMCOUNT: " + speechIndex.getAgendaItems().size());

            mongoDBHandler.deleteSpeechRelatedDocuments(); // Clear speeches, sessions, agendas (history)

            Logger.pink("Adding Sessions to DB...");
            mongoDBHandler.insertSessions(speechIndex.getSessions());

            Logger.pink("Adding Agenda Items to DB...");
            mongoDBHandler.insertAgendaItems(speechIndex.getAgendaItems());

            Logger.pink("Adding Speeches to DB...");
            mongoDBHandler.insertSpeeches(speechIndex.getSpeeches());
        }

        // Alle Informationen (Parlamentarier, Reden, Kommentare etc.) lesen und in die Mongo-DB einfügen, falls diese noch nicht vorhanden sind.
        PPRUtils.parlamentExplorerInit(xmlFactory, mongoFactory);

        //das muss auf jeden fall noch angepasst werden xd
        if(mongoDBHandler.checkAnalysisResultsField() < 21518) {
            try {
                long startTime = System.currentTimeMillis();

                XmiExtractor extractor = new XmiExtractor();
                extractor.extractAndUploadXmiData();

                long endTime = System.currentTimeMillis();
                System.out.println("Execution time: " + (endTime - startTime) + " ms");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        mongoDBHandler.close();
        NlpUtils.runRemoteDriver();
        RESTHandler restHandler = new RESTHandler();
        restHandler.startJavalin();

    }


    /* Auskommentiert aber nicht gelöscht, damit meine Methodik/Anwendung nachvollzogen werden kann


    public static void main(String[] args) {





        // Plenarprotokolle lesen und in die MongoDB schreiben
        Set<String> protokollFileNames = FileUtils.listFilesInDirectory(PROTOKOLLE_DIRNAME)
                .stream()
                .filter(file -> file.endsWith(".xml"))
                .collect(Collectors.toSet());
        ;

        String collectionName = "speeches";
        // MongoDBHandler.createCollectionIfNotExist(database, collectionName);
        MongoDBHandler.createOrTrancateCollection(database, collectionName);
        MongoCollection<Document> collection = database.getCollection(collectionName);
        for (String filename : protokollFileNames) {
            // for (String filename : Arrays.asList("1.XML", "2.XML")) {        // für Testzwecke,,,
            System.out.println("Plenarprotokoll wird aus " + filename + " gelesen");
            Element redenRoot = XmlUtils.getRootDocument("src/main/resources/plenarprotokolle/" + filename);
            PlenarProtokoll redenDoc = new PlenarProtokoll_File_Impl().fromXmlNode(redenRoot);
            MongoDBHandler.createPlenarprotokoll(collection, redenDoc);
        }


        // wichtige Datenstrukturen erzeugen: Listen, Zuordnungen
        Map<String, List<Mdb>> pareiMdbZuordnung = PPRUtils.createMdbParteiZuordnung(mdbList);


        // HTML-Generierung
        // Vorbereitung
        HtmlGenerationUtils.prepareHtmlGeneration();

        // index.html

        /*
         * Hier wird bestimmt, wie die index.html-Seite aufgebaut wird, je nach verwendete Enum aus SortPossibilities:
         * - MDB_ALPHABETISCH: parteiübergreifend alphabetisch sortiert
         * - nach Partei gruppiert, innerhalb der Partei alphabetisch sortiert:
         *   - PARTEI_MDB_ALPHABETISCH: die Parteien erscheinen in alphabetischen Reihenfolge
         *   - PARTEI_NACH_GROESSE: die Parteien erscheinen nach Anzahl ihrer dBs sortiert
         * TODO: CLOSE COMMENT
        HtmlGenerationUtils.generateIndexHtml(mdbList, pareiMdbZuordnung, SortPossibilities.MDB_ALPHABETISCH);

        HtmlGenerationUtils.generateMdbPages(mdbList);

}
     */

}

