package ws

import (
	"testing"

	"hakemsho/internal/game"
)

func card(s game.Suit, r game.Rank) game.Card { return game.Card{Suit: s, Rank: r} }

func TestBotWinsWhenOpponentLeads(t *testing.T) {
	// حریف با شاهِ پیک رهبری کرده؛ بات باید با آسِ پیک (کمترین کارتِ برنده) ببرد.
	hand := []game.Card{card(game.Spades, game.Ace), card(game.Spades, 3), card(game.Clubs, 5)}
	trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.King)}}
	got := botPlay(hand, trick, game.Hearts, game.Spades)
	if got != card(game.Spades, game.Ace) {
		t.Errorf("expected S-A to win, got %v", got)
	}
}

func TestBotSavesCardWhenPartnerWins(t *testing.T) {
	// شریک (صندلی۰) با آسِ پیک برنده است؛ باتِ صندلی۲ باید کمترین پیک را بریزد.
	hand := []game.Card{card(game.Spades, game.King), card(game.Spades, 5)}
	trick := []game.TrickCard{
		{Seat: 0, Card: card(game.Spades, game.Ace)},
		{Seat: 1, Card: card(game.Spades, 2)},
	}
	got := botPlay(hand, trick, game.Hearts, game.Spades)
	if got != card(game.Spades, 5) {
		t.Errorf("expected low S-5 (save the King), got %v", got)
	}
}

func TestBotTrumpsOpponent(t *testing.T) {
	// بات پیک ندارد و حریف با آسِ پیک می‌برد ⇒ باید با کمترین حکم بِبُرد.
	hand := []game.Card{card(game.Hearts, 2), card(game.Hearts, game.King), card(game.Clubs, 9)}
	trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
	got := botPlay(hand, trick, game.Hearts, game.Spades)
	if got != card(game.Hearts, 2) {
		t.Errorf("expected lowest trump H-2, got %v", got)
	}
}

func TestBotDiscardsWhenPartnerWinsAndVoid(t *testing.T) {
	// شریک می‌برد و بات خالِ زمینه را ندارد ⇒ حکم را هدر ندهد، کارتِ کم بریزد.
	hand := []game.Card{card(game.Hearts, game.King), card(game.Clubs, 4), card(game.Clubs, 9)}
	trick := []game.TrickCard{
		{Seat: 0, Card: card(game.Spades, game.Ace)},
		{Seat: 1, Card: card(game.Spades, 2)},
	}
	got := botPlay(hand, trick, game.Hearts, game.Spades)
	if got != card(game.Clubs, 4) {
		t.Errorf("expected low discard C-4 (keep trump), got %v", got)
	}
}

func TestBotLeadsNonTrumpAce(t *testing.T) {
	// در رهبری، آسِ غیرِحکم را نقد کن.
	hand := []game.Card{card(game.Clubs, game.Ace), card(game.Diamonds, 7), card(game.Hearts, game.King)}
	got := botPlay(hand, nil, game.Hearts, 0)
	if got != card(game.Clubs, game.Ace) {
		t.Errorf("expected to lead C-A, got %v", got)
	}
}

func TestBotCannotBeatKeepsLow(t *testing.T) {
	// حریف با آسِ پیک می‌برد و بات فقط پیکِ پایین دارد ⇒ کمترین را بریزد.
	hand := []game.Card{card(game.Spades, 4), card(game.Spades, 9)}
	trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
	got := botPlay(hand, trick, game.Hearts, game.Spades)
	if got != card(game.Spades, 4) {
		t.Errorf("expected low S-4, got %v", got)
	}
}

func TestBotChooseTrumpPrefersStrongLongSuit(t *testing.T) {
	// خشت: ۴ کارت اما ضعیف؛ گشنیز: ۳ کارت اما آس+شاه. باید گشنیز را حکم کند اگر
	// امتیازش بیشتر شود — اینجا خشت ۴تایی برنده است. تستِ ساده: بلندترینِ قوی.
	hand := []game.Card{
		card(game.Diamonds, 2), card(game.Diamonds, 3), card(game.Diamonds, 4), card(game.Diamonds, 5),
		card(game.Clubs, game.Ace),
	}
	if got := botChooseTrump(hand); got != game.Diamonds {
		t.Errorf("expected Diamonds (longest), got %v", got)
	}
}
