use hyper;
use json;
use std::path::Path;
use std::io;

use metadata::Role;

/// Error type for all TUF related errors.
#[derive(Debug, PartialEq, Eq)]
pub enum Error {
    /// ASN.1 parse errors.
    Asn1,
    /// Errors for converting JSON to canonical JSON.
    CanonicalJsonError(String),
    /// The metadata for the given role has expired.
    ExpiredMetadata(Role),
    /// Generic error type for more opaque error reporting.
    Generic(String),
    /// An HTTP or network error.
    Http(String),
    /// The TUF configuration was invalid.
    InvalidConfig(String),
    /// Wrapper for IO errors.
    Io(String),
    /// There was an error parsing JSON.
    Json(String),
    /// The calculated and provided hashes for the matadata did not match.
    MetadataHashMismatch(Role),
    /// A necessary piece of metadata was missing.
    MissingMetadata(Role),
    /// The signed metadata had duplicate signatures from a particular key.
    NonUniqueSignatures(Role),
    /// The metadata did not provide any hash algorithms that this library can calculate.
    NoSupportedHashAlgorithms,
    /// A piece of metadata exceeded the provided or maximum allowed size.
    OversizedMetadata(Role),
    /// The calculated and provided hashes for the target did not match.
    UnknownRole(String),
    /// The target does not exist in valid metadata or could not be verified.
    UnavailableTarget,
    /// The role did not have enough signatures to meet the required threshold.
    UnmetThreshold(Role),
    /// The key type was not supported by this library.
    UnsupportedKeyType(String),
    /// The signature scheme was not supported by this library.
    UnsupportedSignatureScheme(String),
    /// There was an error in the verification process.
    VerificationFailure(String),
    /// A piece of metadata decreased its version when not allowed.
    VersionDecrease(Role),
}

impl Error {
    /// Helper to include the path that causd the error for FS I/O errors.
    pub fn from_io(err: io::Error, path: &Path) -> Error {
        Error::Io(format!("Path {:?} : {:?}", path, err))
    }
}

impl From<io::Error> for Error {
    fn from(err: io::Error) -> Error {
        Error::Io(format!("{:?}", err))
    }
}

impl From<json::Error> for Error {
    fn from(err: json::Error) -> Error {
        Error::Json(format!("{:?}", err))
    }
}

impl From<hyper::error::Error> for Error {
    fn from(err: hyper::error::Error) -> Error {
        Error::Http(format!("{:?}", err))
    }
}

impl From<hyper::error::ParseError> for Error {
    fn from(err: hyper::error::ParseError) -> Error {
        Error::Generic(format!("{:?}", err))
    }
}
