use std::collections::BTreeMap;
use std::io;
use thiserror::Error;
pub type Result<T, E = Error> = std::result::Result<T, E>;
#[allow(clippy::large_enum_variant)]
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("Attempted an invalid operation {0}")]
InvalidOperation(String),
#[error("This input has a signature, but it doesn't appear in the transaction")]
UnknownInput,
#[error("Failed signature check.")]
FailedSignature,
#[error("Unrecognised authority.")]
UnrecognisedAuthority,
#[error("At least one transaction input is missing a signature.")]
MissingSignatureForInput,
#[error("Mint request doesn't balance out sum(input) == sum(output)")]
DbcMintRequestDoesNotBalance { input: u64, output: u64 },
#[error("Outputs must be numbered 0..N where N = # of outputs")]
OutputsAreNotNumberedCorrectly,
#[error("DBC already spent in transaction: {transaction:?}")]
DbcAlreadySpent {
transaction: crate::DbcTransaction,
transaction_sigs: BTreeMap<crate::DbcContentHash, (crate::PublicKey, crate::Signature)>,
},
#[error("The DBC transaction must have at least one input")]
TransactionMustHaveAnInput,
#[error("Dbc Content is not a member of transaction outputs")]
DbcContentNotPresentInTransactionOutput,
#[error("Dbc Content parents is not the same transaction inputs")]
DbcContentParentsDifferentFromTransactionInputs,
#[error("Failed to verify signature")]
Ed25519(#[from] ed25519::ed25519::Error),
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("JSON serialisation error:: {0}")]
JsonSerialisation(#[from] serde_json::Error),
}