//file name ard.cpp
//
//
#include "ard.h"
#include <algorithm>
#include <iostream>

///////////////////////////////////////////////////////////////////////////////
Card::Card() {rank=1;suit=spade;}

Card::Card(suits sv,int rv) {rank = rv;suit=sv;}

Card::~Card(){}

std::ostream& operator<<(std::ostream& out,const Card& aCard)
{
	switch(aCard.rank)
	{
	    case 1:out<<" Ace ";break;
	    case 11:out<<" Jack ";break;
        case 12:out<<" Queen ";break;
	    case 13:out<<" King ";break;
	    default:out<<" "<<aCard.rank;break;
	}
	switch(aCard.suit)
	{
	    case diamond:out<<" of Dimands";break;
	    case spade:out<<" of Spades";break;
	    case heart:out<<" of Hearts";break;
	    case club:out << " of Clubs";break;
	}
	return out;
}

bool operator<(const Card& c1,const Card& c2)
{ return (c1.rank+13)%15 < (c2.rank+13)%15;}

bool operator>(const Card& c1,const Card& c2)
{ return (c1.rank+13)%15>(c2.rank+13)%15;}

bool operator==(const Card& c1,const Card& c2)
{ return c1.rank==c2.rank;}

///////////////////////////////////////////////////////////////////////////////

Deck::~Deck(){}

Deck::Deck()
{
	topCard=0;
	for(int i=1;i<=13;i++)
	{
		Card c1(diamond,i);
		Card c2(spade,i);
		Card c3(heart,i);
		Card c4(club,i);
		cards[topCard++]=c1;
		cards[topCard++]=c2;
		cards[topCard++]=c3;
		cards[topCard++]=c4;
	}
}

void Deck::shuffle(){std::random_shuffle(cards,cards+52);};

bool Deck::isEmpty() const{return topCard<=0;}

int Deck::totalCards()const{return topCard;}

Card Deck::draw()
{
	if(isEmpty())
		throw "Empty Deck";
	return cards[--topCard];
}

void Deck::add(Card aCard){cards[topCard++]=aCard;}
///////////////////////////////////////////////////////////////////////////////

Player::Player(){}

Player::~Player(){}

Player::Player(Deck& aDeck)
{
	myScore=0;
	for(int i=0;i<26;i++)
		myCards[i]=aDeck.draw();
	top=26;
}

Card Player::drawCard(Deck& aDeck)
{
    aDeck.add(myCards[--top]);
    return myCards[top];
}

bool Player::lose()const{return top<=0;}

int Player::totalCards()const{ return top;}

void Player::addCard(Deck& aDeck)
{
	while(!(aDeck.isEmpty()))
	{
		top++;
        for(int i=top-1;i>0;i--)myCards[i]=myCards[i-1];
		myCards[0]=aDeck.draw();
	}
}

void Player::removeCards(Deck& aDeck)
{
	for(int i=0;i<3;i++)if(haveCard())aDeck.add(myCards[--top]);
}

bool Player::haveCard()const{return top>=1;}

///////////////////////////////////////////////////////////////////////////////

int main()
{
	Deck theDeck;
	theDeck.shuffle();
	Player player1(theDeck);
	Player player2(theDeck);

	while(true)
	{
		Card card1=player1.drawCard(theDeck);
		Card card2=player2.drawCard(theDeck);
		std::cout<<"player 1 's card"<<card1<<std::endl;
		std::cout<<"player 2 's card"<<card2<<std::endl;
		
		if(card1==card2)
		{
			player1.removeCards(theDeck);
			player2.removeCards(theDeck);
            std::cout<<"this round is a tie."<<std::endl;
		}
		else if(card1>card2)
		{
			player1.addCard(theDeck);
			std::cout<<"player 1 wins this round"<<std::endl;
		}
		else
		{
			player2.addCard(theDeck);
            std::cout<<"player 2 wins this round"<<std::endl;
		}
		std::cout<<"Player 1 have "<<player1.totalCards()<<" cards.  ";
        std::cout<<"Player 2 have "<<player2.totalCards()<<" cards.  ";
        std::cout<<"The Deck have "<<theDeck.totalCards()<<" cards"<<std::endl;
	
        if(player1.lose())
		{
			std::cout<<"Player 2 win the game."<<std::endl;
            break;
		}
		if(player2.lose())
		{
            std::cout<<"Player 1 win the game."<<std::endl;
			break;
		}
	}
	return 0;
}
