package 
{
	import flash.text.*;
	import flash.display.*;
	import flash.events.*;
	
	/**
	 * ...
	 * @author (t)ad
	 */
	public class blackJackBrain
	{
		
		/* The brain consists of anything that needs to be remembered, even once. And the functions used to rememeber and retrieve data. */
		/* Also any method that needs a lot of the brains properties is in this class */
		/* It is part of the engine */
		
		public var dealerStats:TextField;
		public var playerStats:TextField;
		
		public var format:TextFormat;
		public var theGame:tadsBlackJack;
		
		public var dealerHand:Number = 0;
		public var playerHand:Number = 0;
		public var acesUsed:Number = 0;
		
		public var splitHandOne:Number = 0;
        	public var splitHandTwo:Number = 0;
        	public var splitHandThree:Number = 0;
		
		public var playerCardOne:String = "0";
		public var firstSuit:String = "c";
		public var secondSuit:String = "c";
		public var dealerSuitOne:String = "c";
		public var dealerSuitTwo:String = "c";
		public var splitCardTwoSuit:String = "c";
		public var splitCardFourSuit:String = "c";
		
        	public var playerCardTwo:String = "0";
        	public var dealerCardOne:String = "0";
        	public var dealerCardTwo:String = "0";
		
		public var splitCardOne:String = "0";
        	public var splitCardTwo:String = "0";
        	public var splitCardThree:String = "0";
        	public var splitCardFour:String = "0";
        	public var splitCardFive:String = "0";
        	public var splitCardSix:String = "0";
		
		public function blackJackBrain(theGameIs:tadsBlackJack) {
			
			theGame = theGameIs;
			
			format = new TextFormat();
			format.font = "Arial";
			format.color = "0x000000";
			format.size = 10;
			format.align = TextFormatAlign.LEFT;
			
			dealerStats = new TextField();
			dealerStats.defaultTextFormat = format;
			
			playerStats = new TextField();
			playerStats.defaultTextFormat = format;
		}
		
		
		public function update():void 
        	{
            		dealerStats.text = "Dealer cards: "+ dealerCardOne + "  " + 
            		dealerCardTwo + " dealer hand totals: " + dealerHand;
			
            		playerStats.text = "Player cards: "+ playerCardOne + "  " + 
            		playerCardTwo + " your hand totals: " + playerHand;
        	}
		
		
		public function calculateDeal():void {
			
			acesUsed = 0;
            		playerCardOne = blackJackFunctions.giveCard();
			firstSuit = cardShute.suitOfLastCardPulled;
			
            		playerCardTwo = blackJackFunctions.giveCard();
			secondSuit = cardShute.suitOfLastCardPulled;
			
            		playerHand = blackJackFunctions.calculateTwoCardHand(playerCardOne, playerCardTwo);
			if (playerCardOne == "A" && playerCardTwo == "A") acesUsed += 1;
            
            		dealerCardOne = blackJackFunctions.giveCard();
			dealerSuitOne = cardShute.suitOfLastCardPulled;
			
            		dealerCardTwo = blackJackFunctions.giveCard();
			dealerSuitTwo = cardShute.suitOfLastCardPulled;
			
            		dealerHand= blackJackFunctions.calculateTwoCardHand(dealerCardOne, dealerCardTwo);
            		update();
			
		}
		
		public function calculateHit(event:MouseEvent):void 
        	{
            
            		var whichhit:Object = event.target; //notice target. Seems like a long function
			//but this function is dispatched from 7 different buttons
			//so that's 7 different behaviors, compacted into this one function
			//if we wanted, each if could be it's own function instead
            
		        if (whichhit == theGame.firstSplitButton && playerCardOne == playerCardTwo &&
					playerStats.text.indexOf('new  hands')==-1 && playerStats.text.indexOf('hit for')==-1)
		        {
			        splitHands(playerCardOne, playerCardTwo, firstSuit, secondSuit); return(void); 
		        } 
            
            		if (whichhit == theGame.secondSplitButton && splitCardTwo == splitCardOne && 
					playerStats.text.indexOf('resplit hand')==-1 && splitCardThree!= "0" && splitCardFour!= "0"  && 
						playerStats.text.indexOf('after hit')==-1 && 
							splitCardOne != "0" || whichhit == theGame.secondSplitButton && splitCardThree == splitCardFour && 
								playerStats.text.indexOf('resplit hand')==-1 && splitCardThree!= "0" && splitCardFour!= "0"  									&& playerStats.text.indexOf('after hit')==-1 && splitCardOne != "0")
            		{
                		if (splitCardTwo == splitCardOne) {
					splitHandsAgain(splitCardOne, splitCardTwo, "one");
				} else {
					splitHandsAgain(splitCardThree, splitCardFour, "two");
				}
				
               			return(void);
            		}
            
            		if (whichhit == theGame.hitSplitOneButton && splitHandOne!=0 && playerStats.text.indexOf('first hand after')==-1
					&& playerStats.text.indexOf('split')!=-1 && splitHandOne < 21)
            		{
                		var afhcard:String = blackJackFunctions.giveCard();
				var sgn:String = cardShute.suitOfLastCardPulled;
				
				var possibas:Array = new Array();
                		if (playerStats.text.indexOf('resplit')!=-1)
                		{possibas = [splitCardTwo, splitCardFive];} else {possibas = [playerCardOne, splitCardTwo];}
                
                		splitHandOne=hitThisHand(splitHandOne, possibas, afhcard);
                
                		theGame.showHitGraphics(afhcard, null, sgn);
                
                		playerStats.appendText("\nhit and got card: "+afhcard+"");
                		playerStats.appendText("\nfirst hand after hit: "+ splitHandOne+"");
                		return(void);
            		}
            
            		if (whichhit == theGame.hitSplitTwoButton && splitHandTwo!=0 && 
					playerStats.text.indexOf('second hand after')==-1
						&& playerStats.text.indexOf('split')!=-1 && splitHandTwo < 21)
            		{
                		var ashcard:String =  blackJackFunctions.giveCard();
                		var suitGiven:String = cardShute.suitOfLastCardPulled;
				
                		splitHandTwo=hitThisHand(splitHandTwo, [playerCardTwo, splitCardFour], ashcard);
                		theGame.showHitGraphics(ashcard, theGame.cardSpotTwo, suitGiven);
                
                		playerStats.appendText("\nhit and got card: "+" "+" "+" "+ashcard+"");
                		playerStats.appendText("\nsecond hand after hit:       "+ splitHandTwo+"");
                		return(void);
            		}
			
            		if (whichhit == theGame.hitSplitThreeButton && splitHandThree!=0 && playerStats.text.indexOf('last hand')==-1 &&
					playerStats.text.indexOf('resplit')!=-1 && splitHandThree < 21)
            		{
                		var athhcard:String =  blackJackFunctions.giveCard();
                		var sg:String = cardShute.suitOfLastCardPulled;
				
                		splitHandThree=hitThisHand(splitHandThree, [splitCardOne, splitCardSix], athhcard);
                		theGame.showHitGraphics(athhcard, theGame.cardSpotThree, sg);
                		playerStats.appendText("\nhit and got card: "+" "+" "+" "+athhcard+"");
                		playerStats.appendText("\nlast hand is now:       "+ splitHandThree+"");
                		return(void);
            		}
            
			
            		if (whichhit == theGame.hitButton && playerStats.text.indexOf('first hand')==-1)
            		{
                
                		var newcard:String = blackJackFunctions.giveCard();
                		var sger:String = cardShute.suitOfLastCardPulled;
				
                		theGame.showHitGraphics(newcard, null, sger);
                		if (newcard == "K" || newcard == "Q" || newcard == "J") newcard = "10";
				
                		if (playerStats.text.indexOf("A")==-1)
                		{
                    
                    			if (newcard == "A")
                    			{
                        			if (playerHand + 11 > 21)
                        			{playerHand += 1;acesUsed += 1;}
                        			else 
                        			{playerHand += 11;}
                    			}
                    			else 
                    			{
                        			playerHand += int(newcard);
                    			}
                    
                		}
                		else 
                		{
                    
                    			var howmanyar:Array = playerStats.text.match("A");
                    			var numofas:Number = howmanyar.length;
                    			if (newcard != "A")
                    			{
                        			if (playerHand + int(newcard) > 21 && acesUsed < numofas)
                        			{	
							playerHand = playerHand - 10 + int(newcard);
							acesUsed += 1;
						}
                        			else 
                        			{
                            				if (playerHand + 10 + int(newcard) <=21 && acesUsed < numofas)
                            				{
								playerHand = playerHand + 10 + int(newcard);acesUsed += 1;
							}
                            				else 
                            				{playerHand = playerHand + int(newcard);}
                            
                        			}
                    			}	
                    
                    			if (newcard == "A")
                    			{
                        
                        			if (playerHand + 1 > 21 && acesUsed < numofas)
                        			{
							playerHand = playerHand - 10 + 1;acesUsed += 1;
                            				playerStats.appendText("\nhit for: "+newcard+" your hand is now: "+playerHand+"");
                            				return(void);
						}
                        
                        			if (playerHand + 1 > 21 && acesUsed > numofas) playerHand = playerHand + 1;
                        
                        			if (playerHand + 11 >21 && playerHand + 1 <= 21) playerHand = playerHand +1;
                        
                        			if (playerHand + 11 <= 21) playerHand = playerHand + 11;
                        
                    			}
                    
                		}
                
                
                		playerStats.appendText("\nhit for: "+newcard+" your hand is now: "+playerHand+"");
            		}
            
            
        	}
		
		
		public function hitThisHand(handtohit:Number, apossibs:Array, hitwith:String):Number 
        	{
            
            		var newcard:String = hitwith;
			if (newcard == "K" || newcard == "Q" || newcard == "J") newcard = "10";
			
            		var asofar:String = apossibs.join("");
            
            		if (asofar.indexOf("A")==-1)
            		{
                
                		if (newcard == "A")
                		{
                    			if (handtohit + 11 > 21)
                    			{handtohit += 1;acesUsed += 1;}
                    			else
                    			{handtohit += 11;}
                		}
                		else 
                		{handtohit += int(newcard);}
                
            		}
            		else 
            		{
                
                		var howmanyar:Array = asofar.match("A");
                		var numofas:Number = howmanyar.length;
                		if (newcard != "A")
                		{
                    			if (handtohit + int(newcard) > 21 && acesUsed < numofas)
                    			{handtohit = handtohit - 10 + int(newcard);acesUsed += 1;}
                    			else 
                    			{
                        			if (handtohit + 10 + int(newcard) <=21 && acesUsed < numofas)
                        			{handtohit = handtohit + 10 + int(newcard);acesUsed += 1;}
                        			else 
                        			{handtohit = handtohit + int(newcard);}
                        
                    			}
                		}
                
                		if (newcard == "A")
                		{
                    
                    			if (handtohit + 1 > 21 && acesUsed < numofas)
                    			{handtohit = handtohit - 10 + 1;acesUsed += 1;return(handtohit);}
                    
                    			if (handtohit + 1 > 21 && acesUsed > numofas) handtohit = handtohit + 1;
                    
                    			if (handtohit + 11 >21 && handtohit + 1 <= 21) handtohit = handtohit +1;
                    
                    			if (handtohit + 11 <= 21) handtohit = handtohit + 11;
                    
                		}
                
                
            		}
            
            		return(handtohit);
            
        	}
		
		public function splitHands(firstcard:String, secondcard:String, su1:String, su2:String ):void 
        	{
            
            		if (firstcard == "A" && secondcard == "A") acesUsed -= 1;
			
            		splitCardOne = firstcard;
            		splitCardTwo = blackJackFunctions.giveCard();
			splitCardTwoSuit = cardShute.suitOfLastCardPulled;
			
            		splitHandOne = blackJackFunctions.calculateTwoCardHand(splitCardOne, splitCardTwo);
			if (splitCardOne == "A" && splitCardTwo == "A") acesUsed += 1;
			
            		splitCardThree = secondcard;
            		splitCardFour = blackJackFunctions.giveCard();
			splitCardFourSuit = cardShute.suitOfLastCardPulled;
			
            		splitHandTwo = blackJackFunctions.calculateTwoCardHand(splitCardThree, splitCardFour);
			if (splitCardThree == "A" && splitCardFour == "A") acesUsed += 1;
            
            		theGame.showSplitGraphics(firstcard, splitCardTwo, secondcard, 
							splitCardFour,null,null, su1, splitCardTwoSuit, su2, splitCardFourSuit);
            
            		playerStats.appendText("\nsplit and got cards: "+splitCardTwo+" "+splitCardFour+"");
            		playerStats.appendText("\nthe new hands are: "+splitHandOne+" "+splitHandTwo+"");
            
        	}
		
		
		public function splitHandsAgain(firstcard:String, secondcard:String, whichspot:String):void 
        	{
            
            		if (firstcard == "A" && secondcard == "A") acesUsed -= 1;
            
            		var theonesplitre:Number = 0;
            		splitCardFive = blackJackFunctions.giveCard();
			var su5:String = cardShute.suitOfLastCardPulled;
			
            		splitCardSix = blackJackFunctions.giveCard();
			var su6:String = cardShute.suitOfLastCardPulled;
			
            
			if (whichspot == "one")
                        {
				splitHandOne = blackJackFunctions.calculateTwoCardHand(splitCardOne, splitCardFive); theonesplitre = splitHandOne;
				if (splitCardOne == "A" && splitCardFive == "A") acesUsed += 1;
                		splitHandThree = blackJackFunctions.calculateTwoCardHand(splitCardTwo, splitCardSix);
				if (splitCardTwo == "A" && splitCardSix == "A") acesUsed += 1;
                		theGame.showSplitGraphics(splitCardOne, splitCardFive, splitCardTwo, 
					splitCardSix, theGame.cardSpotOne, theGame.cardSpotThree, firstSuit, su5, secondSuit, su6);
			}
            
			if (whichspot == "two")
			{
				splitHandTwo = blackJackFunctions.calculateTwoCardHand(splitCardThree, splitCardFive); theonesplitre = splitHandTwo;
				if (splitCardThree == "A" && splitCardFive == "A") acesUsed += 1;
               			splitHandThree = blackJackFunctions.calculateTwoCardHand(splitCardFour, splitCardSix);
				if (splitCardFour == "A" && splitCardSix == "A") acesUsed += 1;
                		theGame.showSplitGraphics(splitCardThree, splitCardFive, splitCardFour, 
					splitCardSix, theGame.cardSpotTwo, theGame.cardSpotThree, secondSuit, su5, splitCardFourSuit, su6);
			}
            
            		playerStats.appendText("\nsplit again and got cards: "+splitCardFive+" "+splitCardSix+"");
            		playerStats.appendText("\nthe resplit hand is now: "+theonesplitre+"");
            		playerStats.appendText("\nthe new hand is now: "+splitHandThree+"");
            
        	}
		
		
		public function winEifel(winField:TextField):void {
			
			/* All possible outcomes */
			
			if (dealerHand > playerHand && dealerHand <= 21 && playerHand < 21 && splitHandOne == 0 && splitHandTwo == 0 && splitHandThree == 0)
			{winField.appendText("dealer wins the hand"); }
				
            		if (playerHand > dealerHand && playerHand <=21 && dealerHand < 21 && splitHandOne == 0 && splitHandTwo == 0 && splitHandThree == 0)
            		{winField.appendText("player wins the hand"); theGame.sounds.winSound.play(); }
				
            		if (playerHand == dealerHand && dealerHand <=21 && playerHand <=21 && splitHandOne == 0 && splitHandTwo == 0 && splitHandThree == 0)
            		{winField.appendText("the hand pushes"); }
				
            		if (playerHand > 21 && splitHandOne == 0 && splitHandTwo == 0 && splitHandThree == 0)
            		{winField.appendText("player busts"); }
				
            		if (playerHand <= 21 && splitHandOne == 0 && splitHandTwo == 0 && splitHandThree == 0 && dealerHand > 21)
            		{winField.appendText("dealer busts");theGame.sounds.winSound.play();}
                
            		if (splitHandOne != 0 && splitHandOne <= 21 && splitHandOne > dealerHand && dealerHand < 21)
            		{winField.appendText("first hand wins");}
                
            		if (splitHandOne != 0 && splitHandOne < 21 && splitHandOne < dealerHand && dealerHand <= 21)
            		{winField.appendText("first hand looses");}
                
            		if (splitHandOne != 0 && splitHandOne > 21)
            		{winField.appendText("first hand busts");}
                
            		if (splitHandOne != 0 && splitHandOne <= 21 && dealerHand > 21)
            		{winField.appendText("dealer busts first hand wins");}
                
            		if (splitHandOne != 0 && splitHandOne <= 21 && splitHandOne == dealerHand && dealerHand <= 21)
            		{winField.appendText("first hand pushes");}
                
            		if (splitHandTwo != 0 && splitHandTwo <= 21 && splitHandTwo > dealerHand && dealerHand < 21)
            		{winField.appendText("\nsecond hand wins");}
                
            		if (splitHandTwo != 0 && splitHandTwo < 21 && splitHandTwo < dealerHand && dealerHand <= 21)
            		{winField.appendText("\nsecond hand looses");}
                
            		if (splitHandTwo != 0 && splitHandTwo > 21)
            		{winField.appendText("\nsecond hand busts");}
                
            		if (splitHandTwo != 0 && splitHandTwo <= 21 && dealerHand > 21)
            		{winField.appendText("\ndealer busts second hand wins");}
                
            		if (splitHandTwo != 0 && splitHandTwo <= 21 && splitHandTwo == dealerHand && dealerHand <= 21)
            		{winField.appendText("\nsecond hand pushes");}
                
            		if (splitHandThree != 0 && splitHandThree <= 21 && splitHandThree > dealerHand && dealerHand < 21)
            		{winField.appendText("\nthird hand wins");}
                
            		if (splitHandThree != 0 && splitHandThree < 21 && splitHandThree < dealerHand && dealerHand <= 21)
            		{winField.appendText("\nthird hand looses");}
                
            		if (splitHandThree != 0 && splitHandThree > 21)
            		{winField.appendText("\nthird hand busts");}
                
            		if (splitHandThree != 0 && splitHandThree <= 21 && dealerHand > 21)
            		{winField.appendText("\ndealer busts third hand wins");}
                
            		if (splitHandThree != 0 && splitHandThree <= 21 && splitHandThree == dealerHand && dealerHand <= 21)
            		{winField.appendText("\nthird hand pushes"); }
				
		}
		
	}
	
}