package no.valg.valgnatt.database.geografi;

import no.valg.valgnatt.database.GrunnlagsdataMockup;
import no.valg.valgnatt.database.Konstanter;
import no.valg.valgnatt.database.domene.ForeløpigEndeligOppgjør;
import no.valg.valgnatt.database.domene.ValgType;
import no.valg.valgnatt.database.domene.ValgtingForhand;
import org.junit.BeforeClass;
import org.junit.Test;

import java.sql.Timestamp;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class OmrådeTest {

    private static final float FLOAT_DELTA = 0.0000001f;

    private static GrunnlagsdataMockup gdm;

    @BeforeClass
    public static void initialiser() {
        gdm = new GrunnlagsdataMockup();
        gdm.initialiser(ValgType.ST);
    }

    @Test
    public void getAndrePartikoder_Land_PP() throws Exception {
        assertEquals("PP", gdm.getLand().getAndrePartikoder().get(0));
    }

    @Test
    public void sumStemmerTotal_Land_3300() throws Exception {
        assertEquals(3300, gdm.getLand().sumStemmerTotal().getStemmer());
    }

    @Test
    public void sumStemmerAndre_Land_17() throws Exception {
        assertEquals(17, gdm.getLand().sumStemmerAndre().getStemmer());
    }

    @Test
    public void sumStemmerAndre2_Land_0() throws Exception {
        assertEquals(0, gdm.getLand().sumStemmerAndre2().getStemmer());
    }

    @Test
    public void sumStemmerAndre2_Oslo_0() throws Exception {
        assertEquals(0, gdm.getOsloKommune().sumStemmerAndre2().getStemmer());
    }

    @Test
    public void getLavesteOS_Land_0() throws Exception {
        assertEquals(0, gdm.getLand().getLavesteOS().getStatus());
    }

    @Test
    public void getAntallStsForkastede_Land_6() throws Exception {
        assertEquals(6, gdm.getLand().getAntallStsForkastede());
    }

    @Test
    public void getAntallStsForkastede_Oslo_0() throws Exception {
        assertEquals(0, gdm.getOsloKommune().getAntallStsForkastede());
    }

    @Test
    public void getAntallStsFhsForkastede() throws Exception {
        assertEquals(5, gdm.getLand().getAntallStsFhsForkastede());
    }

    @Test
    public void getAntallStgGodkjente() throws Exception {
        assertEquals(200, gdm.getLand().getAntallStgGodkjente());
    }

    @Test
    public void getAntallStgFhsGodkjente() throws Exception {
        assertEquals(100, gdm.getLand().getAntallStgFhsGodkjente());
    }

    @Test
    public void getAntallStgForkastede_2() throws Exception {
        assertEquals(2, gdm.getLand().getAntallStgForkastede());
    }

    @Test
    public void getAntallStgFhsForkastede_1() throws Exception {
        assertEquals(1, gdm.getLand().getAntallStgFhsForkastede());
    }

    @Test
    public void sumMandaterTotal_Norge_0() throws Exception {
        assertEquals(0, gdm.getLand().sumMandaterTotal().getResultatData().getStemmer());
        assertEquals(0, gdm.getLand().sumMandaterTotal().getResultatData().getAntall(ValgType.ST));
    }

    @Test
    public void sumMandaterTotal_Akershus_0_20() throws Exception {
        assertEquals(0, gdm.getLand().getFylke("02").sumMandaterTotal().getResultatData().getStemmer());
        assertEquals(20, gdm.getLand().getFylke("02").sumMandaterTotal().getResultatData().getAntall(ValgType.ST));
    }


    @Test
    public void sumMandaterTotal_Oslo_30() throws Exception {
        assertEquals(30, gdm.getLand().getFylke("03").sumMandaterTotal().getResultatData().getAntall(ValgType.ST));
    }

    @Test
    public void sumMandaterParti_AkerhusPP_1() throws Exception {
        assertEquals(1, gdm.getLand().getFylke("02").sumMandaterParti("PP").getResultatData().getAntall(ValgType.FY));
    }

    @Test
    public void sumMandaterParti_OsloH_15() throws Exception {
        assertEquals(15, gdm.getLand().getFylke("03").sumMandaterParti("H").getResultatData().getAntall(ValgType.ST));
    }

    @Test
    public void sumMandaterAndre_Akershus_1() throws Exception {
        assertEquals(1, gdm.getLand().getFylke("02").sumMandaterAndre().getResultatData().getAntall(ValgType.ST));
    }

    @Test
    public void sumMandaterAndre2_Akershus_0() throws Exception {
        assertEquals(0, gdm.getLand().getFylke("02").sumMandaterAndre2(gdm.getLand().getFylke("02").sumMandaterTotal()).getResultatData().getAntall(ValgType.FY));
    }

    @Test
    public void sumMandaterAndre2_Oslo_0() throws Exception {
        assertEquals(0, gdm.getLand().getFylke("03").sumMandaterAndre2(gdm.getLand().getFylke("02").sumMandaterTotal()).getResultatData().getAntall(ValgType.FY));
    }

    @Test
    public void beregnOpptaltProsent_Gjerdrum_031746033() throws Exception {
        assertEquals(0.33333334, gdm.getGjerdrumKommune().beregnOpptaltProsent(), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_Rælingen0000_998() throws Exception {
        assertEquals(0.998, gdm.getRælingenKommune().getStemmekrets(Konstanter.DEFAULT_KRETS).beregnOpptaltProsent(), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_Rælingen0001_1() throws Exception {
        assertEquals(1, gdm.getRælingenKommune().getStemmekrets("0001").beregnOpptaltProsent(), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusForeløpigForhånd() throws Exception {
        assertEquals(1, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.FORELØPIG, ValgtingForhand.F), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusForeløpigValgting() throws Exception {
        assertEquals(0.8499999642372131, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.FORELØPIG, ValgtingForhand.V), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusEndeligForhånd() throws Exception {
        assertEquals(0.7340909242630005, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.ENDELIG, ValgtingForhand.F), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusEndeligValgting() throws Exception {
        assertEquals(0.6741378903388977, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.ENDELIG, ValgtingForhand.V), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusOppgjørForhånd() throws Exception {
        assertEquals(0.34772729873657227, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.OPPGJØR, ValgtingForhand.F), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusOppgjørValgting() throws Exception {
        assertEquals(0.26379308104515076, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.OPPGJØR, ValgtingForhand.V), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusForeløpigNull() throws Exception {
        assertEquals(0.8999999761581421, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.FORELØPIG, null), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusEndeligNull() throws Exception {
        assertEquals(0.699999988079071, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.ENDELIG, null), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_AkershusOppgjørNull() throws Exception {
        assertEquals(0.30000001192092896, gdm.getLand().getFylke("02").beregnOpptaltProsent(ForeløpigEndeligOppgjør.OPPGJØR, null), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_Sandnes() throws Exception {
        assertEquals(0, gdm.getSandnesKommune().beregnOpptaltProsent(ForeløpigEndeligOppgjør.FORELØPIG, ValgtingForhand.F), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_OsloDefaultKrets() throws Exception {
        assertEquals(0, gdm.getOsloStemmekrets(Konstanter.DEFAULT_KRETS).beregnOpptaltProsent(ForeløpigEndeligOppgjør.OPPGJØR, ValgtingForhand.F), FLOAT_DELTA);
    }

    @Test
    public void beregnOpptaltProsent_VestfoldSomErOppgjortMenHvorAndreFylkerIkkeErFerdige() throws Exception {
        assertEquals(Konstanter.OSPROSENT_ALLE_ENDELIGE_STEMMER_OPPTALT, gdm.getLand().getFylke("07").beregnOpptaltProsent(), FLOAT_DELTA);
    }


    @Test
    public void beregnSistEndretTms() throws Exception {
        long tms = System.currentTimeMillis();
        gdm.getOsloStemmekrets(Konstanter.DEFAULT_KRETS).setEndretTms(new Timestamp(tms));
        assertEquals(tms, gdm.getLand().beregnSistEndretTms().getTime());
    }

    @Test
    public void beregnFrammøteProsentStemmegiving_Null() throws Exception {
        assertNull(gdm.getGjerdrumKommune().beregnFrammøteProsentStemmegiving());
    }

    @Test
    public void getPartiMandater() {
        assertEquals("Arbeiderpartiet", gdm.getOsloKommune().getPartiMandater("A").getPartinavn());
        assertNull(gdm.getStavangerKommune().getPartiMandater("A"));
    }

//    @Test
//    public void beregnFrammøteProsentStemmegiving() throws Exception {
//        Kommune kommune = gdm.getRælingenKommune();
//        Float frammøteProsentStemmegiving = kommune.beregnFrammøteProsentStemmegiving();
//        Assert.assertEquals(0.6666667, frammøteProsentStemmegiving, FLOAT_DELTA);
//    }

}
