
package Cluedo.g4;

import Cluedo.*;
import Cluedo.g4.IntegerList;
import ui.*;
import java.util.*;
import java.io.*;
import java.awt.Color;

public class Card {
    int playerHolding = -1;
    int cardNumber;
    boolean isHiddenCard = true;
    double []playerArray;
    int numPlayers=0; // need to fix these
    int CardsPerHand=0; // this too
    int numHiddenCards=0;
    int changedthispass=0;
    boolean solved=false;

    public Card(int cardNum, int np, int cph, int nhc)
    {
	//System.out.println("Test");
	numPlayers=np;
	CardsPerHand=cph;
	numHiddenCards=nhc;
	//System.out.println("making card");
	//System.out.println("test 0");
	cardNumber = cardNum;
	//System.out.println("test 1");
	isHiddenCard = true;
	// System.out.println("1");
	//System.out.println("Test 2");
	//System.out.println("numPlayers"+numPlayers);
	playerArray = new double[numPlayers + 1];
	//System.out.println("Test 3");
	for (int i=0; i < playerArray.length; i++) {
	    // System.out.println("num"+i);
	    playerArray[i] = -1;
	}
	// System.out.println("2");
    }

    public void reset() {
	changedthispass=0;
    }

    public void addHasPlayer(int inPlayer, Card[] cards, Player[] players)
    {
	//System.out.println("in addHasPlayer");
	// Need to check that player isn't holding another card.
	if (!(solved)) {
	    isHiddenCard=false;
	    playerHolding=inPlayer;
	    playerArray[inPlayer] = 1;
	    changedthispass = 1;

	    for (int i = 0; i < playerArray.length; i++) {
		if (i==inPlayer) {
		    playerArray[i]=1;		    
		} else {
		    addDoesNotHave(i, cards, players);
		}	
	    }

	    /*    for (int i = 1; i < cards.length; i++) {
		if (!(i==cardNumber)) {
		    cards[i].addDoesNotHave(inPlayer, cards, players);
		}
		}*/
	    players[inPlayer].addHasCard(cardNumber, cards, players);
	    solved=true;
	    /*for (int i = 0; i < players.length; i++) {
	      if (i==inPlayer) {
	      players[i].addDoesHave(cardNumber, cards, players);
	      } else {
	      players[i].addDoesNotHave(cardNumber, cards, players);
	      }
	      }*/
	}
	else {
	    if (!(playerHolding == inPlayer)) {
		//System.out.println ("Error Card.1");
	    }
	}
    }


	

    public void addDoesNotHave(int inPlayer, Card[] cards, Player[] players)
    {
	if (inPlayer == numPlayers) {
	    //   System.out.println("removing a hidden card?"+cardNumber);
	}
	//System.out.println("in addDoesNotHave");
	if (playerArray[inPlayer] == 1) {
	    //System.out.println ("Error Card.2");
	}
	else if (!(playerArray[inPlayer] == 0)) {
	    if (inPlayer == numPlayers) {
		//System.out.println("YES"+cardNumber);
	    }
	    playerArray[inPlayer] = 0;
	    //System.out.println("Player "+inPlayer+" does not have Card "+cardNumber);
	    changedthispass=1;
	    players[inPlayer].addDoesNotHave(cardNumber, cards, players);
	}
    }
    
    public boolean solved() {
        return solved;
    }
    
    public void figureOutByX (Card[] cards, Player[] players){
	int countX=0; 
	int unknown=-1;
	if (!(solved)) {
	    for (int i=0; i<playerArray.length; i++) {
		if (playerArray[i] == 0) {
		    countX++;
		} else if (!(playerArray[i] == 1)) {
		    unknown=i;
		}
	    }   
	    if (countX == (playerArray.length - 1))
		{
		    //System.out.println("CountX"+countX+"playerlength"+playerArray.length);
		    if (unknown > -1) {
			addHasPlayer(unknown, cards, players);
		    }
		    else {
			//System.out.println("Error Card.3");
		    }
		}
	    else if (countX > playerArray.length - 1) {
		//System.out.println("Error Card.4");
	    }		
	}
    }

    public int deduce (Card[] cards, Player[] players) {
	reset();
	//System.out.println("In card deduction");
	//showAllPlayers();
	figureOutByX(cards, players);
	//System.out.println("Out of card deduction");
	return changedthispass;
    }

    public boolean doesNotHavePlayer(int inPlayer)
    {
	if(playerArray[inPlayer] == 0)
	    return true;
	else
	    return false;
    }

    public boolean hasPlayer(int inPlayer)
    {
	if(playerArray[inPlayer] == 1)
	    return true;
	else
	    return false;
    }


    public void showAllPlayers() {
	//System.out.print("EH> Card "+cardNumber+" ");
	for (int i=0; i<playerArray.length; i++) {
	    {
		if (playerArray[i] == 1) {
		    //System.out.print (i+" O ");
		}
		else if (playerArray[i] == 0) {
		    //System.out.print (i+" X ");
		}
		//else System.out.print (i+" ? ");
	    }
	}
	//System.out.print("\n");
    }
    

}

