package no.valg.valgnatt.database.geografi;

import no.valg.valgnatt.database.hibernate.Stemmekrets;
import no.valg.valgnatt.database.hibernate.Valgdistrikt;

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

public abstract class LandInndeling extends Område {
    private String nr;
    private String navn;
    private Map<String, Kommune> kommuner = new TreeMap<>();

    @Override
    public String getNr() {
        return nr;
    }

    @Override
    public String getNavn() {
        return navn;
    }

    @Override
    public Map<String, Stemmekrets> getStemmekretser() {
        Map<String, Stemmekrets> map = new TreeMap<>();
        for (Kommune kommune : kommuner.values()) {
            for (Stemmekrets stemmekrets : kommune.getStemmekretser().values()) {
                map.put(kommune.getNr() + "-" + stemmekrets.getId().getKretsnr(), stemmekrets);
            }
        }
        return map;
    }

    public void setNr(String nr) {
        this.nr = nr;
    }

    public void setNavn(String navn) {
        this.navn = navn;
    }

    public Kommune getKommune(String kommnr) {
        return kommuner.get(kommnr);
    }

    public Map<String, Kommune> getKommuner() {
        return kommuner;
    }

    public void add(Stemmekrets stemmekrets, Map<String, Bydel> bydeler, String kommNavn, Valgdistrikt valgdistrikt, boolean sisteSammenlignbar, boolean nestSisteSammenlignbar) {
        String kommnr = stemmekrets.getId().getKommnr();
        Kommune kommune = stemmekrets.getLand().getKommune(kommnr);
        if (kommune == null) { // Kommunen finnes ikke i landsgeografien (enten fylke/samevalgdistrikt)
            kommune = new Kommune(kommnr, kommNavn, sisteSammenlignbar, nestSisteSammenlignbar);
            kommune.setLand(stemmekrets.getLand());
            if (valgdistrikt != null) {
                kommune.setValgdistrikt(valgdistrikt);
                valgdistrikt.putKommune(kommune);
            }
            if (this instanceof Fylke) {
                kommune.setFylke((Fylke) this);
            }
            if (this instanceof Samevalgdistrikt) {
                kommune.setSamevalgdistrikt((Samevalgdistrikt) this);
            }
        }
        // legger inn kommunen i landsinndelingen (spesialtilfelle landsdel: gjenbruker kommuneobjekt fra fylke)
        kommuner.put(kommnr, kommune);
        stemmekrets.setKommune(kommune);
        kommune.add(stemmekrets, bydeler);
    }

    @Override
    public Område getOverordnetOmråde() {
        return getLand();
    }

    @Override
    public Område[] getUnderordnedeRapportOmråder() {
        return kommuner.values().toArray(new Område[]{});
    }


}
