use std::fmt::Display;
use async_trait::async_trait;
use crate::{
    phron_primitives::BlockNumber,
    party::{backup::ABFTBackup, manager::AuthorityTask},
    AuthorityId, NodeIndex, SessionId,
};
pub trait ChainState {
    fn best_block_number(&self) -> BlockNumber;
    fn finalized_number(&self) -> BlockNumber;
}
#[async_trait]
pub trait NodeSessionManager {
    type Error: Display;
    async fn spawn_authority_task_for_session(
        &self,
        session: SessionId,
        node_id: NodeIndex,
        backup: ABFTBackup,
        authorities: &[AuthorityId],
    ) -> AuthorityTask;
    fn early_start_validator_session(
        &self,
        session: SessionId,
        node_id: NodeIndex,
        authorities: &[AuthorityId],
    ) -> Result<(), Self::Error>;
    fn start_nonvalidator_session(
        &self,
        session: SessionId,
        authorities: &[AuthorityId],
    ) -> Result<(), Self::Error>;
    fn stop_session(&self, session: SessionId) -> Result<(), Self::Error>;
    fn node_idx(&self, authorities: &[AuthorityId]) -> Option<NodeIndex>;
}