package com.adamnickle.deck.Game;
import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.util.JsonReader;
import android.util.JsonWriter;
import com.adamnickle.deck.CardResources;
import java.io.IOException;
import java.security.InvalidParameterException;
import java.util.Comparator;
public class Card
{
private int mCardNumber;
private int mSuit;
private int mRank;
public Card()
{
this( (int) ( Math.random() * Deck.CARD_COUNT ) );
}
public Card( int cardNumber )
{
if( cardNumber >= Deck.CARD_COUNT || cardNumber < 0 )
{
throw new InvalidParameterException( "Card parameter must be a non-negative integer less than " + Integer.toString( Deck.CARD_COUNT ) );
}
mCardNumber = cardNumber;
mSuit = calculateSuit( mCardNumber );
mRank = calculateRank( mCardNumber );
}
public Card( int suit, int rank )
{
if( suit >= Deck.SUITS || suit < 0 )
{
throw new InvalidParameterException( "Suit parameter must be a non-negative integer less than " + Integer.toString( Deck.SUITS ) );
}
if( rank >= Deck.SUITS || rank < 0 )
{
throw new InvalidParameterException( "Rank parameter must be a non-negative integer less than " + Integer.toString( Deck.RANKS ) );
}
mSuit = suit;
mRank = rank;
}
public static int calculateSuit( int cardNumber )
{
return cardNumber / Deck.RANKS;
}
public static int calculateRank( int cardNumber )
{
return cardNumber % Deck.RANKS;
}
public int getCardNumber()
{
return mCardNumber;
}
public int getRank()
{
return mRank;
}
public int getSuit()
{
return mSuit;
}
public int getResource()
{
return CardResources.CARD_RESOURCE_BY_CARD_NUMBER[ getCardNumber() ];
}
@Override
public String toString()
{
return Deck.RANK_STRINGS[ mRank ] + " of " + Deck.SUIT_STRINGS[ mSuit ];
}
public String toShortString()
{
return Deck.SHORT_RANK_STRINGS[ mRank ] + Deck.SHORT_SUIT_STRINGS[ mSuit ];
}
@Override
public boolean equals( Object o )
{
if( this == o )
{
return true;
}
if( o == null || getClass() != o.getClass() )
{
return false;
}
Card card = (Card) o;
if( mCardNumber != card.mCardNumber )
{
return false;
}
if( mRank != card.mRank )
{
return false;
}
if( mSuit != card.mSuit )
{
return false;
}
return true;
}
public static class CardComparator implements Comparator< Card >
{
public final CardCollection.SortingType mSortingType;
public CardComparator( CardCollection.SortingType sortingType )
{
mSortingType = sortingType;
}
private int compareRank( Card card, Card card2 )
{
if( card.getRank() < card2.getRank() )
{
return 1;
}
else if( card.getRank() > card2.getRank() )
{
return -1;
}
else
{
return 0;
}
}
private int compareSuit( Card card, Card card2 )
{
if( card.getSuit() < card2.getSuit() )
{
return -1;
}
else if( card.getSuit() > card2.getSuit() )
{
return 1;
}
else
{
return 0;
}
}
private int compareCardNumber( Card card, Card card2 )
{
if( card.getCardNumber() < card2.getCardNumber() )
{
return -1;
}
else if( card.getCardNumber() > card2.getCardNumber() )
{
return 1;
}
else
{
return 0;
}
}
@Override
public int compare( Card card, Card card2 )
{
if( card == null )
{
return -1;
}
else if( card2 == null )
{
return 1;
}
switch( mSortingType )
{
case SORT_BY_RANK:
{
int comp = compareRank( card, card2 );
if( comp != 0 )
{
return comp;
}
else
{
return compareSuit( card, card2 );
}
}
case SORT_BY_SUIT:
{
int comp = compareSuit( card, card2 );
if( comp != 0 )
{
return comp;
}
else
{
return compareRank( card, card2 );
}
}
case SORT_BY_CARD_NUMBER:
{
return compareCardNumber( card, card2 );
}
default:
{
throw new InvalidParameterException( "Invalid sorting type." );
}
}
}
}
public void writeToJson( JsonWriter writer ) throws IOException
{
writer.value( getCardNumber() );
}
public static Card readFromJson( JsonReader reader ) throws IOException
{
return new Card( reader.nextInt() );
}
}