use crate::log;
use thiserror::Error;

#[allow(dead_code)]
#[derive(Error, Debug)]
pub enum TxError {
  #[error("from field is empty")]
  FromEmpty,
  #[error("to field is empty")]
  ToEmpty,
  #[error("insuffitient fonds")]
  FromInsuffitientFonds,
  #[error("0 value transaction")]
  ValueEmpty,
  #[error("account {0} not found in database")]
  UnknownAccount(String),
}

pub fn print_error_chain(err: &anyhow::Error) {
  let mut err_string = String::from(format!("Error: {}\n", err));

  let mut source = err.source();
  let mut level = 1;

  while let Some(err) = source {
    err_string.push_str(format!("  {}: {}\n", level, err).as_str());
    source = err.source();
    level += 1;
  }
  log(err_string)
}

#[derive(Debug, Error)]
pub enum SystemError<T>
where
  T: std::fmt::Debug,
{
  #[error("TODO")]
  TODO,

  #[error("Failed to send message: {message:?}")]
  ChannelSendError { message: T },

  #[error("Channel {message:?} was closed")]
  ChannelClosed { message: T },

  #[error("Event Bus closed")]
  EventBusClosed(#[from] tokio::sync::broadcast::error::RecvError),
}
