package no.valg.valgnatt.common;

import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JsonTabellKollapser {

	private static final int NØKKEL_OVERHEAD = 5; // Ekstra tegn som omgir en objektNøkkel: '"objektNøkkel": {'
    private static final int ANFØRSELSTEGN = 2; // Anførselstegn som omgit en objektnøkkel: '"objektNøkkel"'

	private JsonTabellKollapser() {
	}

    // Kollaps = fjerne linjeskift og indentering innenfor det enkelte objekt i en tabell, alle data blir bevart.
    public static String kollapsTabell(String formatertJson, String tabellNøkkel, String førsteNøkkelITabellObjekt) {
        int tabellStartPos = finnTabellStartPosisjon(formatertJson, tabellNøkkel, 0);
        while (tabellStartPos > tabellNøkkel.length() + (NØKKEL_OVERHEAD - 1)) {
            int tabellSluttPos = formatertJson.indexOf(']', tabellStartPos);
            int objektStartPos = finnTabellObjektStartPosisjon(formatertJson, førsteNøkkelITabellObjekt, tabellStartPos);
            int objektSluttPos = tabellStartPos; // det "forrige" objektet er ved tabellens begynnelse
            while (objektStartPos > objektSluttPos + 1 && objektStartPos < tabellSluttPos) {
                int lengdeFørKollaps = formatertJson.length();
                objektSluttPos = JsonUtil.finnObjektSluttPosisjon(formatertJson, objektStartPos, "representanter");
                formatertJson = JsonUtil.fjernFormatering(formatertJson, objektStartPos, objektSluttPos);
                int antallTegnEndret = formatertJson.length() - lengdeFørKollaps;
                objektSluttPos += antallTegnEndret;
                tabellSluttPos += antallTegnEndret;
                objektStartPos = finnTabellObjektStartPosisjon(formatertJson, førsteNøkkelITabellObjekt, objektSluttPos);
            }
            tabellStartPos = finnTabellStartPosisjon(formatertJson, tabellNøkkel, tabellSluttPos + 1);
        }
        return formatertJson;
    }

	// Eks på objektNøkkel:   '..... "stemmer": {....' - koden nedenfor vil gi posisjonen rett *etter* krøllparentes
	private static int finnTabellStartPosisjon(String json, String tabellNøkkel, int fraIndeks) {
		return json.indexOf("\"" + tabellNøkkel + "\":", fraIndeks) + tabellNøkkel.length() + NØKKEL_OVERHEAD;
	}

	// Eks på objektNøkkel:   '..... "stemmer": {....' - koden nedenfor vil gi posisjonen rett *etter* krøllparentes
	private static int finnTabellObjektStartPosisjon(String json, String førsteNøkkelITabellObjekt, int fraIndeks) {
		return indexOf("\\{\n\\s+\"" + førsteNøkkelITabellObjekt + "\"", json.substring(fraIndeks)) + fraIndeks + 1;
	}

	private static int indexOf(String regex, String s) {
		Matcher matcher = Pattern.compile(regex).matcher(s);
		return matcher.find() ? matcher.start() : -1;
	}

    public static String kollapsTabellUtenObjekter(String formatertJson, String tabellNøkkel) {
        int tabellStartPos = formatertJson.indexOf("\"" + tabellNøkkel + "\": [") + tabellNøkkel.length() + ANFØRSELSTEGN;
        int tabellSluttPos = formatertJson.indexOf(']', tabellStartPos) + 1;
        if (tabellNøkkel.length() < JsonObjektKollapser.MIN_NØKKEL_LENGDE) {
            String ekstraMellomrom = String.join("", Collections.nCopies(JsonObjektKollapser.MIN_NØKKEL_LENGDE - tabellNøkkel.length(), " "));
            formatertJson = formatertJson.substring(0, tabellStartPos) + ekstraMellomrom + formatertJson.substring(tabellStartPos);
        }
        return JsonUtil.fjernFormatering(formatertJson, tabellStartPos, tabellSluttPos);
    }
}
