//C4Row.java
 
/** 
 *
 * @author  Sean Bridges
 * @version 1.0
 *
 * The C4Row contains 4 slots in a row.  It listens to those slots, and
 * counts the number of slots each player occupies.
 * It informs the stat object when a player has significant combinations
 * of the stats.
 */
public final class C4Row implements C4SlotListener
{
    
//-----------------------------------------------
    //instance variables
    
    //number of each type contained in my slots
    int numPlayer1 = 0;
    int numPlayer2 = 0;
    
    
    C4Stats stats;
    

//-----------------------------------------------
    //constructors

    /** Creates new C4Row 
     *
     * It is assumed that all the slots are empty.
     */
    public C4Row(C4Slot s1, C4Slot s2, C4Slot s3, C4Slot s4, C4Stats stats) 
    {
        s1.addSlotListener(this);
        s2.addSlotListener(this);
        s3.addSlotListener(this);
        s4.addSlotListener(this);
        
        this.stats = stats;
    }
  
    public void contentsChanged(int oldContents,int newContents)
    {       
        //case 1, moving from null to first player
        if(oldContents == C4Board.NULL_PLAYER_NUMBER &
           newContents == C4Board.FIRST_PLAYER_NUMBER)
        {
            //if we had no second player tokens, we now have a better score
            //for the first player, tell the stats.
            if(numPlayer2 == 0)
            {
                switch(numPlayer1)
                {
                    case 0: stats.p1_1InARowInc();
                    break;
                    
                    case 1: stats.p1_1InARowDec();
                            stats.p1_2InARowInc();
                    break;
                    
                    case 2: stats.p1_2InARowDec();
                            stats.p1_3InARowInc();
                    break;
                    
                    case 3: stats.p1_3InARowDec();
                            stats.p1_4InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 1
            }//end if numPlayer2 = 0
            
            //if we have some second player tokens, and
            //we had no first player tokens, we are no longer populated
            //exclusively by second player tokens, change the stats
            else if(numPlayer1 == 0)
            {
                switch(numPlayer2)
                {
                    case 0: 
                    break;
                    
                    case 1: stats.p2_1InARowDec();
                    break;
                    
                    case 2: stats.p2_2InARowDec();
                    break;
                    
                    case 3: stats.p2_3InARowDec();
                    break;
                    
                    default: errorPrint();
                }//end switch player 1
            }
            
        }//end if old = null, new = player 1

        
        //case 2, moving from null to second player
        else if(oldContents == C4Board.NULL_PLAYER_NUMBER &
           newContents == C4Board.SECOND_PLAYER_NUMBER)
        {
            //if we had no first player tokens, we now have a better score
            //for the second player, tell the stats.
            if(numPlayer1 == 0)
            {
                switch(numPlayer2)
                {
                    case 0: stats.p2_1InARowInc();
                    break;
                    
                    case 1: stats.p2_1InARowDec();
                            stats.p2_2InARowInc();
                    break;
                    
                    case 2: stats.p2_2InARowDec();
                            stats.p2_3InARowInc();
                    break;
                    
                    case 3: stats.p2_3InARowDec();
                            stats.p2_4InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 2
            }//end if numPlayer1 = 0
            
            //if we have some first player tokens, 
            //and we had no second player tokens, then we are no
            //longer populated exclusively by first player tokens
            else if(numPlayer2 == 0)
            {
                switch(numPlayer1)
                {
                    case 0: 
                    break;
                    
                    case 1: stats.p1_1InARowDec();
                    break;
                    
                    case 2: stats.p1_2InARowDec();
                    break;
                    
                    case 3: stats.p1_3InARowDec();
                    break;
                    
                    default: errorPrint();
                }//end switch player 1
            }
            
        }//end if old = null, new = player 2
        
        //case 3, moving from player 1 to null
        else if(oldContents == C4Board.FIRST_PLAYER_NUMBER &
                newContents == C4Board.NULL_PLAYER_NUMBER)
        {
            //if no player 2 tokens, we have a worse score
            if(numPlayer2 == 0)
            {
                switch(numPlayer1)
                {
                    
                    case 1: stats.p1_1InARowDec();
                    break;
                    
                    case 2: stats.p1_2InARowDec();
                            stats.p1_1InARowInc();
                    break;
                    
                    case 3: stats.p1_3InARowDec();
                            stats.p1_2InARowInc();
                    break;
                    
                    case 4: stats.p1_4InARowDec();
                            stats.p1_3InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 1
                
            }//end if numPlayer2 == 0
            //if there was only 1 player 1 token, then we now have a score for p2
            if(numPlayer1 == 1)
            {
                switch(numPlayer2)
                {
                    case 0: 
                    break;
                    
                    case 1: stats.p2_1InARowInc();
                    break;
                    
                    case 2: stats.p2_2InARowInc();
                    break;
                    
                    case 3: stats.p2_3InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 2
            }//end if numPlayer1 == 1
        }//end old = p1, new = null
        
        
        //case 4, moving from player 2 to null
        else if(oldContents == C4Board.SECOND_PLAYER_NUMBER &
                newContents == C4Board.NULL_PLAYER_NUMBER)
        {
            //if no player 1 tokens, we have a worse score
            if(numPlayer1 == 0)
            {
                switch(numPlayer2)
                {
                    
                    case 1: stats.p2_1InARowDec();
                    break;
                    
                    case 2: stats.p2_2InARowDec();
                            stats.p2_1InARowInc();
                    break;
                    
                    case 3: stats.p2_3InARowDec();
                            stats.p2_2InARowInc();
                    break;
                    
                    case 4: stats.p2_4InARowDec();
                            stats.p2_3InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 2
                
            }//end if numPlayer1 == 0
            //if there was only 1 player 2 token, then we now have a score for p1
            if(numPlayer2 == 1)
            {
                switch(numPlayer1)
                {
                    case 0: 
                    break;
                    
                    case 1: stats.p1_1InARowInc();
                    break;
                    
                    case 2: stats.p1_2InARowInc();
                    break;
                    
                    case 3: stats.p1_3InARowInc();
                    break;
                    
                    default: errorPrint();
                }//end switch player 1
            }//end if numPlayer2 == 1
        }//end old = p2, new = null
        
        
        if(newContents == C4Board.FIRST_PLAYER_NUMBER)
        {
            numPlayer1++;
        }
        else if(newContents == C4Board.SECOND_PLAYER_NUMBER)
        {
            numPlayer2++;
        }
        else if(newContents == C4Board.NULL_PLAYER_NUMBER)
        {
            if(oldContents == C4Board.FIRST_PLAYER_NUMBER)
            {
                numPlayer1--;
            }
            else if(oldContents == C4Board.SECOND_PLAYER_NUMBER)
            {
                numPlayer2--;
            }
        }
    }//end contentsChanged
    
    private void errorPrint()
    {
        System.err.println("Error in Row state, inconsistent values");
        Thread.dumpStack();
        System.err.println(stats);
        System.exit(0);
    }
}//end class C4Row