package no.valg.valgnatt.backend.mandatberegning;

import java.util.Map;

import lombok.Getter;
import no.valg.valgnatt.database.Konstanter;
import no.valg.valgnatt.database.domene.ValgType;
import no.valg.valgnatt.database.geografi.Land;
import no.valg.valgnatt.database.geografi.Område;

public class MandatBeregningArgumenter implements Comparable {
	@Getter
	private Område område;
	private boolean opptaltBeregning;
	// mandaterPrFylkeST brukes kun i FY-valg fordi da ønsker man å beregne mandatfordelingen *som om* det hadde vært ST-valg
	// Map'et inneholder antall *distriktsmandater* pr fylke, altså ikke inkludert utjevningsmandatene.
	// Verken antall eller fordeling er konstant over årene (endring f.eks. i 2013 og 2005), men man kan trygt bruke det foregående
	// (i forhold til det valg man regner på) ST-valgs fordeling.
	@Getter
	private Map<String, Integer> mandaterPrFylkeST;

	public MandatBeregningArgumenter(Område område, boolean opptaltBeregning) {
		this.område = område;
		this.opptaltBeregning = opptaltBeregning;
	}

	MandatBeregningArgumenter(Område område, boolean opptaltBeregning, Map<String, Integer> mandaterPrFylkeST) {
		this.område = område;
		this.opptaltBeregning = opptaltBeregning;
		this.mandaterPrFylkeST = mandaterPrFylkeST;
	}

	public boolean forsøkPrognose() {
		if (opptaltBeregning) {
			return false;
		}
		return (område.getValgType() == ValgType.ST) || (område.getValgType() == ValgType.FY) || ((område.getValgType() == ValgType.KO) && Konstanter.erPrognosekommune((område).getNr()));
	}

	boolean erDistriktsmandatBeregning() {
		return !erUtjevningsmandatBeregning();
	}

	boolean erUtjevningsmandatBeregning() {
		return område.getClass() == Land.class;
	}

	@Override
	public boolean equals(Object other) {
		return other != null && other.getClass() == this.getClass() && id().equals(((MandatBeregningArgumenter) other).id());
	}

	String id() {
		return "" + this.område.getValgType() + "-" + this.område.getNr() + "-" + this.opptaltBeregning;
	}

	@Override
	public int hashCode() {
		return id().hashCode();
	}

	// MSI des 2016: NB! Viktig sortering for å få gjort fylkesberegningene før landsberegningene (mao: distriktsmandatene før utjevningsmandatene)!!
	@Override
	@java.lang.SuppressWarnings("squid:S2676")
	public int compareTo(Object o) {
		return -id().compareTo(((MandatBeregningArgumenter) o).id());
	}

	int getAntallMandaterSTValg(Område område) {
	    //Som følge av regionsreformen 2019 oppstår det situasjoner hvor man spør om fylker som ikke finnes når man skal sammenligne med ekvivalent valg. Da returnerer vi 0.
		return mandaterPrFylkeST.getOrDefault(område.getNr(), 0);
	}

}
