package no.valg.valgnatt.database.forberedvalg.util;

import java.util.ArrayList;
import java.util.List;

import no.valg.valgnatt.database.EvaAdminSkjema;
import no.valg.valgnatt.database.Konstanter;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class SkjemaFunksjoner {

    private SkjemaFunksjoner() {
        //Hide default constructor
    }

    public static EvaAdminSkjema kopierOsloValgdistriktFraKOTilFY(EvaAdminSkjema fy, EvaAdminSkjema ko) {
        JsonObject jsonObjectKOValg = ko.getJsonObject();
        JsonArray valgdistrikterKOValg = jsonObjectKOValg.get("valgdistrikter").getAsJsonArray();
        for (int i = 0; i < valgdistrikterKOValg.size(); i++) {
            JsonObject valgdistrikt = valgdistrikterKOValg.get(i).getAsJsonObject();
            String valgdistriktnr = valgdistrikt.get("valgdistrikt").getAsString();
            if (valgdistriktnr.equals(Konstanter.OSLO_KNR)) {
                // erstatter "0301"-valgdistrikt med "03"-valgdistrikt
                valgdistrikt.remove("valgdistrikt");
                valgdistrikt.addProperty("valgdistrikt", Konstanter.OSLO_FNR);
                // kopierer over til FY-valget
                fy.getJsonObject().get("valgdistrikter").getAsJsonArray().add(valgdistrikt);
                return fy;
            }
        }
        return null;
    }

    public static EvaAdminSkjema kopierOsloFylkeFraKOValg(EvaAdminSkjema fy, EvaAdminSkjema ko) {
        JsonObject jsonObjectKOValg = ko.getJsonObject();
        JsonArray fylkerKOValg = jsonObjectKOValg.get("fylker").getAsJsonArray();
        for (int i = 0; i < fylkerKOValg.size(); i++) {
            JsonObject fylke = fylkerKOValg.get(i).getAsJsonObject();
            String fylkenr = fylke.get("fylkesnummer").getAsString();
            if (fylkenr.equals(Konstanter.OSLO_FNR)) {
                JsonObject osloKommune = fylke.get("kommuner").getAsJsonArray().get(0).getAsJsonObject();
                osloKommune.remove("valgdistrikt");
                osloKommune.addProperty("valgdistrikt", Konstanter.OSLO_FNR);
                fy.getJsonObject().get("fylker").getAsJsonArray().add(fylke);
                return fy;
            }
        }
        return null;
    }

    public static EvaAdminSkjema korrigerValgdistriktnrForOsloGsk(EvaAdminSkjema gsk) {
        JsonObject gskAsJsonObject = gsk.getJsonObject();
        JsonArray fylker = gskAsJsonObject.getAsJsonArray("fylker");
        for (JsonElement fylke : fylker) {
            JsonObject fylkeAsJsonObject = fylke.getAsJsonObject();
            String fylkesnummer = fylkeAsJsonObject.get("fylkesnummer").getAsString();
            if (fylkesnummer.equals(Konstanter.OSLO_FNR)) {
                JsonObject osloKommune = fylkeAsJsonObject.get("kommuner").getAsJsonArray().get(0).getAsJsonObject();
                osloKommune.remove("valgdistrikt");
                osloKommune.addProperty("valgdistrikt", Konstanter.OSLO_FNR);
            }
        }
        return new EvaAdminSkjema(gskAsJsonObject.toString());
    }

    public static EvaAdminSkjema korrigerValgdistriktnrForOsloGvpk(EvaAdminSkjema gvpk) {
        JsonObject gvpkAsJsonObject = gvpk.getJsonObject();
        JsonArray valgdistrikter = gvpkAsJsonObject.getAsJsonArray("valgdistrikter");
        for (JsonElement valgdistrikt : valgdistrikter) {
            JsonObject valgdistriktAsJsonObject = valgdistrikt.getAsJsonObject();
            String valgdistriktString = valgdistriktAsJsonObject.get("valgdistrikt").getAsString();
            if (valgdistriktString.equals(Konstanter.OSLO_KNR)) {
                valgdistriktAsJsonObject.remove("valgdistrikt");
                valgdistriktAsJsonObject.addProperty("valgdistrikt", Konstanter.OSLO_FNR);
            }
        }
        return new EvaAdminSkjema(gvpkAsJsonObject.toString());
    }

    public static List<JsonObjektSti> byggListeAvTrestruktur(EvaAdminSkjema skjema, String nivå1, String nivå2) {
        return byggListeAvTrestruktur(skjema, nivå1, nivå2, null);
    }

    /**
     * MSI sep 2016: Jeg jobbet litt med å generalisere dette, til å håndtere N nivåer. Det ble
     * altfor komplisert (for meg), og siden jeg aldri trenger mer enn 2 eller 3 nivåer så lagde
     * jeg en slik enkel løsning. Men dette grepet reduserer jeg endel duplisert kode i
     * ForberedValg
     */
    public static List<JsonObjektSti> byggListeAvTrestruktur(EvaAdminSkjema skjema, String nivå1, String nivå2, String nivå3) {

        List<JsonObjektSti> stiListe = new ArrayList<>();
        JsonArray arr1 = skjema.getJsonObject().get(nivå1).getAsJsonArray();
        for (int i = 0; i < arr1.size(); i++) {
            JsonObject jo1 = arr1.get(i).getAsJsonObject();
            JsonArray arr2 = jo1.get(nivå2).getAsJsonArray();
            for (int j = 0; j < arr2.size(); j++) {
                JsonObject jo2 = arr2.get(j).getAsJsonObject();
                if (nivå3 == null || jo2.get(nivå3) == null) {
                    stiListe.add(new JsonObjektSti(jo1, jo2));
                } else {
                    JsonArray arr3 = jo2.get(nivå3).getAsJsonArray();
                    for (int k = 0; k < arr3.size(); k++) {
                        JsonObject jo3 = arr3.get(k).getAsJsonObject();
                        stiListe.add(new JsonObjektSti(jo1, jo2, jo3));
                    }
                }
            }
        }

        return stiListe;
    }

}
