package no.valg.valgnatt.common;

import java.util.Collections;

public class JsonObjektKollapser {

	static final int MIN_NØKKEL_LENGDE = 10;
	private static final int NØKKEL_OVERHEAD = 5; // Ekstra tegn som omgir en objektNøkkel: '"objektNøkkel": {'

	private JsonObjektKollapser() {
	}

	public static String kollapsObjekt(String formatertJson, String objektNøkkel, boolean kollapsEttObjekt) {
		return kollapsObjekt(formatertJson, objektNøkkel, kollapsEttObjekt, null);
	}

	// Kollaps = fjerne linjeskift og indentering, alle data blir bevart. Lager nøklene like lange (10 tegn).
	public static String kollapsObjekt(String formatertJson, String objektNøkkel, boolean kollapsEttObjekt, String tabellSomUnntas) {
		int objektStartPos = finnObjektStartPosisjon(formatertJson, objektNøkkel, 0);
		while (objektStartPos > objektNøkkel.length() + (NØKKEL_OVERHEAD - 1)) {
			int lengdeFørKollaps = formatertJson.length();
			int objektSluttPos = JsonUtil.finnObjektSluttPosisjon(formatertJson, objektStartPos, tabellSomUnntas);
			formatertJson = JsonUtil.fjernFormatering(formatertJson, objektStartPos, objektSluttPos);
			if (objektNøkkel.length() < MIN_NØKKEL_LENGDE) {
				formatertJson = leggTilMellomromEtterNøkkel(formatertJson, objektNøkkel, objektStartPos);
			}
			if (kollapsEttObjekt) {
				break;
			}
			int antallTegnEndret = formatertJson.length() - lengdeFørKollaps;
			objektSluttPos += antallTegnEndret;

			objektStartPos = finnObjektStartPosisjon(formatertJson, objektNøkkel, objektSluttPos);
		}
		return formatertJson;
	}

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

	// Sørger for at en objektNøkkel ('..... "stemmer": {....'), alltid vil oppta minimum 10 tegn, altså ('..... "stemmer"   : {....')
	private static String leggTilMellomromEtterNøkkel(String formatertJson, String nøkkel, int objektStartPos) {
		int startPos = objektStartPos - nøkkel.length() - NØKKEL_OVERHEAD;
		int sluttPos = objektStartPos - 1;
		String ekstraMellomrom = String.join("", Collections.nCopies(MIN_NØKKEL_LENGDE - nøkkel.length(), " "));
		return formatertJson.substring(0, startPos) + "\"" + nøkkel + "\"" + ekstraMellomrom + ": " + formatertJson.substring(sluttPos);
	}


}
