use std::path::PathBuf;
use thiserror::Error;

use crate::entities;

#[derive(Debug, Error)]
pub(crate) enum Error {
    #[error("Cannot open database file '{0}' ({1})")]
    CannotOpenDatabase(PathBuf, std::io::Error),
    #[error("Cannot read database file '{0}' ({1})")]
    CannotReadDatabase(PathBuf, serde_json::error::Error),
    #[error("Cannot write database file '{0}' ({1})")]
    CannotWriteDatabase(PathBuf, serde_json::error::Error),
    #[error("{0}")]
    Database(#[from] crate::database::Error),
    #[error("{0}")]
    Io(#[from] std::io::Error),
    #[error("{0}")]
    Json(#[from] serde_json::Error),
    #[error("{0}")]
    Confy(#[from] confy::ConfyError),
    #[error("{0}")]
    Entities(#[from] entities::Error),
    #[error("{0}")]
    ParseIntError(#[from] std::num::ParseIntError),
    #[error("Cannot convert '{0}' into a date/time")]
    CannotConvertDateTime(String),
    #[error("No current job.")]
    NoCurrentJob,
    #[error("Current job {0} is deleted.")]
    CurrentJobDeleted(usize),
    #[error("Invalid time range: {0}..{1}")]
    InvalidRange(String, String),
    #[error("Invalid time range: {0}")]
    InvalidRangeEx(String),
    #[error("No jobs found in time range: {0}")]
    NoJobsFoundInRange(String),
    #[error("{0}")]
    Typst(#[from] typst_as_lib::TypstAsLibError),
    #[error("{0}")]
    TypstPDF(String),
    #[error("{0}")]
    Inquire(#[from] inquire::error::InquireError),
}

pub(crate) type Result<T> = std::result::Result<T, Error>;
