package no.valg.valgnatt.backend.mandatberegning.beregning;

import lombok.Getter;
import no.valg.valgnatt.backend.mandatberegning.domene.Kvotient;

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

@Getter
public class UtjevningsmandatResultat {
	private Map<String, String> partiPrFylke;
	private Map<String, Map<String, Kvotient>> kvotienterPrPartiPrFylke;
	private Map<String, Map<String, Integer>> mandatnrPrPartiPrFylke;
	private Map<String, Kvotient> kvotientPrParti = new TreeMap<>();
	private Map<String, Integer> mandatnrPrParti = new TreeMap<>();

	UtjevningsmandatResultat(Map<String, String> partiPrFylke,
							 Map<String, Map<String, Kvotient>> kvotienterPrPartiPrFylke,
							 Map<String, Map<String, Integer>> mandatnrPrPartiPrFylke) {
		this.partiPrFylke = partiPrFylke;
		this.kvotienterPrPartiPrFylke = kvotienterPrPartiPrFylke;
		this.mandatnrPrPartiPrFylke = mandatnrPrPartiPrFylke;
		extractMandatnrPrParti();
		extractKvotientPrParti();
	}

	public Map<String, String> getPartiPrFylke() {
		return partiPrFylke == null ? new TreeMap<>() : partiPrFylke;
	}

	private void extractMandatnrPrParti() {
		mandatnrPrPartiPrFylke.forEach((key, value) -> value.forEach((key2, value2) -> {
			if (!mandatnrPrParti.containsKey(key2) || mandatnrPrParti.get(key2) < value2) {
				mandatnrPrParti.put(key2, value2);
			}
		}));
	}
	
	private void extractKvotientPrParti() {
		kvotienterPrPartiPrFylke.forEach((key, value) -> value.forEach((key2, value2) -> {
			if (mandatnrPrPartiPrFylke.get(key).containsKey(key2) && (!kvotientPrParti.containsKey(key2) || kvotientPrParti.get(key2).getKvotient().compareTo(value2.getKvotient()) > 0)) {
				kvotientPrParti.put(key2, value2);
			}
		}));
	}
}
