use chrono::{DateTime, Utc};
use oauth2::{
basic::BasicErrorResponse, reqwest::AsyncHttpClientError, DeviceCodeErrorResponse,
RequestTokenError,
};
use reqwest::header::InvalidHeaderValue;
use thiserror::Error;
use url::ParseError;
#[derive(Error, Debug)]
pub enum Error {
#[error("Url parsing failed")]
UrlParseError(#[from] ParseError),
#[error("Failed executing oauth request")]
OAuthExecutionError(#[from] RequestTokenError<AsyncHttpClientError, BasicErrorResponse>),
#[error("Failed executing oauth request")]
OAuthDeviceCodeError(#[from] RequestTokenError<AsyncHttpClientError, DeviceCodeErrorResponse>),
#[error("Reqwest error")]
ReqwestError(#[from] reqwest::Error),
#[error("HTTP error")]
HttpError(#[from] http::Error),
#[error("Invalid redirect url")]
InvalidRedirectUrl(String),
#[error("Invalid header")]
InvalidHeader(#[from] InvalidHeaderValue),
#[error("Signature error")]
SignatureError(#[from] p256::ecdsa::Error),
#[error("General error")]
GeneralError(String),
#[error("JSON De/Serialization error")]
JsonError(#[from] serde_json::Error),
#[error("HTTP JSON Deserialization")]
JsonHttpResponseError {
status: http::StatusCode,
url: String,
headers: Box<http::HeaderMap>,
body: String,
inner: serde_json::Error,
},
#[error("Base64 Decode error")]
DecodeError(#[from] base64ct::Error),
#[error("I/O error")]
IoError(#[from] std::io::Error),
#[error("Failed processing HTTP request")]
InvalidRequest(String),
#[error("Token expired")]
TokenExpired(DateTime<Utc>),
#[error("unknown xal error")]
Unknown,
}