package no.valg.valgnatt.database.geografi;

import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;

import no.valg.valgnatt.database.Konstanter;
import no.valg.valgnatt.database.hibernate.Kandidat;

public class PartiMandater {
    private String partikode;
    private String partinavn;
    private String partikategori;
    private String visningssekvens;
    private boolean stillerliste;
    
    // Mandatinformasjon vil alltid finnes i resultatData og for noen valgdistrikter/tidspunkter også i prognoseData
    private MandatData resultatData = new MandatData();
    private MandatData prognoseData = new MandatData();
    // Kandidatlisten er statisk gjennom hele valget
    private Map<Integer, Kandidat> kandidater = new TreeMap<>();

    // Settes ved oppdatering av partimandater - brukes for å avgjøre om man skal aggregere siste/nestesiste-distriktsmandater
    private boolean harStartetOpptelling;


    public PartiMandater(String partikode, String partinavn, String partikategori, String visningssekvens, boolean stillerliste) {
        this.partikode = partikode;
        this.partinavn = partinavn;
        this.partikategori = partikategori;
        this.visningssekvens = visningssekvens;
        this.stillerliste = stillerliste;
    }

    public MandatData finnBesteMandatData(boolean prognose) {
        return getMandatData(prognose).erPrognose() ? getMandatData(true) : getMandatData(false);
    }

    public String getPartinavn() {
        return partinavn;
    }

    public boolean isStillerliste() {
        return stillerliste;
    }

    public String getPartikategori() {
        return partikategori;
    }

    public void setPartikategori(String partikategori) {
        this.partikategori = partikategori;
    }

    public String getVisningssekvens() {
        return visningssekvens;
    }

    public void setVisningssekvens(String visningssekvens) {
        this.visningssekvens = visningssekvens;
    }
    
    public void addKandidat(Kandidat kandidat) {
        this.kandidater.put(kandidat.getId().getPlassnr(), kandidat);
    }

    public Kandidat getKandidat(int nr) {
        return this.kandidater.get(nr);
    }

    public void setHarStartetOpptelling(boolean harStartetOpptelling) {
        this.harStartetOpptelling = harStartetOpptelling;
    }

    public Collection<Kandidat> getKandidater() {
        return kandidater.values();
    }

    void aggreger(PartiMandater partimandater, boolean aggregerHistorikk) {
        boolean aggregerHistorikkPolicy = aggregerHistorikk || partimandater.harStartetOpptelling();

        if (partimandater.harStartetOpptelling()) {
            harStartetOpptelling = true;
        }
        resultatData.aggreger(partimandater.getResultatData(), aggregerHistorikkPolicy, partimandater.getPartikode().equals(Konstanter.BLANKE));
        prognoseData.aggreger(partimandater.getPrognoseData(), aggregerHistorikkPolicy, partimandater.getPartikode().equals(Konstanter.BLANKE));
    }

    public String getPartikode() {
        return partikode;
    }

    public void setPartikode(String partikode) {
        this.partikode = partikode;
    }

    private boolean harStartetOpptelling() {
        return this.harStartetOpptelling;
    }

    public MandatData getResultatData() {
        return resultatData;
    }

    public void setResultatData(MandatData resultatData) {
        this.resultatData = resultatData;
    }

    public MandatData getPrognoseData() {
        return prognoseData;
    }

    public void setPrognoseData(MandatData prognoseData) {
        this.prognoseData = prognoseData;
    }
    
    public MandatData getMandatData(boolean prognose) {
        return prognose ? prognoseData : resultatData;
    }
    
}
