package org.retroarch.browser;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

public class ConfigFile {
	private HashMap<String, String> map = new HashMap<String, String>();

	public void append(InputStream stream) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(stream));

		String line;
		while ((line = br.readLine()) != null)
			parseLine(line);

		br.close();
	}

	public void open(File file) throws IOException {
		clear();
		append(new FileInputStream(file));
	}
	
	public ConfigFile(File file) throws IOException {
		open(file);
	}
	
	public ConfigFile() {}

	private void parseLine(String line) {
		String[] tokens = line.split("=", 2);
		if (tokens.length < 2)
			return;

		for (int i = 0; i < tokens.length; i++)
			tokens[i] = tokens[i].trim();

		String key = tokens[0];
		String value = tokens[1];

		if (value.startsWith("\""))
			value = value.substring(1, value.lastIndexOf('\"'));
		else
			value = value.split(" ")[0];

		if (value.length() > 0)
			map.put(key, value);
	}

	public void clear() {
		map.clear();
	}

	public void write(File file) throws IOException {
		PrintWriter writer = new PrintWriter(file.getAbsolutePath());
		for (Map.Entry<String, String> entry : map.entrySet())
			writer.println(entry.getKey() + " = \"" + entry.getValue() + "\"");
		writer.close();
	}

	public void setString(String key, String value) {
		map.put(key, value);
	}

	public void setBoolean(String key, boolean value) {
		map.put(key, Boolean.toString(value));
	}

	public void setInt(String key, int value) {
		map.put(key, Integer.toString(value));
	}

	public void setDouble(String key, double value) {
		map.put(key, Double.toString(value));
	}
	
	public void setFloat(String key, float value) {
		map.put(key, Float.toString(value));
	}

	public boolean keyExists(String key) {
		return map.containsKey(key);
	}

	public String getString(String key) {
		Object ret = map.get(key);
		if (ret != null)
			return (String) ret;
		else
			return null;
	}

	public int getInt(String key) throws NumberFormatException {
		String str = getString(key);
		if (str != null)
			return Integer.parseInt(str);
		else
			throw new NumberFormatException();
	}

	public double getDouble(String key) throws NumberFormatException {
		String str = getString(key);
		if (str != null)
			return Double.parseDouble(str);
		else
			throw new NumberFormatException();
	}
	
	public float getFloat(String key) throws NumberFormatException {
		String str = getString(key);
		if (str != null)
			return Float.parseFloat(str);
		else
			throw new NumberFormatException();
	}

	public boolean getBoolean(String key) {
		String str = getString(key);
		return Boolean.parseBoolean(str);
	}
}