package no.valg.valgnatt.frontend;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

class ToppnivåRapport {
    private static final String OPPTELLINGER = "\"forelopigFhs\": null, \"forelopigVts\": null, \"forelopig\": null, \"endelig\": null, \"oppgjor\": null";
    private Map<String, String> cache = new ConcurrentHashMap<>();

    // Metoden støtter at toppnivået endrer seg - samtidig med høy ytelse
    String getToppnivå(RapportCache rapportCache) {
        String nøkkel = rapportCache.getValgårString();
        String resultat = cache.get(nøkkel);
        if (resultat == null) {
            StringBuilder sb = new StringBuilder();
            sb.append("{\n");
            sb.append(" \"_sublinks\": {\n");
            for (int valgår : rapportCache.getValgårSet()) {
                sb.append(valgtyper("" + valgår, valgår, rapportCache.getRapporterFraIdCache(valgår).keySet()));
            }
            if (sb.charAt(sb.length() - 2) == ',') {
                sb.replace(sb.length() - 2, sb.length() - 1, "");
            }
            sb.append(" },\n");
            sb.append(" \"_links\": {\n");
            sb.append("     \"self\": { \"nr\": null, \"href\": \"/\", \"hrefNavn\": \"/\", \"navn\": \"toppnivå\", " + OPPTELLINGER + "},\n");
            sb.append("     \"related\": [\n");
            for (int valgår : rapportCache.getValgårSet()) {
                sb.append("         { \"nr\": null, \"href\": \"/" + valgår + "\", \"hrefNavn\": \"/" + valgår + "\", \"navn\": \"" + valgår + "\", " + OPPTELLINGER + ", \"rapportGenerert\": null, \"harUnderordnet\": true },\n");
            }
            if (sb.charAt(sb.length() - 2) == ',') {
                sb.replace(sb.length() - 2, sb.length() - 1, "");
            }
            sb.append("     ],\n");
            sb.append("     \"up\": null\n");
            sb.append(" }\n");
            sb.append("}");
            resultat = sb.toString();
            cache.put(nøkkel, resultat);
        }
        return resultat;
    }

    private String valgtyper(String objektNavn, int valgår, Set<String> cacheNøkler) {
        StringBuilder sb = new StringBuilder();
        sb.append("     \"" + objektNavn + "\": [\n");
        for (String cacheNøkkel : cacheNøkler) {
            if ("totalrapport".equals(cacheNøkkel)) {
                continue;
            }
            String href = "/" + valgår + "/" + cacheNøkkel;
            sb.append("         { \"nr\": null, \"href\": \"" + href + "\", \"hrefNavn\": \"" + href + "\", \"navn\": \"" + cacheNøkkel + "\", " + OPPTELLINGER + ", \"rapportGenerert\": null, \"harUnderordnet\": true },\n");
        }
        if (sb.charAt(sb.length() - 2) == ',') {
            sb.replace(sb.length() - 2, sb.length() - 1, "");
        }
        sb.append("     ],\n");
        return sb.toString();

    }

    // Metoden støtter at toppnivået endrer seg - samtidig med høy ytelse
    String getToppnivåValgår(int valgår, Set<String> cacheNøkler) {
        String nøkkel = valgår + String.join("" + cacheNøkler);
        String resultat = cache.get(nøkkel);
        if (resultat == null) {
            StringBuilder sb = new StringBuilder();
            sb.append("{\n");
            sb.append(" \"_links\": {\n");
            sb.append("     \"self\": { \"nr\": null, \"href\": \"/" + valgår + "\", \"hrefNavn\": \"/" + valgår + "\", \"navn\": \"" + valgår + "\", " + OPPTELLINGER + "},\n");
            sb.append(valgtyper("related", valgår, cacheNøkler));
            sb.append("     \"up\": { \"nr\": null, \"href\": \"/\", \"hrefNavn\": \"/\", \"navn\": \"toppnivå\", " + OPPTELLINGER + "}\n");
            sb.append(" }\n");
            sb.append("}");
            resultat = sb.toString();
            cache.put(nøkkel, resultat);
        }
        return resultat;
    }
}
