package com.haru.tetoru.sample.frame;

import static com.haru.tetoru.parts.Block.$;
import static com.haru.tetoru.parts.Block.I;
import static com.haru.tetoru.parts.Block.J;
import static com.haru.tetoru.parts.Block.L;
import static com.haru.tetoru.parts.Block.O;
import static com.haru.tetoru.parts.Block.S;
import static com.haru.tetoru.parts.Block.T;
import static com.haru.tetoru.parts.Block.Z;
import static com.haru.tetoru.parts.Block.D;
import static com.haru.tetoru.parts.Block._;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;

import com.haru.tetoru.template.Display;
import com.haru.tetoru.template.Player;

@SuppressWarnings("serial")
public class MyGameFrame extends JFrame implements Display {
	private static final int BLOCK_SIZE = 14;
	private static final int PANEL_HEIGHT = 14*21;
	private static final int FRAME_WIDTH = 400;
	private static final int FRAME_HEIGHT = 400;

	/* テーブル表示用パネル */
	private TablePanel panel;

	/* 開始メッセージ表示パネル */
	private JPanel msgPanel;
	/* 開始要求メッセージ */
	private String msg = "PRESS ENTER TO START";

	/* ネクストテーブル表示用パネル */
	private NextPanel nextPanel;


	protected MyGameFrame() {
		/* フレームの設定 */
		setTitle("テトル");
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	/* close operation */

		/* テーブル表示用パネルの設定 */
		panel = new TablePanel();

		/* ネクストテーブル表示用パネル */
		nextPanel = new NextPanel();
		
		/* メッセージ出力パネル	*/
		msgPanel = new JPanel() {
			/* インスタンス初期化子 */
			{
				setBackground(Color.CYAN);
			}

			/* msgを表示 */
			public void paint(Graphics g) {
				super.paint(g);
				g.drawString(msg, 50, 20);
			}
		};


		/**************************************************************************/
		/* サイズ設定															  */
		/**************************************************************************/
		/* TODO:サイズ設定はフレームのみとし、他はすべてレイアウトの設定により行う */
		setSize(new Dimension(FRAME_WIDTH , FRAME_HEIGHT));
		panel.setPreferredSize(new Dimension(12*14, PANEL_HEIGHT));
		nextPanel.setPreferredSize(new Dimension(5*14,PANEL_HEIGHT));
		msgPanel.setPreferredSize(new Dimension(100,30)); /* xはなんでもいい */

		/**************************************************************************/
		/* コンポーネントの配置													  */
		/**************************************************************************/
		/* コンテンツペイン取得 */
		Container container = this.getContentPane();
		SpringLayout layout = new SpringLayout();
		container.setLayout(layout);

		/* レイアウト設定 */
		layout.putConstraint(SpringLayout.NORTH, panel, 10, SpringLayout.NORTH, container);
		layout.putConstraint(SpringLayout.WEST, panel, 10, SpringLayout.WEST, container);

		layout.putConstraint(SpringLayout.NORTH, nextPanel, 10, SpringLayout.NORTH, container);
		layout.putConstraint(SpringLayout.WEST, nextPanel, 10, SpringLayout.EAST, panel);

		layout.putConstraint(SpringLayout.NORTH, msgPanel, 100, SpringLayout.NORTH, panel);
		layout.putConstraint(SpringLayout.WEST, msgPanel, 0, SpringLayout.WEST, panel);
		layout.putConstraint(SpringLayout.EAST, msgPanel, 0, SpringLayout.EAST, nextPanel);

		/* コンポーネント追加 */
		container.add(panel);
		container.add(nextPanel);
		container.add(msgPanel);
	}

	/**
	 * テーブルの表示
	 * @see com.haru.tetoru.template.Display#disp(java.lang.String)
	 */
	@Override
	public void disp(String strTable) {
		/* 内部クラスのメソッド呼び出し */
		panel.disp(strTable);
	}


	/**
	 * ネクストの表示
	 * @see com.haru.tetoru.template.Display#dispNext(java.lang.String)
	 */
	@Override
	public void dispNext(String strNextTable) {
		/* 内部クラスのメソッド呼び出し */
		nextPanel.dispNext(strNextTable);
	}


	/**
	 *  ゲーム開始合図待ち
	 * @see com.haru.tetoru.template.Display#waitStartSign(com.haru.tetoru.sample.frame.MyPlayer)
	 */
	@Override
	public boolean waitStartSign(Player player) {
		boolean ret;

		/* 画面にキー入力を促すメッセージ */
		dispStartRequest();

		/* プレイヤーの入力待ち */
		ret = player.waitStartSign();

		/* メッセージを不可視にする */
		msgPanel.setVisible(false);

		return ret;
	}

