use crate::{ecs::Universe, id::ID};
use std::marker::PhantomData;
pub enum StateChange {
    None,
    Push(Box<dyn State>),
    Pop,
    Swap(Box<dyn State>),
    Quit,
}
pub trait State: Send + Sync {
    fn on_enter(&mut self, _universe: &mut Universe) {}
    fn on_exit(&mut self, _universe: &mut Universe) {}
    fn on_pause(&mut self, _universe: &mut Universe) {}
    fn on_resume(&mut self, _universe: &mut Universe) {}
    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
        StateChange::None
    }
    fn on_process_background(&mut self, _universe: &mut Universe) {}
}
impl State for () {}
impl State for bool {
    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
        if *self {
            StateChange::None
        } else {
            StateChange::Quit
        }
    }
}
impl State for usize {
    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
        if *self > 0 {
            *self -= 1;
            StateChange::None
        } else {
            StateChange::Quit
        }
    }
}
pub type StateToken = ID<PhantomData<dyn State + Send + Sync>>;