#pragma once

#include <string>

// --- Namespace SystemUtils: utilidades multiplataforma para operaciones del sistema ---
namespace SystemUtils {
    // --- Enums ---
    enum class Result {  // Códigos de resultado para operaciones del sistema
        SUCCESS = 0,
        PERMISSION_DENIED,  // Sin permisos para crear la carpeta
        PATH_TOO_LONG,      // Ruta demasiado larga
        ALREADY_EXISTS,     // Ya existe (solo si se considera error)
        INVALID_PATH,       // Ruta inválida
        UNKNOWN_ERROR       // Error desconocido
    };

    // --- Estructuras ---
    struct FolderConfig {            // Configuración para creación de carpetas
        bool create_parents{true};   // Crear carpetas padre si no existen
        bool fail_if_exists{false};  // Fallar si la carpeta ya existe
        int permissions{0755};       // Permisos Unix (ignorado en Windows)

        // Constructor con valores por defecto
        FolderConfig() = default;
    };

    // --- Funciones ---
    auto createApplicationFolder(const std::string& app_name, std::string& out_path) -> Result;                              // Crea la carpeta del sistema donde guardar datos de la aplicación
    auto createApplicationFolder(const std::string& app_name, std::string& out_path, const FolderConfig& config) -> Result;  // Crea la carpeta del sistema con configuración personalizada
    auto createFolder(const std::string& path) -> Result;                                                                    // Crea una carpeta en la ruta especificada
    auto createFolder(const std::string& path, const FolderConfig& config) -> Result;                                        // Crea una carpeta con configuración personalizada
    auto getApplicationDataPath(const std::string& app_name) -> std::string;                                                 // Obtiene la ruta de datos de la aplicación (sin crearla)
    auto folderExists(const std::string& path) -> bool;                                                                      // Verifica si una carpeta existe
    auto resultToString(Result result) -> const char*;                                                                       // Convierte un código de resultado a string descriptivo
    auto getHomeDirectory() -> std::string;                                                                                  // Obtiene el directorio home del usuario
    auto getTempDirectory() -> std::string;                                                                                  // Obtiene el directorio temporal del sistema

}  // namespace SystemUtils
