import rand

enum Suit {
	hearts
	diamonds
	clubs
	spades
}

enum Rank {
	ace   = 1
	two   = 2
	three = 3
	four  = 4
	five  = 5
	six   = 6
	seven = 7
	eight = 8
	nine  = 9
	ten   = 10
	jack  = 11
	queen = 12
	king  = 13
}

struct Card {
	suit Suit
	rank Rank
}

fn (c Card) str() string {
	return '${c.rank} of ${c.suit}'
}

struct Deck {
mut:
	cards        []Card
	discard_pile []Card // New storage for discarded cards
}

fn new_deck() Deck {
	mut d := Deck{}
	suits := [Suit.hearts, .diamonds, .clubs, .spades]
	ranks := [Rank.two, .three, .four, .five, .six, .seven, .eight, .nine, .ten, .jack, .queen,
		.king, .ace]

	for s in suits {
		for r in ranks {
			d.cards << Card{
				suit: s
				rank: r
			}
		}
	}
	return d
}

fn (c Card) value() int {
	return int(c.rank)
}

// Draw a card and automatically move it toward the "discard" logic later
fn (mut d Deck) draw() ?Card {
	if d.cards.len == 0 {
		return none
	}
	return d.cards.pop()
}

// Move a specific card to the discard pile
fn (mut d Deck) discard(c Card) {
	d.discard_pile << c
}

// Move all discarded cards back into the main deck and shuffle
fn (mut d Deck) reshuffle_discards() {
	println('--- Reshuffling discard pile back into the deck ---')
	d.cards << d.discard_pile
	d.discard_pile.clear() // Empties the discard pile
	d.shuffle()
}

fn (mut d Deck) shuffle() {
	if d.cards.len == 0 {
		return
	}
	for i := d.cards.len - 1; i > 0; i-- {
		j := rand.intn(i + 1) or { 0 }
		d.cards[i], d.cards[j] = d.cards[j], d.cards[i]
	}
}

fn main() {
	mut my_deck := new_deck()
	my_deck.shuffle()

	// Draw 5 cards and discard them
	for _ in 0 .. 5 {
		if card := my_deck.draw() {
			println('Drew: ${card} (Value: ${card.value()})')
			my_deck.discard(card)
		}
	}

	println('Main Deck: ${my_deck.cards.len} cards')
	println('Discard Pile: ${my_deck.discard_pile.len} cards')

	// Bring them back
	my_deck.reshuffle_discards()
	println('Main Deck after reshuffle: ${my_deck.cards.len} cards')
}
