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! { <>