package com.torn.table;


public class Table {
	private int size;
	private Mark[][] table; /* table[x][y] */
	
	public Table(int size) {
		this.size = size;
		table = new Mark[size][size];
		for (int x = 0; x < size; x ++) {
			for (int y = 0; y < size; y ++) {
				table[x][y] = Mark.EMPTY;
			}
		}
		
	}
	public Table() {
		this(3);
	}
	
	/* サイズ取得 */
	/* TODO:変数名変更 */
	public int size() {
		return size;
	}
	
	public Mark get(int x, int y) {
		if (x < 0 || x >= size || y < 0 || y >= size) {
			return Mark.ERROR;
		}
		
		return table[x][y];
	}
	
	/* 配置 */
	public boolean put(Mark mark, int x, int y) {
		if (x < 0 || x >= size || y < 0 || y >= size) {
			return false;
		}
		if (Mark.EMPTY != table[x][y]) {
			return false;
		}
		table[x][y] = mark;
		return true;
	}
	
	/* 終了判定 */
	public Mark isFinished() {
		Mark checkMark;
		int x, y;
		
		/* 横一列に揃っているか */
		for (x = 0; x < size; x ++) {
			checkMark = null;
			for (y = 0; y < size; y ++) {
				if (null == checkMark && Mark.EMPTY != table[x][y]) {
					checkMark = table[x][y];
				} else if (checkMark != table[x][y]) {
					break;
				}
			}
			if (size == y) {
				return checkMark;
			}
		}
		/* 縦一列に揃っているか */
		for (y = 0; y < size; y ++) {
			checkMark = null;
			for (x = 0; x < size; x ++) {
				if (null == checkMark && Mark.EMPTY != table[x][y]) {
					checkMark = table[x][y];
				} else if (checkMark != table[x][y]) {
					break;
				}
			}
			if (size == x) {
				return checkMark;
			}
		}
		/* 斜めに揃っているか(右下) */
		checkMark = null;
		for (x = 0, y = 0; x < size; x ++, y ++) {
			if (null == checkMark && Mark.EMPTY != table[x][y]) {
				checkMark = table[x][y];
			} else if (checkMark != table[x][y]) {
				break;
			}
		}
		if (size == x) {
			return checkMark;
		}
		/* 斜めに揃っているか(左下) */
		checkMark = null;
		for (x = size-1, y = 0; y < size; x --, y ++) {
			if (null == checkMark && Mark.EMPTY != table[x][y]) {
				checkMark = table[x][y];
			} else if (checkMark != table[x][y]) {
				break;
			}
		}
		if (size == y) {
			return checkMark;
		}
		
		if (isFill()) {
			return Mark.EMPTY;
		}
		
		return null;
	}

	public boolean isFill() {
		for (int x = 0; x < size; x ++) {
			for (int y = 0; y < size; y ++) {
				if (Mark.EMPTY == table[x][y]) {
					return false;
				}
			}
		}
		return true;
	}
}
