use crate::bridge_engine::{self, Contract, DealInPlay, DealInPlayResult, Player};
use crate::card;
use crate::card::Deal;
use crate::card::Suit;
use crate::components::{Bidding, Hand, ShowBid, TrickInPlay, TricksPlayed};
use log::{error, info};
use yew::prelude::*;
pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade];
#[derive(Debug, Clone)]
enum GameState {
Bidding {
dealer: Player,
deal: Deal,
},
PassedOut {
_dealer: Player,
deal: Deal,
_bidding: bridge_engine::Bidding,
},
Play {
playing_deal: DealInPlay,
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 = {
let state = state.clone();
Callback::from(move |card| {
if let GameState::Play {
playing_deal,
contract,
bidding,
} = (*state).clone()
{
info!("Card clicked: {}", card);
match playing_deal.play(card) {
Err(err) => error!("Could not play card: {:?}", err),
Ok(DealInPlayResult::InProgress(playing_deal)) => state.set(GameState::Play {
playing_deal,
contract,
bidding,
}),
Ok(DealInPlayResult::PlayFinished(tricks)) => todo!(),
};
}
})
};
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: DealInPlay::new(dealer, deal.clone()),
contract,
bidding,
},
None => GameState::PassedOut {
_dealer: dealer,
deal: deal.clone(),
_bidding: bidding,
},
});
})
};
html! {
{ "Everyone passed" }
}, }; html! { <>