use serde::Deserialize;

/// Declarative install configuration
#[derive(Debug, Deserialize)]
pub struct InstallConfig {
    /// Drive Configuration
    pub drive: DriveConfig,
    /// General Configuration
    pub general: GeneralConfig,
    /// Package Configuration
    pub pkg: PackageConfig,
    /// User Configuration
    pub user: Vec<UserConfig>,
    /// SSH Configuration
    pub ssh: Option<SSHConfig>,
    /// Ollama AI Config
    pub ai: Option<OllamaConfig>,
}

#[derive(Debug, Deserialize)]
pub struct OllamaConfig {
    pub models: Option<Vec<String>>,
    pub gpu: bool,
}

#[derive(Debug, Deserialize)]
pub struct SSHConfig {
    pub sshd_config: Option<String>,
    pub key: Vec<SSHKey>,
}

#[derive(Debug, Deserialize)]
pub struct SSHKey {
    pub key: String,
    pub users: Vec<String>,
}

#[derive(Debug, Deserialize)]
pub struct UserConfig {
    pub name: String,
    pub password: String,
    pub doas_root: bool,
}

#[derive(Debug, Deserialize)]
pub struct PackageConfig {
    /// Packages to install
    pub pkg: Vec<String>,
    /// Enable libvirt
    pub virtualization: bool,
    /// Enable docker
    pub docker: bool,
}

#[derive(Debug, Deserialize)]
pub struct DriveConfig {
    /// Boot Drive Path
    pub boot: String,
    /// Root Drive Path
    pub root: String,
    /// Enable encryption on root
    pub encryption: Option<String>,
}

#[derive(Debug, Deserialize)]
pub struct GeneralConfig {
    /// Presets
    pub mode: InstallMode,
    /// System locale
    pub locale: String,
    /// Keymap
    pub keymap: String,
    /// Timezone
    pub timezone: String,
    /// Hostname
    pub hostname: String,
}

#[derive(Debug, Deserialize)]
pub enum InstallMode {
    /// Basic Arch Linux Installation
    Base,
    /// navOS Desktop
    Desktop,
    /// navOS Server
    Server,

    // TODO : Evaluate
    Kiosk,
}