package Darts;


import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class DartBoardFrame extends JFrame
	{
	//
	// Constants
	//
	private static final DisplayScore blankDisplScore = new DisplayScore();

	//
	// Member Data
	//
	TableModel  		mainScoreBoard;
	DartDBNode    	game;
	DartPlay4Scores scoreBoard;
	DisplayScore[] 	displScore = new DisplayScore[4];

	
	DartBoard  dartBoard = null;
	DartDBNode curScore = null;
	DartDBNode curVictum = null;
	DartDBNode prevScore = null;
	DartDBNode prevVictum = null;
	
	//
	// Constructor
	//
	public DartBoardFrame( DartPlay4Scores  newScoreBoard, TableModel theMainScoreBoard )
		{
		super( "Unitech Darts" );
		
		mainScoreBoard = theMainScoreBoard;
		scoreBoard = newScoreBoard;
		setSize( 700, 700 );
		dartBoard = new DartBoard( this );
		setContentPane( dartBoard );
		}
	
	public void play( DartDBNode newGame )
		{
		setVisible( true );

		if( newGame == game  &&  curScore != null  &&  newGame.isNodeDescendant(curScore) )
			{
			repaint();
			return;
			}

		game = newGame;
		
		prevScore = null;
		prevVictum = null;
		curScore = null;
		curVictum = null;
		
		// Start a new score for the next player
		nextPlayer();
		repaint();
		}
	
	public void nextPlayer()
		{
		prevScore = curScore;
		prevVictum = curVictum;
		// Create the new score node
		DartDBNode  player = game.whosTurnIsIt();
		if( player == null )
			{
			curScore = null;
		  curVictum = null;
		  dartBoard.playersName = null;
			}
		else
			{
			curScore = new DartDBNode( player );
		  curVictum = curScore.stealeeScore();
		  dartBoard.playersName = player.toString();
			}
		
		// No darts yet
		updateOtherWindows( new int[]{0,0,0}, new int[]{0,0,0} );
		}
	
	public void updateOtherWindows( int[] dartValues, int[] dartMultrs )
		{
		if( curScore != null )
			for( int i=0; i<3; i++ )
				{
				curScore.dartValues[i] = dartValues[i];
				curScore.dartMultiplers[i] = dartMultrs[i];
				}
		
		displScore[0] = prevVictum==null ? blankDisplScore : prevVictum.calculateScore();
		displScore[1] = prevScore ==null ? blankDisplScore : prevScore.calculateScore();
		displScore[2] = curVictum ==null ? blankDisplScore : curVictum.calculateScore();
		displScore[3] = curScore  ==null ? blankDisplScore : curScore.calculateScore();

		scoreBoard.setPlayers( displScore );
		
		// Tell the score board to update itself.
		if( mainScoreBoard != null )
			((AbstractTableModel)mainScoreBoard).fireTableStructureChanged();
		}


	}
