///|
/// UserDirs: user-facing standard directories (Desktop, Documents, Music, etc.).
/// v1 uses XDG_* env vars or $HOME subdirs.
pub struct UserDirs {
  home_dir : String
  audio_dir : String?
  desktop_dir : String?
  document_dir : String?
  download_dir : String?
  font_dir : String?
  picture_dir : String?
  public_dir : String?
  template_dir : String?
  video_dir : String?
}

///|
fn user_dir_from_env(env_key : String, home_default : String) -> String? {
  match get_env(env_key) {
    Some(p) => if p != "" { Some(p) } else { Some(home_default) }
    None => Some(home_default)
  }
}

///|
fn user_dirs_unix(home : String) -> UserDirs {
  UserDirs::{
    home_dir: home,
    audio_dir: user_dir_from_env("XDG_MUSIC_DIR", join([home, "Music"])),
    desktop_dir: user_dir_from_env("XDG_DESKTOP_DIR", join([home, "Desktop"])),
    document_dir: user_dir_from_env(
      "XDG_DOCUMENTS_DIR",
      join([home, "Documents"]),
    ),
    download_dir: user_dir_from_env(
      "XDG_DOWNLOAD_DIR",
      join([home, "Downloads"]),
    ),
    font_dir: Some(join([home, ".local", "share", "fonts"])),
    picture_dir: user_dir_from_env("XDG_PICTURES_DIR", join([home, "Pictures"])),
    public_dir: user_dir_from_env("XDG_PUBLICSHARE_DIR", join([home, "Public"])),
    template_dir: user_dir_from_env(
      "XDG_TEMPLATES_DIR",
      join([home, "Templates"]),
    ),
    video_dir: user_dir_from_env("XDG_VIDEOS_DIR", join([home, "Videos"])),
  }
}

///|
fn user_dirs_windows(home : String) -> UserDirs {
  UserDirs::{
    home_dir: home,
    audio_dir: Some(join([home, "Music"])),
    desktop_dir: Some(join([home, "Desktop"])),
    document_dir: Some(join([home, "Documents"])),
    download_dir: Some(join([home, "Downloads"])),
    font_dir: None,
    picture_dir: Some(join([home, "Pictures"])),
    public_dir: Some(join([home, "Public"])),
    template_dir: Some(join([home, "Templates"])),
    video_dir: Some(join([home, "Videos"])),
  }
}

///|
/// Create UserDirs from current environment. Returns None if home is not set.
/// On Windows uses USERPROFILE and standard subdirs; on Unix uses XDG_* or $HOME subdirs.
pub fn UserDirs::new() -> UserDirs? {
  match home_dir() {
    Some(home) =>
      Some(
        if is_windows() {
          user_dirs_windows(home)
        } else {
          user_dirs_unix(home)
        },
      )
    None => None
  }
}

///|
pub fn UserDirs::home_dir(self : UserDirs) -> String {
  self.home_dir
}

///|
pub fn UserDirs::audio_dir(self : UserDirs) -> String? {
  self.audio_dir
}

///|
pub fn UserDirs::desktop_dir(self : UserDirs) -> String? {
  self.desktop_dir
}

///|
pub fn UserDirs::document_dir(self : UserDirs) -> String? {
  self.document_dir
}

///|
pub fn UserDirs::download_dir(self : UserDirs) -> String? {
  self.download_dir
}

///|
pub fn UserDirs::font_dir(self : UserDirs) -> String? {
  self.font_dir
}

///|
pub fn UserDirs::picture_dir(self : UserDirs) -> String? {
  self.picture_dir
}

///|
pub fn UserDirs::public_dir(self : UserDirs) -> String? {
  self.public_dir
}

///|
pub fn UserDirs::template_dir(self : UserDirs) -> String? {
  self.template_dir
}

///|
pub fn UserDirs::video_dir(self : UserDirs) -> String? {
  self.video_dir
}