package no.valg.valgnatt.database;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;

import no.valg.valgnatt.database.domene.SkjemaType;
import no.valg.valgnatt.database.domene.ValgType;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class EvaAdminSkjema {

    private static final Logger LOG = LogManager.getLogger(EvaAdminSkjema.class);

    public static final String TIDSPUNKT = "tidspunkt";
    public static final String SKJEMATYPE = "skjematype";
    public static final String VALGÅR = "valgår";
    public static final String VALGTYPE = "valgtype";
    public static final String KOMMUNE = "kommune";
    public static final String STEMMEKRETS = "stemmekrets";

    private String data;
    private JsonObject jsonObject;
    private String tidspunkt;
    private String skjematype = "ukjent"; // default skjematype
    private Integer valgår;
    private ValgType valgtype;
    private String kommnr;
    private String kretsnr;

    public EvaAdminSkjema(File file) throws IOException {
        this(new String(Files.readAllBytes(file.toPath()), Charset.forName("UTF-8")));
    }

    public EvaAdminSkjema(String data) {

        this.data = data;
        JsonParser parser = new JsonParser();
        jsonObject = parser.parse(data).getAsJsonObject();
        if (jsonObject.has(TIDSPUNKT)) {
            tidspunkt = jsonObject.get(TIDSPUNKT).getAsString();
        }
        if (jsonObject.has(SKJEMATYPE)) {
            skjematype = jsonObject.get(SKJEMATYPE).getAsString().split(" ")[0];
        }
        if (jsonObject.has(VALGTYPE)) {
            valgtype = ValgType.valueOf(jsonObject.get(VALGTYPE).getAsString());
        }
        if (jsonObject.has(VALGÅR)) {
            valgår = jsonObject.get(VALGÅR).getAsInt();
        }
        if (erStemmeskjema()) {
            try {
                kommnr = jsonObject.get(KOMMUNE).getAsString().split(" ")[0];
                kretsnr = jsonObject.get(STEMMEKRETS).getAsString().split(" ")[0];
            } catch (Exception e) {
                LOG.warn("Problem oppstod ved parsing av kommnr/kretsnr: " + e);
            }
        }
    }

    public JsonObject getJsonObject() {
        return jsonObject;
    }

    public String getTidspunkt() {
        return tidspunkt;
    }

    public String getSkjematype() {
        return skjematype;
    }

    public ValgType getValgtype() {
        return valgtype;
    }

    public Integer getValgår() {
        return valgår;
    }

    public boolean erGrunnlagsskjema() {
        return skjematype.startsWith(SkjemaType.GRUNNLAG_STEMMEKRETSER.kode) || skjematype.startsWith(SkjemaType.GRUNNLAG_VALGDISTRIKTER_PARTIER_KANDIDATER.kode);
    }

    public boolean erStemmekretsSkjema() {
        return skjematype.startsWith(SkjemaType.GRUNNLAG_STEMMEKRETSER.kode);
    }

    public final boolean erStemmeskjema() { // Denne er final fordi den brukes i konstruktøren
        return skjematype.startsWith(SkjemaType.TELLING.kode) || skjematype.startsWith(SkjemaType.OPPGJØR.kode);
    }

    public void skrivTilFil() throws IOException {
        skrivTilFil(System.getProperty("jboss.server.data.dir"));
    }
    
    public void skrivTilFil(String katalog) throws IOException {
        try (FileWriter fw = new FileWriter(katalog + File.separator + getFilnavn())) {
            fw.write(data);
            fw.close();
        }
    }

    public String getFilnavn() {
        if (erStemmeskjema()) {
            return getSkjematype() + "-" + valgtype + "-" + valgår + "-" + kommnr + "-" + kretsnr + "-" + getTidspunkt() + ".json";
        } else {
            return getSkjematype() + "-" + valgtype + "-" + valgår + "-" + getTidspunkt() + ".json";
        }
    }
}
