package com.kit.game;

import org.apache.http.HttpVersion;
import org.apache.http.client.fluent.Request;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Wrapper for applet configuration data.
 * This data is the same as the data used by
 * the official RuneScape desktop client.
 *
 */
public final class AppletConfiguration {
    private static final String CONFIG_URL = "http://oldschool.runescape.com/jav_config.ws";
    private static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_" +
            "9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36";

    private final Map<String, String> parameters;
    private String documentBase;
    private String archiveName;
    private String mainClass;

    public AppletConfiguration() {
        parameters = new HashMap<>();
    }

    public String getDocumentBase() {
        return documentBase;
    }

    public void setDocumentBase(String documentBase) {
        this.documentBase = documentBase;
    }

    public String getArchiveName() {
        return archiveName;
    }

    public void setArchiveName(String archiveName) {
        this.archiveName = archiveName;
    }

    public String getMainClass() {
        return mainClass;
    }

    public void setMainClass(String mainClass) {
        this.mainClass = mainClass;
    }

    public Map<String, String> getParameters() {
        return parameters;
    }

    /**
     * Loads the configuration from the RuneScape website.
     */
    public void load() throws IOException {
        parameters.clear();
        String text = normalize(Request.Get(CONFIG_URL)
                .version(HttpVersion.HTTP_1_1)
                .userAgent(USER_AGENT)
                .useExpectContinue()
                .execute()
                .returnContent().toString());
        String[] lines = text.split("\n");
        for (String line : lines) {
            extractKVPairInto(parameters, line);
        }

        String mainClass = parameters.get("initial_class");
        setMainClass(mainClass.replace(".class", ""));
        setDocumentBase(parameters.get("codebase"));
        setArchiveName(parameters.get("initial_jar"));
    }

    /**
     * Removes some param type identifiers from a string.
     *
     * @param string string to normalize
     * @return normalized string.
     */
    private static String normalize(String string) {
        return string.replaceAll("param=", "")
                .replaceAll("msg=", "");
    }

    /**
     * Extracts a Key-Value pair from a string
     * and puts it into the given map.
     *
     * @param into  Map to put the pair into
     * @param input String to extract the pair from
     */
    private static void extractKVPairInto(Map<String, String> into, String input) {
        int len = input.length();
        int idx = input.indexOf('=');
        into.put(input.substring(0, idx),
                input.substring(idx + 1, len));
    }
}