package os

import "base:runtime"

// ```
// Windows:  C:\Users\Alice
// macOS:    /Users/Alice
// Linux:    /home/alice
// ```
@(require_results)
user_home_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_home_dir(allocator)
}

// Files that applications can regenerate/refetch at a loss of speed, e.g. shader caches
//
// Sometimes deleted for system maintenance
//
// ```
// Windows:  C:\Users\Alice\AppData\Local
// macOS:    /Users/Alice/Library/Caches
// Linux:    /home/alice/.cache
// ```
@(require_results)
user_cache_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_cache_dir(allocator)
}

// User-hidden application data
//
// ```
// Windows:  C:\Users\Alice\AppData\Local ("C:\Users\Alice\AppData\Roaming" if `roaming`)
// macOS:    /Users/Alice/Library/Application Support
// Linux:    /home/alice/.local/share
// ```
//
// NOTE: (Windows only) `roaming` is for syncing across multiple devices within a *domain network*
@(require_results)
user_data_dir :: proc(allocator: runtime.Allocator, roaming := false) -> (dir: string, err: Error) {
	return _user_data_dir(allocator, roaming)
}

// Non-essential application data, e.g. history, ui layout state
//
// ```
// Windows:  C:\Users\Alice\AppData\Local
// macOS:    /Users/Alice/Library/Application Support
// Linux:    /home/alice/.local/state
// ```
@(require_results)
user_state_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_state_dir(allocator)
}

// Application log files
//
// ```
// Windows:  C:\Users\Alice\AppData\Local
// macOS:    /Users/Alice/Library/Logs
// Linux:    /home/alice/.local/state
// ```
@(require_results)
user_log_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_log_dir(allocator)
}

// Application settings/preferences
//
// ```
// Windows:  C:\Users\Alice\AppData\Local ("C:\Users\Alice\AppData\Roaming" if `roaming`)
// macOS:    /Users/Alice/Library/Application Support
// Linux:    /home/alice/.config
// ```
//
// NOTE: (Windows only) `roaming` is for syncing across multiple devices within a *domain network*
@(require_results)
user_config_dir :: proc(allocator: runtime.Allocator, roaming := false) -> (dir: string, err: Error) {
	return _user_config_dir(allocator, roaming)
}

// ```
// Windows:  C:\Users\Alice\Music
// macOS:    /Users/Alice/Music
// Linux:    /home/alice/Music
// ```
@(require_results)
user_music_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_music_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Desktop
// macOS:    /Users/Alice/Desktop
// Linux:    /home/alice/Desktop
// ```
@(require_results)
user_desktop_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_desktop_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Documents
// macOS:    /Users/Alice/Documents
// Linux:    /home/alice/Documents
// ```
@(require_results)
user_documents_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_documents_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Downloads
// macOS:    /Users/Alice/Downloads
// Linux:    /home/alice/Downloads
// ```
@(require_results)
user_downloads_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_downloads_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Pictures
// macOS:    /Users/Alice/Pictures
// Linux:    /home/alice/Pictures
// ```
@(require_results)
user_pictures_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_pictures_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Public
// macOS:    /Users/Alice/Public
// Linux:    /home/alice/Public
// ```
@(require_results)
user_public_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_public_dir(allocator)
}

// ```
// Windows:  C:\Users\Alice\Videos
// macOS:    /Users/Alice/Movies
// Linux:    /home/alice/Videos
// ```
@(require_results)
user_videos_dir :: proc(allocator: runtime.Allocator) -> (dir: string, err: Error) {
	return _user_videos_dir(allocator)
}