use snafu::prelude::*;

#[derive(Debug, Snafu)]
pub enum DecodeError {
    #[snafu(display("Unexpected end of input"))]
    UnexpectedEndOfInput,

    #[snafu(display("Malformed whisker at position `{}`", position))]
    MalformedWhisker { position: usize },

    #[snafu(display("Duplicate whisker at position `{}`", position))]
    DuplicateWhisker { position: usize },

    #[snafu(display("Comment data is not valid UTF-8"))]
    InvalidComment,

    #[snafu(display("CRC checksum mismatch"))]
    CrcMismatch,

    #[snafu(display("LDPC Decode error"))]
    LdpcError,

    #[snafu(display("Given data does not fit in the CATS packet"))]
    Overflow,
}

#[derive(Debug, Snafu)]
pub enum EncodeError {
    #[snafu(display("New data is a duplicate of an existing data"))]
    DuplicateData,

    #[snafu(display("Given data causes CATS packet to overflow"))]
    CatsOverflow,
}

#[derive(Debug, Snafu)]
pub enum CommentError {
    #[snafu(display("CATS packet does not have comment data"))]
    NoComment,

    #[snafu(display("Given buffer too small for comment data"))]
    BufferOverflow,
}

#[derive(Debug, Snafu)]
pub enum DigipeatError {
    #[snafu(display("No route"))]
    NoRoute,

    #[snafu(display("Identification is us"))]
    Us,

    #[snafu(display("Max hops hit"))]
    MaxHops,

    #[snafu(display("Already digipeated by this node"))]
    AlreadyDigipeated,

    #[snafu(display("Future hop(s) are already set"))]
    SetDestiny,
}

#[derive(Debug, Snafu, PartialEq, Eq)]
pub enum AppendNodeError {
    #[snafu(display("Future hop(s) already set to a different node"))]
    SetFuture,

    #[snafu(display("Max hops hit"))]
    HopsOverflow,

    #[snafu(display("Node already in route"))]
    DuplicateNode,

    #[snafu(display("Given data causes the route whisker to overflow"))]
    RouteOverflow,
}

#[derive(Debug, Snafu, PartialEq, Eq)]
pub enum PacketRouteAppendError {
    #[snafu(display("No route whisker on packet"))]
    NoRouteWhisker,

    #[snafu(display("Route error"))]
    Route { error: AppendNodeError },

    #[snafu(display("CATS packet overflow"))]
    PacketOverflow,
}