package com.gnarwhal.ld46.engine.properties;

import com.gnarwhal.ld46.engine.properties.Properties.*;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class PropertyReader {
	
	private static int lineNum;
	private static String path;
	
	public static Properties readProperties(String path) {
		Properties props = null;
		try {
			File file = new File(path);
			Scanner scanner = new Scanner(file);
			PropertyReader.path = path;
			lineNum = 0;
			props = readBlock(file.getName(), scanner).data;
			scanner.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.exit(-1);
		}
		return props;
	}
	
	private static BlockNode readBlock(String name, Scanner scanner) {
		BlockNode props = new BlockNode();
		props.key = name;
		props.data = new Properties(name);
		while (scanner.hasNextLine()) {
			String line = scanner.nextLine();
			line = line.replaceAll("\\s", "");
			if(line.equals("}"))
				break;
			else if(line.length() < 2 || !line.substring(0, 2).equals("//")){
				String[] pair = line.split(":");
				if (pair.length != 2)
					throw new ImproperFormattingException("Formatting exception on line " + line + " in file '" + path + "!");
				pair[1] = pair[1].replaceAll("\\s", "");
				if (pair[1].equals("{"))
					props.data.add(readBlock(pair[0], scanner));
				else if (pair[1].matches("(\\d+|0x[\\da-f]+)")) {
					IntNode node = new IntNode();
					node.key  = pair[0];
					node.data = Integer.decode(pair[1]);
					props.data.add(node);
				}
				else if (pair[1].matches("(\\d+|0x[\\d0-9]+)(,(\\d+|0x[\\d0-9]+))+")) {
					String[] data = pair[1].split(",");
					int[] ints = new int[data.length];
					for (int i = 0; i < ints.length; ++i)
						ints[i] = Integer.decode(data[i]);
					IntArrayNode node = new IntArrayNode();
					node.key  = pair[0];
					node.data = ints;
					props.data.add(node);
						
				}
				else if (pair[1].matches("\\d+\\.\\d+")) {
					DoubleNode node = new DoubleNode();
					node.key  = pair[0];
					node.data = Double.parseDouble(pair[1]);
					props.data.add(node);
				}
				else if (pair[1].matches("\\d+\\.\\d+(,\\d+\\.\\d+)+")) {
					String[] data = pair[1].split(",");
					double[] doubles = new double[data.length];
					for (int i = 0; i < doubles.length; ++i)
						doubles[i] = Double.parseDouble(data[i]);
					DoubleArrayNode node = new DoubleArrayNode();
					node.key  = pair[0];
					node.data = doubles;
					props.data.add(node);
						
				}
				else {
					StringNode node = new StringNode();
					node.key  = pair[0];
					node.data = pair[1];
					props.data.add(node);
				}
			}
			++lineNum;
		}
		return props;
	}
}
