// ls-plus 项目的各个功能模块声明
// 这些模块包含了应用程序的核心功能

/// 命令行接口定义模块
/// 定义所有的CLI参数、子命令和选项
pub mod cli;

/// 错误处理模块
/// 定义应用程序中所有可能的错误类型和处理方式
pub mod error;

/// 配置管理模块
/// 处理用户配置文件的读取、写入和管理
pub mod config;

/// 显示输出模块
/// 负责将文件信息格式化并输出到终端
pub mod display;

/// 文件系统操作模块
/// 处理目录遍历、文件信息获取等文件系统相关操作
pub mod fs;

/// Git 集成模块
/// 提供Git状态信息的获取和显示功能
pub mod git;

/// 目录描述管理模块
/// 允许用户为目录添加自定义描述信息
pub mod descriptions;

// 导出常用的类型，让其他模块可以方便地使用
pub use cli::Cli;
pub use error::{LsPlusError, Result};

use clap::Parser;

/// 应用程序的主入口点
/// 使用 tokio 异步运行时来支持异步操作
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 使用 clap 解析命令行参数，生成 Cli 结构体实例
    let cli = Cli::parse();

    // 执行应用程序的主要逻辑
    let result = run(cli).await;

    // 处理执行结果
    match result {
        Ok(_) => Ok(()), // 成功执行，返回 Ok
        Err(e) => {
            // 发生错误时，打印错误信息并以错误代码退出
            eprintln!("Error: {e}");
            std::process::exit(1);
        }
    }
}

/// 应用程序的核心运行逻辑
/// 根据用户输入的参数执行相应的操作
async fn run(cli: Cli) -> Result<()> {
    // 首先检查是否有子命令需要处理
    // 子命令包括：config、tree、find、describe 等
    if let Some(command) = cli.command {
        return handle_command(command).await;
    }

    // 如果没有子命令，执行默认的目录列表行为
    // 调用文件系统模块获取指定路径下的所有文件和目录信息
    let entries = fs::list_directory(&cli.path, &cli).await?;

    // 将获取的文件信息传递给显示模块进行格式化输出
    display::render_entries(&entries, &cli).await?;

    Ok(())
}

/// 处理各种子命令的分发函数
/// 根据不同的子命令类型调用相应的处理函数
async fn handle_command(command: cli::Commands) -> Result<()> {
    match command {
        // 配置管理命令：show、set、reset、edit
        cli::Commands::Config { action } => config::handle_config_command(action).await,
        // 树形视图命令：以层次结构显示目录内容
        cli::Commands::Tree {
            path,
            max_depth,
            all,
        } => {
            // 创建专门用于树形显示的CLI配置
            let tree_cli = create_tree_cli(path, max_depth, all);
            // 递归获取目录结构
            let entries =
                fs::list_directory_recursive(&tree_cli.path, &tree_cli, max_depth).await?;
            // 以树形格式渲染输出
            display::render_tree(&entries, max_depth).await
        }
        // 文件搜索命令：根据模式搜索文件
        cli::Commands::Find {
            pattern,
            path,
            ignore_case,
            file_type,
        } => {
            // 创建专门用于搜索的CLI配置
            let find_cli = create_find_cli(path, pattern, ignore_case, file_type);
            // 执行文件搜索
            let matches = fs::find_files(&find_cli).await?;
            // 显示搜索结果
            display::render_search_results(&matches, &find_cli).await
        }
        // 目录描述管理命令：set、get、remove、list、search、cleanup
        cli::Commands::Describe { action } => descriptions::handle_describe_command(action).await,
    }
}

// 辅助函数：为不同的子命令创建相应的CLI配置

/// 为树形视图命令创建专门的CLI配置
///
/// # 参数
/// * `path` - 要显示的目录路径
/// * `_max_depth` - 最大显示深度（未使用的参数，以_开头表示）
/// * `all` - 是否显示隐藏文件
///
/// # 返回值
/// 返回配置了树形格式的Cli实例
fn create_tree_cli(path: std::path::PathBuf, _max_depth: Option<usize>, all: bool) -> Cli {
    Cli {
        path,                            // 设置目录路径
        all,                             // 设置是否显示隐藏文件
        format: cli::FormatOption::Tree, // 强制设置为树形格式
        ..Default::default()             // 其他选项使用默认值
    }
}

/// 为文件搜索命令创建专门的CLI配置
///
/// # 参数
/// * `path` - 搜索的目录路径
/// * `_pattern` - 搜索模式（未使用，实际搜索逻辑尚未实现）
/// * `_ignore_case` - 是否忽略大小写（未使用）
/// * `_file_type` - 文件类型过滤器（未使用）
///
/// # 返回值
/// 返回用于搜索的Cli实例
fn create_find_cli(
    path: std::path::PathBuf,
    _pattern: String,
    _ignore_case: bool,
    _file_type: Option<cli::FileTypeFilter>,
) -> Cli {
    Cli {
        path,                 // 设置搜索路径
        ..Default::default()  // 其他选项使用默认值
    }
}

/// 为Cli结构体实现Default trait，提供默认配置
/// 这样可以方便地创建带有合理默认值的CLI实例
impl Default for Cli {
    fn default() -> Self {
        Self {
            path: ".".into(),                   // 默认当前目录
            all: false,                         // 默认不显示隐藏文件
            long: false,                        // 默认不使用长格式
            human_readable: false,              // 默认不使用人类可读的文件大小
            time: false,                        // 默认不按时间排序
            reverse: false,                     // 默认不反向排序
            directories_first: false,           // 默认目录不优先显示
            follow_links: false,                // 默认不跟踪符号链接
            icons: false,                       // 默认不显示图标
            color: cli::ColorOption::Auto,      // 默认自动判断是否使用颜色
            format: cli::FormatOption::Default, // 默认使用标准格式
            file_type: None,                    // 默认不过滤文件类型
            max_depth: None,                    // 默认不限制递归深度
            git: false,                         // 默认不显示Git状态
            command: None,                      // 默认没有子命令
        }
    }
}
