package Darts;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

class DartBoard extends JPanel implements MouseListener
	{
	//
	// Constants
	//
	private static final String BOARD_PATH = "images/board.jpg";
	private static final String DART_PATH = "images/dart.png";
	private static final int BOARD_CENTER_X = 639;
	private static final int BOARD_CENTER_Y = 637;
	private static final int DART_CENTER_X = 253;
	private static final int DART_CENTER_Y = 54;
	private static final double DART_SCALE = 0.8;

	//
	// Member Data
	//
	public String playersName = "Name";
	
	private DartBoardFrame  myFrame;
	private ImageIcon 			boardImage;
	private ImageIcon 			dartImage;


	private int width = 0;
	private int height = 0;
	private double scaleFactor = 1.0;
	private int boardXoffset;
	private int boardYoffset;
	private int[] dartPosX;
	private int[] dartPosY;
	private int[] dartValue;
	private int[] dartMulter;


	//
	// Constructor
	//
	public DartBoard( DartBoardFrame  newMyFrame )
		{
		super(new GridBagLayout());
		myFrame = newMyFrame;
		setBackground(new Color(55, 55, 55));
		setForeground(Color.WHITE);
		
		dartPosX = new int[]{ -1, -1, -1 };
		dartPosY = new int[]{ -1, -1, -1 };
		dartValue = new int[]{ 0, 0, 0 };
		dartMulter = new int[]{ 0, 0, 0 };
		
		java.net.URL imgURL = DartBoardFrame.class.getResource(BOARD_PATH);
		if (imgURL != null)
			boardImage = new ImageIcon(imgURL, "Dart Board");
		else
			{
			System.err.println("Couldn't find file: " + BOARD_PATH);
			return;
			}
		imgURL = DartBoardFrame.class.getResource(DART_PATH);
		if (imgURL != null)
			dartImage = new ImageIcon(imgURL, "Dart");
		else
			{
			System.err.println("Couldn't find file: " + DART_PATH);
			return;
			}

		addMouseListener(this);

//		JButton nextButton = new JButton("Next");
//		JButton doneButton = new JButton("Done");
//		GridBagConstraints c = new GridBagConstraints();
//		c.anchor = GridBagConstraints.SOUTHWEST;
//		c.weightx = 2;
//		c.weighty = 2;
//		add(nextButton, c);
//
//		c.anchor = GridBagConstraints.SOUTHEAST;
//		add(doneButton, c);
		}

	//
	// Methods
	//
	@Override
	protected void paintComponent(Graphics g)
		{
		width = getWidth();
		height = getHeight();

		// Paint background if we're opaque.
		if (isOpaque())
			{
			g.setColor(getBackground());
			g.fillRect(0, 0, width, height);
			}
		g.setColor(getForeground());

		//
		// Get for Game Over
		//
		if( playersName == null )
			{
			int  fontSize = ( height * 15 ) / 100;
			Font  nameFont = new Font( "SanSerif", Font.BOLD, fontSize );
			FontMetrics  	nameFontMetrics = new FontMetrics( nameFont ){};
			g.setFont( nameFont );
			Rectangle2D rect = nameFontMetrics.getStringBounds( "Game Over", g );
			g.setColor( Color.WHITE );
			g.drawString( "Game Over", (int)(width-rect.getWidth())/2, height/2 + fontSize/2 );
			return;
			}
		//
		// Draw the background Dart Board
		//
		int viewWidthHeight = (width < height ? width : height);
		boardXoffset = (width - viewWidthHeight) / 2;
		boardYoffset = (height - viewWidthHeight) / 2;
		scaleFactor = (double) viewWidthHeight / boardImage.getIconWidth();
		g.drawImage(boardImage.getImage(), boardXoffset, boardYoffset, boardXoffset
				+ viewWidthHeight, boardYoffset + viewWidthHeight, // Destination rect
				0, 0, boardImage.getIconWidth(), boardImage.getIconHeight(), // source
																																			// rect
				null);

		//
		// Draw players name at the top of the Dart Board
		//
		int  fontSize = ( height * 10 ) / 100;
		Font  nameFont = new Font( "Serif", Font.ITALIC, fontSize );
		g.setFont( nameFont );
		g.setColor( Color.GRAY );
		g.drawString( playersName, 5+2, fontSize+2 );
		g.setColor( Color.WHITE );
		g.drawString( playersName, 5, fontSize );
		g.setColor(getForeground());

		
		//
		// Draw the darts
		//
		int[] order;
		// Loop thru the given darts and sort them
		if (dartPosX[0] - dartPosY[0] > dartPosX[1] - dartPosY[1])
			{
			if (dartPosX[2] - dartPosY[2] < dartPosX[1] - dartPosY[1])
				order = new int[]
					{ 0, 1, 2 };
			else if (dartPosX[2] - dartPosY[2] > dartPosX[0] - dartPosY[0])
				order = new int[]
					{ 2, 0, 1 };
			else
				order = new int[]
					{ 0, 2, 1 };
			} else
			{
			if (dartPosX[2] - dartPosY[2] > dartPosX[1] - dartPosY[1])
				order = new int[]
					{ 2, 1, 0 };
			else if (dartPosX[2] - dartPosY[2] < dartPosX[0] - dartPosY[0])
				order = new int[]
					{ 1, 0, 2 };
			else
				order = new int[]
					{ 1, 2, 0 };
			}

		int viewWidth = (int) (scaleFactor * dartImage.getIconWidth() * DART_SCALE);
		int viewHeight = (int) (scaleFactor * dartImage.getIconHeight() * DART_SCALE);
		for (int i = 0; i < 3; i++)
			if (dartPosX[order[i]] != -1)
				{
				int dartXoffset = boardXoffset
						+ (int) (scaleFactor * (dartPosX[order[i]] - DART_CENTER_X));
				int dartYoffset = boardYoffset
						+ (int) (scaleFactor * (dartPosY[order[i]] - DART_CENTER_Y));
				g.drawImage(dartImage.getImage(), dartXoffset, dartYoffset, dartXoffset
						+ viewWidth, dartYoffset + viewHeight, // Destination rect
						0, 0, dartImage.getIconWidth(), dartImage.getIconHeight(), // source
																																				// rect
						null);
				}
		}

	public void mouseReleased(MouseEvent event)
		{
		// Must be LEFT mouse button
		if( event.getButton() != MouseEvent.BUTTON1 )
			return;
		
		if (event.getClickCount() == 1)
			{
			// Do nothing if mouse released outside the window
			if (event.getX() < 0 || event.getX() > width || event.getY() < 0
					|| event.getY() > height)
				return;

			//
			// Handle Single Click
			//
			for( int i = 0; i < 3; i++ )
				{
				if (dartPosX[i] == -1)
					{
					dartPosX[i] = (int) (((double) event.getX() - (double) boardXoffset) / scaleFactor);
					dartPosY[i] = (int) (((double) event.getY() - (double) boardYoffset) / scaleFactor);
					double x = (double) dartPosX[i] - (double) BOARD_CENTER_X;
					double y = (double) dartPosY[i] - (double) BOARD_CENTER_Y;
					double r = Math.sqrt(x * x + y * y);
					double a = Math.atan2(x, y);
					System.out.println( "r=" + r + "theta=" + a + " x=" + dartPosX[i] +
					 " y=" + dartPosY[i] );

					if (r <= 65 || r > 560)
						{
						dartValue[i] = r <= 26 ? 50 : (r <= 65 ? 25 : 0);
						dartMulter[i] = 1;
						} 
					else
						{
						dartValue[i] = a < -2.98 ? 20
								: (a <= -2.67 ? 5
										: (a <= -2.36 ? 12
												: (a <= -2.05 ? 9
														: (a <= -1.73 ? 14
																: (a <= -1.42 ? 11
																		: (a <= -1.11 ? 8
																				: (a <= -0.79 ? 16
																						: (a <= -0.47 ? 7
																								: (a <= -0.15 ? 19
																										: (a <= 0.16 ? 3
																												: (a <= 0.47 ? 17
																														: (a <= 0.78 ? 2
																																: (a <= 1.09 ? 15
																																		: (a <= 1.40 ? 10
																																				: (a <= 1.72 ? 6
																																						: (a <= 2.04 ? 13
																																								: (a <= 2.36 ? 4
																																										: (a <= 2.67 ? 18
																																												: (a <= 2.99 ? 1
																																														: 20)))))))))))))))))));
						dartMulter[i] = r < 307 ? 1 : (r <= 364 ? 3 : (r < 503 ? 1 : 2));
						
						}
					System.out.println( " Dart = " + (dartMulter[i]==2 ? "Double " :
					  (dartMulter[i]==3 ? "Triple " : "")) +dartValue[i] );
					break;
					}
				}
			
			// Tell my JFrame that the darts have moved.
			myFrame.updateOtherWindows( dartValue, dartMulter );
			}
		updateUI();
		}

	public void mousePressed(MouseEvent event)
		{
		// Must be LEFT mouse button
		if( event.getButton() != MouseEvent.BUTTON1 )
			return;
		
		//
		// Check for dart removal
		//
		for (int i = 0; i < 3; i++)
			{
			if (dartPosX[i] != -1)
				{
				int x = (int) (((double) event.getX() - (double) boardXoffset) / scaleFactor);
				int y = (int) (((double) event.getY() - (double) boardYoffset) / scaleFactor);
				if ((dartPosX[i] - x) * (dartPosX[i] - x) + (dartPosY[i] - y)
						* (dartPosY[i] - y) < 144)
					{
					// Remove it
					dartPosX[i] = -1;
					dartPosY[i] = -1;
					dartValue[i] = 0;
					dartMulter[i] = 0;
					// Tell my JFrame that the darts have moved.
					myFrame.updateOtherWindows( dartValue, dartMulter );
					updateUI();
					return;
					}
				}
			}
		}

	public void mouseClicked( MouseEvent event )
		{
		if( event.getButton() == MouseEvent.BUTTON3 )
			{
			myFrame.nextPlayer();
		
			for( int i=0; i<3; i++ )
				{
				dartPosX[i] = -1;
				dartPosY[i] = -1;
				dartValue[i] = 0;
				dartMulter[i] = 0;
				}
			updateUI();
			}
		}

	public void mouseEntered(MouseEvent arg0)
		{
		}

	public void mouseExited(MouseEvent arg0)
		{
		}

	} // End for myPane nested class
