package framework.gameMain;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public abstract class AbstractManager {

	private DataBox data = new DataBox();
	private BufferedReader reader = null;
	private String seekFilename;
	
	protected void addSeekFile(String filename) {
		seekFilename = filename;
	}
	
	protected void seek(String d) {
		File file = new File(d);
		//ディレクトリのとき
		if(file.isDirectory()) {
			openDirectory(file.listFiles());
		}
		//ファイルのとき
		else {
			openFile(file);
		}
	}
	
	//ディレクトリをあける
	private void openDirectory(File[] fileList) {
		File file;
		for(int i = 0; i < fileList.length; i++) {
			file = fileList[i];
			//ディレクトリのとき
			if(file.isDirectory()) {
				openDirectory(file.listFiles());
			}
			//ファイルのとき
			else {
				openFile(file);
			}
		}
	}
	//ファイルをあける
	private void openFile(File file) {
		if(file.getName().equals(seekFilename)) {
			data.removeAll();
			
			try {
				reader = new BufferedReader(new FileReader(file));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			
			findFile(file);
			
			try {
				reader.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * setBufferedReader(File file)をすること
	 */
	protected String readLine() {
		if(reader != null) {
			try {
				return reader.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	protected void setTags(ArrayList<String> tags) {
		for(int i = 0; i < tags.size(); i++) {
			data.setTag(tags.get(i));
		}
	}
	protected void setTag(String tag) {
		data.setTag(tag);
	}
	
	protected void findFile(File file) {
		String str;
		while(true) {
			str = readLine();
			if(str == null) {
				break;
			}
			String[] strings = str.split(":");
			if(strings.length >= 2) {
				data.setData(strings[0], strings[1]);
			}
		}
		create();
	}
	
	protected String getData(String tag) {
		return data.getData(tag);
	}
	
	public boolean hasData(String tag){
		if(data.getData(tag) == null)
			return false;
		else if(data.getData(tag) == "")
			return false;
		else return true;
	}
	
	abstract protected void create();
	
	private class DataBox {
		private ArrayList<Data> dataList = new ArrayList<Data>();
		
		public void setTag(String tag) {
			dataList.add(new Data(tag));
		}
		
		public void setData(String tag, String data) {
			for(int i = 0; i < dataList.size(); i++) {
				if(dataList.get(i).getTag().equals(tag)) {
					dataList.get(i).addData(data);
				}
			}
		}
		
		/**
		 * このkeyのデータを返す。
		 * @param key タグ名
		 * @return
		 */
		public String getData(String tag) {
			for(int i = 0; i < dataList.size(); i++) {
				if(dataList.get(i).getTag().equals(tag)) {
					if(dataList.get(i).getData().size() > 0) {
						return dataList.get(i).getData().get(0);
					}
					else {
						break;
					}
				}
			}
			return "";
		}
		
		public ArrayList<String> getDatas(String tag) {
			for(int i = 0; i < dataList.size(); i++) {
				if(dataList.get(i).getTag().equals(tag)) {
					return dataList.get(i).getData();
				}
			}
			return new ArrayList<String>();
		}
		
		/**
		 * このタグが存在するか。
		 * @param tag
		 * @return
		 */
		public boolean isExist(String tag) {
			for(int i = 0; i < dataList.size(); i++) {
				if(dataList.get(i).getTag().equals(tag)) {
					return true;
				}
			}
			return false;
		}
		
		public void removeAll() {
			for(int i = 0; i < dataList.size(); i++) {
				dataList.get(i).removeData();
			}
		}
	}
	
	private class Data {
		private String tag;
		private ArrayList<String> data = new ArrayList<String>();
		
		public Data(String tag) {
			this.tag = tag;
		}
		
		public String getTag() {
			return tag;
		}
		
		public void addData(String d) {
			data.add(d);
		}
		
		public ArrayList<String> getData() {
			return data;
		}
		
		public void removeData() {
			data = new ArrayList<String>();
		}
	}
}
