package no.valg.valgnatt.database.geografi;

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

public class MandatData {
    private String prognoseindikator;
    // Dette er stemmer som kommer fra mandatberegningen - her kan det være både opptalte stemmer (fhs, vts, fhs+vts) eller prognostiserte stemmer.
    private int stemmer;
    private int listestemmer;
    private Mandater distriktsmandater = new Mandater();
    private Mandater utjevningmandater = new Mandater(); // Utjevningsmandater finnes bare i ST-valg, men regnes også ut i FY-valg (som om det var ST-valg)
    private int antallDistriktsmandaterGittSTValg = 0; // I FY-valg så regner vi også ut mandatene som fylket ville gitt i et ST-valg, for sammenligningens skyld i rapportene

    // Settes bare når vi aggregerer opp totalt antall distriktsmandater - vi trenger dette til å korrigere antall blanke stemmer
    private MandatData blankeMandatData;


    public int getAntall(ValgType valgType) {
        if (valgType == ValgType.ST) {
            return distriktsmandater.getAntall() + utjevningmandater.getAntall();
        }
        return distriktsmandater.getAntall();
    }

    public int getSisteAntall() {
        return distriktsmandater.getSisteAntall() + utjevningmandater.getSisteAntall();
    }

    public int getNestsisteAntall() {
        return distriktsmandater.getNestsisteAntall() + utjevningmandater.getNestsisteAntall();
    }

    public boolean erPrognose() {
        return this.prognoseindikator != null && "1".equals(this.prognoseindikator);
    }

    public int getListestemmer() {
        return this.listestemmer;
    }

    public void setListestemmer(int listestemmer) {
        this.listestemmer = listestemmer;
    }

    public int getStemmerBK() {
        if (blankeMandatData != null) {
            return getStemmer() - blankeMandatData.getStemmer();
        }
        return getStemmer();
    }

    public int getStemmer() {
        return this.stemmer;
    }

    public void setStemmer(int stemmer) {
        this.stemmer = stemmer;
    }

    public int getAntallMandaterGittSTValg() {
        return antallDistriktsmandaterGittSTValg + utjevningmandater.getAntall();
    }

    public void aggreger(MandatData mandatData, boolean harStartetOpptelling, boolean blanke) {
        this.stemmer = this.stemmer + mandatData.getStemmer();
        // Dersom et tall er basert på prognose, så er det aggregerte objektet også det
        if (mandatData.getPrognoseindikator() != null && "1".equals(mandatData.getPrognoseindikator())) {
            prognoseindikator = "1";
        }
        distriktsmandater.aggreger(mandatData.getDistriktsmandater(), harStartetOpptelling);
        utjevningmandater.aggreger(mandatData.getUtjevningmandater(), harStartetOpptelling);
        antallDistriktsmandaterGittSTValg += mandatData.getAntallDistriktsmandaterGittSTValg();
        if (blanke) {
            blankeMandatData = mandatData;
        }
    }

    public String getPrognoseindikator() {
        return prognoseindikator;
    }

    public void setPrognose(String prognoseindikator) {
        this.prognoseindikator = prognoseindikator;
    }

    public Mandater getDistriktsmandater() {
        return distriktsmandater;
    }

    public void setDistriktsmandater(Mandater distriktsmandater) {
        this.distriktsmandater = distriktsmandater;
    }

    public Mandater getUtjevningmandater() {
        return utjevningmandater;
    }

    public void setUtjevningmandater(Mandater utjevningmandater) {
        this.utjevningmandater = utjevningmandater;
    }

    public int getAntallDistriktsmandaterGittSTValg() {
        return antallDistriktsmandaterGittSTValg;
    }

    public void setAntallDistriktsmandaterGittSTValg(int mandater) {
        this.antallDistriktsmandaterGittSTValg = mandater;
    }
    
    public void nullstill() {
        prognoseindikator = null;
        stemmer = 0;
        listestemmer = 0;
        distriktsmandater.nullstill();
        utjevningmandater.nullstill();
        antallDistriktsmandaterGittSTValg = 0;
    }
}
