package no.valg.valgnatt.database.geografi;

import no.valg.valgnatt.database.Konstanter;
import no.valg.valgnatt.database.domene.ValgType;
import no.valg.valgnatt.database.hibernate.Stemmekrets;
import no.valg.valgnatt.database.hibernate.Valgdistrikt;

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

public class Fylke extends LandInndeling {
	// Vi har en liste som oversetter fra fylkesnummer til fylkesnavn. Dette
	// kunne kanskje vært bedre å ha i databasen (som en tabell som også var
	// årsversjonert). Inntil videre gjør vi det enkelt ved å ha map'et liggende
	// her.
	private static Map<String, String> fylkenavnMap = new TreeMap<>();

	static {
		fylkenavnMap.put("01", "Østfold");
		fylkenavnMap.put("02", "Akershus");
		fylkenavnMap.put("03", "Oslo");
		fylkenavnMap.put("04", "Hedmark");
		fylkenavnMap.put("05", "Oppland");
		fylkenavnMap.put("06", "Buskerud");
		fylkenavnMap.put("07", "Vestfold");
		fylkenavnMap.put("08", "Telemark");
		fylkenavnMap.put("09", "Aust-Agder");
		fylkenavnMap.put("10", "Vest-Agder");
		fylkenavnMap.put("11", "Rogaland");
		fylkenavnMap.put("12", "Hordaland");
		fylkenavnMap.put("14", "Sogn og Fjordane");
		fylkenavnMap.put("15", "Møre og Romsdal");
		fylkenavnMap.put("16", "Sør-Trøndelag");
		fylkenavnMap.put("17", "Nord-Trøndelag");
		fylkenavnMap.put("18", "Nordland");
		fylkenavnMap.put("19", "Troms Romsa");
		fylkenavnMap.put("20", "Finnmark Finnmárku");
		fylkenavnMap.put("30", "Viken");
		fylkenavnMap.put("34", "Innlandet");
		fylkenavnMap.put("38", "Vestfold og Telemark");
		fylkenavnMap.put("42", "Agder");
		fylkenavnMap.put("46", "Vestland");
		fylkenavnMap.put("50", "Trøndelag");
		fylkenavnMap.put("54", "Troms og Finnmark");
	}

	private Valgdistrikt valgdistrikt;

	@Override
	public Valgdistrikt getValgdistrikt() {
		return valgdistrikt; // Har bare innhold i ST/FY-valg
	}

	public void setValgdistrikt(Valgdistrikt valgdistrikt) {
		this.valgdistrikt = valgdistrikt;
	}

	@Override
	public String getNavn() {
		if (super.getNavn() != null) {
			return super.getNavn();
		} else {
			// MSI nov 2015: Vi mangler navn for fylker i KO-valg og gamle valg (før 2007). Den mest korrekte måten å håndtere dette på ville nok være å opprette
			// en kodeverkstabell for fylkenr og fylkenavn, men i tillegg ta med valgtype + valgår, slik at man kan få forskjellig fylkesstruktur
			// ettersom årene går.

			// Akkurat nå virker det litt som overengineering. Jeg velger derfor å lage en enkel mapping her, istedet for å lage tabeller, oppdatere
			// ForberedValg-koden, lage CSV'er  osv, bare for å få en tabell som kun inneholder navn + nr (omtrent som landsdeler/bydeler).
			// Dersom forutsetningene endrer seg, så flytter man denne mappingen ut herfra til databasen. Legg merke til at mappingen ikke sier
			// noe om hvilke fylker som faktisk er med, f.eks. i et prøvevalg - det bestemmes av stemmekretser/valgdistrikter/kommuner.

			// man gjennomføre det å lage en tabell for fylkene/regionene. Men dette kan fortsatt ta noen år, så det har ingen hast.
			return fylkenavnMap.get(getNr());
		}
	}

	@Override
	public int getAntallMandater() {
		return super.getAntallMandater() + (getValgType() == ValgType.ST ? Konstanter.UTJEVNINGSMANDATER_PR_FYLKE : 0);
	}

	// Strata er ikke en del av den geografiske modell, dette er bare en datastruktur vi
	// bygger for å kunne regne prognose på dette området.
	public Strata lagStrata(String id, int minKretser, String... kommunenumre) {
		Strata strata = new Strata();
		strata.setLand(this.getLand());
		strata.setNr(id);
		strata.setMinimumKretserForPrognose(minKretser);
		for (String nr : kommunenumre) {
			Kommune kommune = getKommune(nr);
			if (kommune == null) {
				continue;
			}
			for (Stemmekrets s : kommune.getStemmekretser().values()) {
				strata.add(s, null, kommune.getNavn(), kommune.getValgdistrikt(), kommune.isSisteSammenlignbar(), kommune.isNestSisteSammenlignbar());
			}
		}
		return strata;
	}


}
