use crate::bridge_engine::{self, Contract, Player, PlayingDeal};
use crate::card;
use crate::card::Deal;
use crate::card::Suit;
use crate::components::{Bidding, Hand, ShowBid};
use log::info;
use yew::prelude::*;
pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade];
#[derive(Debug)]
enum GameState {
Bidding {
dealer: Player,
deal: Deal,
},
PassedOut {
_dealer: Player,
deal: Deal,
_bidding: bridge_engine::Bidding,
},
Play {
playing_deal: PlayingDeal,
contract: Contract,
bidding: bridge_engine::Bidding,
},
}
impl GameState {
fn deal(&self) -> &Deal {
match self {
Self::Bidding { deal, .. } => deal,
Self::PassedOut { deal, .. } => deal,
Self::Play { playing_deal, .. } => &playing_deal.deal(),
}
}
}
pub fn deal() -> card::Deal {
let mut rng = rand::thread_rng();
let mut deal = card::deal(&mut rng);
deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending);
deal
}
fn init_state() -> GameState {
let dealer = Player::East;
let deal = deal();
GameState::Bidding { dealer, deal }
}
#[function_component(Game)]
pub fn game() -> Html {
let state = use_state(|| init_state());
let shuffle = {
let state = state.clone();
Callback::from(move |_| {
state.set(init_state());
})
};
let on_card_clicked = { Callback::from(move |card| info!("Card clicked: {}", card)) };
let center = match &*state {
GameState::Bidding { dealer, deal } => {
let on_contract = {
let state = state.clone();
let dealer = dealer.clone();
let deal = deal.clone();
Callback::from(move |(contract, bidding)| {
state.set(match contract {
Some(contract) => GameState::Play {
playing_deal: PlayingDeal::new(dealer, deal.clone()),
contract,
bidding,
},
None => GameState::PassedOut {
_dealer: dealer,
deal: deal.clone(),
_bidding: bidding,
},
});
})
};
html! {
{ "Time to play" }
}, GameState::PassedOut { .. } => html! {{ "Everyone passed" }
}, }; html! { <>