package no.valg.valgnatt.backend.rapport;

import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.HashMap;

import no.valg.valgnatt.backend.GrunnlagsdataMockup;
import no.valg.valgnatt.database.domene.ValgType;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;

public class ResultatRapportTest {

    private static GrunnlagsdataMockup gdm;

    @BeforeClass
    public static void initialiser() {
        gdm = new GrunnlagsdataMockup();
        gdm.initialiser(ValgType.ST, 2017);
        // NB! Stemmetall i PartiMandater stemmer ikke overens med stemmetall i PartiStemmer i Stemmekretser.
        // NB! Mandater i PartiMandater stemmer ikke overens med antall mandater i Valgdistriktet
        // Dette er ikke noe problem for rapport-genereringen, men i virkeligheten (altså ikke i test) gjør man
        // Stemmetall.beregnOgOppdater(), Distriktmandat.beregnOgOppdater() og Utjevningsmandat.bereg() før man til slutt genererer
        // rapporten. Dette gjøres ikke her, fordi det vil komplisere feilsøking i denne testen. Da er det bedre
        // å legge inn noe dummy-data (som er lett å teste med)
        gdm.leggTilMandaterOgKandidater();
    }


    @Test
    public void lagRapport_2017st() throws Exception {

        // Lager resultatrapport (selve testen)
        String rapportTestStr = ResultatRapport.lagRapport("st", 2017, gdm.getLand(), new HashMap<>());

        JsonParser jp = new JsonParser();
        Gson gs = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
        String rapportTestStrFormatert = gs.toJson(jp.parse(rapportTestStr).getAsJsonObject());

        File _2017st = new File(this.getClass().getResource("/2017st.json").getFile());
        String rapportFilStr = new String(Files.readAllBytes(_2017st.toPath()), Charset.forName("UTF-8"));
        gs = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
        String rapportFilStrFormatert = gs.toJson(jp.parse(rapportFilStr).getAsJsonObject());


        Assert.assertEquals(rapportFilStrFormatert, rapportTestStrFormatert);

        // Working-dir på 020-UnitTest: /var/lib/jenkins/workspace/EVA-Resultat/020-UnitTest/valg_backend/.
        // Working-dir på 060-Sonar   : /var/lib/jenkins/workspace/EVA-Resultat/060-Sonar/valg_backend/.
    }

    @Test
    public void lagRapport_2017st01() throws Exception {


        // Lager resultatrapport (selve testen)
        String rapportTestStr = ResultatRapport.lagRapport("st/01", 2017, gdm.getLand(), new HashMap<>());

        JsonParser jp = new JsonParser();
        Gson gs = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
        String rapportTestStrFormatert = gs.toJson(jp.parse(rapportTestStr).getAsJsonObject());

        File _2017st = new File(this.getClass().getResource("/2017st01.json").getFile());
        String rapportFilStr = new String(Files.readAllBytes(_2017st.toPath()), Charset.forName("UTF-8"));
        gs = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
        String rapportFilStrFormatert = gs.toJson(jp.parse(rapportFilStr).getAsJsonObject());


        Assert.assertEquals(rapportFilStrFormatert, rapportTestStrFormatert);
    }


}