use std::{fmt::Display, io::Error};

use serde_with::SerializeDisplay;

#[derive(SerializeDisplay)]
pub enum ProcessError {
    NotInstalled,
    AlreadyRunning,
    InvalidID,
    InvalidVersion,
    IOError(Error),
    FormatError(String), // String errors supremacy
    InvalidPlatform,
    OpenerError(tauri_plugin_opener::Error)
}

impl Display for ProcessError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let s = match self {
            ProcessError::NotInstalled => "Game not installed",
            ProcessError::AlreadyRunning => "Game already running",
            ProcessError::InvalidID => "Invalid game ID",
            ProcessError::InvalidVersion => "Invalid game version",
            ProcessError::IOError(error) => &error.to_string(),
            ProcessError::InvalidPlatform => "This game cannot be played on the current platform",
            ProcessError::FormatError(e) => &format!("Failed to format template: {e}"),
            ProcessError::OpenerError(error) => &format!("Failed to open directory: {error}"),
                    };
        write!(f, "{s}")
    }
}
