package com.adamnickle.deck.Game;
import android.util.JsonReader;
import android.util.JsonToken;
import android.util.JsonWriter;
import com.adamnickle.deck.Interfaces.CardHolderListener;
import com.adamnickle.deck.TableFragment;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class CardHolder
{
private static final String JSON_ID = "id";
private static final String JSON_NAME = "name";
private static final String JSON_CARDS = "cards";
protected String mID;
protected String mName;
protected final ArrayList< Card > mCards;
protected CardHolderListener mListener;
private CardHolder()
{
mCards = new ArrayList< Card >();
}
public CardHolder( String deviceID, String name )
{
this();
mID = deviceID;
mName = name;
}
public void setCardHolderListener( CardHolderListener cardHolderListener )
{
mListener = cardHolderListener;
}
public String getID()
{
return mID;
}
public String getName()
{
return mName;
}
public void setName( String name )
{
mName = name;
}
public int getCardCount()
{
return mCards.size();
}
public boolean hasCard( Card card )
{
return mCards.contains( card );
}
public boolean removeCard( Card card )
{
if( mListener != null )
{
mListener.onCardRemoved( mID, card );
}
return mCards.remove( card );
}
public boolean removeCards( Card[] cards )
{
if( mListener != null )
{
mListener.onCardsRemoved( mID, cards );
}
return mCards.removeAll( Arrays.asList( cards ) );
}
public boolean addCard( Card card )
{
if( mListener != null )
{
mListener.onCardAdded( mID, card );
}
return mCards.add( card );
}
public boolean addCards( Card[] cards )
{
if( mListener != null )
{
mListener.onCardsAdded( mID, cards );
}
return mCards.addAll( Arrays.asList( cards ) );
}
public void clearCards()
{
if( mListener != null )
{
mListener.onCardsCleared( mID );
}
mCards.clear();
}
public Card[] getCards()
{
return mCards.toArray( new Card[ mCards.size() ] );
}
@Override
public boolean equals( Object o )
{
if( this == o )
{
return true;
}
if( o == null || getClass() != o.getClass() )
{
return false;
}
return mID.equals( ( (CardHolder) o ).mID );
}
@Override
public String toString()
{
return mName;
}
@Override
public int hashCode()
{
return mID.hashCode();
}
public void writeToJson( JsonWriter writer ) throws IOException
{
writer.beginObject();
writer.name( JSON_ID ).value( getID() );
writer.name( JSON_NAME ).value( getName() );
writer.name( JSON_CARDS ).beginArray();
for( Card card : mCards )
{
card.writeToJson( writer );
}
writer.endArray();
writer.endObject();
}
public static CardHolder readFromJson( JsonReader reader ) throws IOException
{
CardHolder player = new CardHolder();
reader.beginObject();
while( reader.hasNext() )
{
String name = reader.nextName();
if( name.equals( JSON_ID ) )
{
player.mID = reader.nextString();
}
else if( name.equals( JSON_NAME ) )
{
player.mName = reader.nextString();
}
else if( name.equals( JSON_CARDS ) && reader.peek() != JsonToken.NULL )
{
reader.beginArray();
while( reader.hasNext() )
{
player.addCard( Card.readFromJson( reader ) );
}
reader.endArray();
}
else
{
reader.skipValue();
}
}
reader.endObject();
return player;
}
public static class CardHolderComparator implements Comparator< CardHolder >
{
private CardHolderComparator() { }
private static final CardHolderComparator COMPARATOR = new CardHolderComparator();
public static CardHolderComparator getInstance()
{
return COMPARATOR;
}
@Override
public int compare( CardHolder one, CardHolder two )
{
final int numberOne = getValue( one );
final int numberTwo = getValue( two );
int compare = numberOne - numberTwo;
if( compare == 0 )
{
compare = one.getName().compareTo( two.getName() );
}
return (int) Math.signum( compare );
}
private int getValue( CardHolder cardHolder )
{
final String ID = cardHolder.getID();
if( ID.startsWith( TableFragment.TABLE_ID ) )
{
return 1;
}
else if( ID.startsWith( TableFragment.DRAW_PILE_ID_PREFIX ) )
{
return 2;
}
else if( ID.startsWith( TableFragment.DISCARD_PILE_ID_PREFIX ) )
{
return 3;
}
else
{
return 0;
}
}
}
}