// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core.modules.i18n.parser;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.io.BufferedReader;
import javax.annotation.Nonnull;

public class LangFileParser
{
    @Nonnull
    private static String literal(@Nonnull final String value) {
        final String literal = value.trim();
        if (literal.length() > 1 && literal.charAt(0) == '\"' && literal.charAt(literal.length() - 1) == '\"') {
            return literal.substring(1, literal.length() - 1);
        }
        return literal;
    }
    
    @Nonnull
    private static String escape(@Nonnull final StringBuilder builder) {
        return builder.toString().replace("\\n", "\n").replace("\\t", "\t");
    }
    
    @Nonnull
    public static Map<String, String> parse(@Nonnull final BufferedReader reader) throws IOException, TranslationParseException {
        final Map<String, String> translations = new LinkedHashMap<String, String>();
        String currKey = null;
        StringBuilder currValue = null;
        int lineNumber = 0;
        String line;
        while ((line = reader.readLine()) != null) {
            ++lineNumber;
            line = line.trim();
            if (!line.isEmpty()) {
                if (line.charAt(0) == '#') {
                    continue;
                }
                if (currKey == null) {
                    final int eqIdx = line.indexOf(61);
                    if (eqIdx < 0) {
                        throw new TranslationParseException("Missing '=' in key-value line", lineNumber, line);
                    }
                    final String key = line.substring(0, eqIdx).trim();
                    if (key.isEmpty()) {
                        throw new TranslationParseException("Empty key in line", lineNumber, line);
                    }
                    final String value = line.substring(eqIdx + 1).trim();
                    if (value.isEmpty()) {
                        throw new TranslationParseException("Empty value in line", lineNumber, line);
                    }
                    currKey = key;
                    currValue = new StringBuilder();
                    final boolean isMultiline = value.charAt(value.length() - 1) == '\\';
                    if (isMultiline) {
                        currValue.append(value, 0, value.length() - 1);
                    }
                    else {
                        currValue.append(literal(value));
                        final String existing = translations.put(currKey, escape(currValue));
                        if (existing != null) {
                            throw new TranslationParseException("Duplicate key in line", lineNumber, line);
                        }
                        currKey = null;
                        currValue = null;
                    }
                }
                else {
                    final boolean isMultiline2 = line.charAt(line.length() - 1) == '\\';
                    final String valueLine = isMultiline2 ? line.substring(0, line.length() - 1) : line;
                    currValue.append(valueLine.trim());
                    if (isMultiline2) {
                        continue;
                    }
                    final String existing2 = translations.put(currKey, escape(currValue));
                    if (existing2 != null) {
                        throw new TranslationParseException("Duplicate key in line", lineNumber, line);
                    }
                    currKey = null;
                    currValue = null;
                }
            }
        }
        if (currKey != null) {
            throw new TranslationParseException("Unexpected end of key-value line", lineNumber, currKey);
        }
        return translations;
    }
    
    public static class TranslationParseException extends Exception
    {
        TranslationParseException(final String message, final int lineNumber, final String lineContent) {
            super(message + " (at line " + lineNumber + "): " + lineContent);
        }
    }
}