	/* 画面にメッセージを表示 */
	private void dispStartRequest() {
		msgPanel.setVisible(true);
		msgPanel.repaint();
	}


	/**************************************************************************/
	/* テーブルパネル(内部クラス)											  */
	/**************************************************************************/
	private class TablePanel extends JPanel {
		/* テーブル描画用情報 */
		private String strTable =
			  "900000000009\r\n"
			+ "900000000009\r\n"
			+ "900000000009\r\n"
			+ "900003000009\r\n"
			+ "900033300009\r\n";


		TablePanel() {
			/* 各種設定 */
			setBackground(Color.white);
		}

		/**
		 * テーブルの表示
		 * @param strTable
		 */
		public void disp(String strTable) {
			if ("" == strTable) {
				return;
			}
			
			this.strTable = strTable;
			panel.repaint();
		}

		/**
		 * strTableを解析して描画
		 */
		public void paint(Graphics g) {
			super.paint(g);
			
			/* 1行毎に分解 */
			String[] lines = strTable.split(System.getProperty("line.separator"));
			
			/* 1行毎に描画 */
			int y = 0;
			for (String line : lines) {
				for (int idx = 0, x = 0; idx < line.length(); idx++, x += BLOCK_SIZE) {
					/* １ブロックの種類を取得 */
					char c = line.charAt(idx);
					int type = Integer.parseInt(Character.toString(c));
					/* ブロックの種類毎に色を設定 */
					switch (type) {
					case _ :
						g.setColor(Color.WHITE);
						break;
					case $ :
						g.setColor(Color.GRAY);
						break;
					case I :
						g.setColor(Color.CYAN);
						break;
					case O :
						g.setColor(Color.YELLOW);
						break;
					case T :
						g.setColor(Color.MAGENTA);
						break;
					case S :
						g.setColor(Color.GREEN);
						break;
					case Z :
						g.setColor(Color.RED);
						break;
					case J :
						g.setColor(Color.BLUE);
						break;
					case L :
						g.setColor(Color.ORANGE);
						break;
					case D : /* 削除対象のブロック */
						g.setColor(Color.WHITE);
						break;
					default :
						g.setColor(Color.LIGHT_GRAY);
						break;
					}
					/* ブロック描画 */
					g.fillRect(x + 1, y + 1, BLOCK_SIZE - 1, BLOCK_SIZE - 1);
				}
				y += BLOCK_SIZE;
			}

			/* メッセージを最前面に表示する */
			msgPanel.repaint();
		}

	}


	/**************************************************************************/
	/* ネクストパネル(内部クラス)											  */
	/**************************************************************************/
	private class NextPanel extends JPanel {
		/* ネクストテーブル表示用情報 */
		private String strNextTable = "";

		NextPanel() {
			/* 各種設定 */
			setBackground(Color.white);
		}

		/**
		 * ネクストの表示
		 * @param strNextTable
		 */
		public void dispNext(String strNextTable) {
			if ("" == strNextTable) {
				return;
			}
			this.strNextTable = strNextTable;
			repaint();
		}

		/**
		 * strNextTableを解析して描画
		 */
		public void paint(Graphics g) {
			super.paint(g);

			/* 1行毎に分解 */
			String[] lines = strNextTable.split(System.getProperty("line.separator"));

			/* 1行毎に描画 */
			int y = 0;
			for (String line : lines) {
				for (int idx = 0, x = 0; idx < line.length(); idx++, x += BLOCK_SIZE) {
					/* １ブロックの種類を取得 */
					char c = line.charAt(idx);
					int type = Integer.parseInt(Character.toString(c));
					/* ブロックの種類毎に色を設定 */
					switch (type) {
					case _ :
						g.setColor(Color.WHITE);
						break;
					case $ :
						g.setColor(Color.GRAY);
						break;
					case I :
						g.setColor(Color.CYAN);
						break;
					case O :
						g.setColor(Color.YELLOW);
						break;
					case T :
						g.setColor(Color.MAGENTA);
						break;
					case S :
						g.setColor(Color.GREEN);
						break;
					case Z :
						g.setColor(Color.RED);
						break;
					case J :
						g.setColor(Color.BLUE);
						break;
					case L :
						g.setColor(Color.ORANGE);
						break;
					default :
						g.setColor(Color.LIGHT_GRAY);
						break;
					}
					/* ブロック描画 */
					g.fillRect(x + 1, y + 1, BLOCK_SIZE - 1, BLOCK_SIZE - 1);
				}
				y += BLOCK_SIZE;
			}
		}
	}


}