// 错误处理工具模块 - 将英文错误转换为中文

/// 将通用的 Rust 错误转换为中文描述
pub fn to_chinese_error<T: ToString>(e: T) -> String {
    let msg = e.to_string();
    translate_sql_error(&msg)
}

/// 翻译 SQLite 错误为中文
fn translate_sql_error(msg: &str) -> String {
    let lower = msg.to_lowercase();
    
    if lower.contains("unique constraint") {
        if lower.contains("code") {
            return "操作失败：商品编码已存在，请使用其他编码".to_string();
        }
        return "操作失败：数据已存在，请检查是否重复添加".to_string();
    }
    if lower.contains("no such table") {
        return "系统错误：数据库表不存在，请重新初始化数据库".to_string();
    }
    if lower.contains("database not initialized") {
        return "系统错误：数据库未初始化".to_string();
    }
    if lower.contains("not found") || lower.contains("no rows") {
        return "操作失败：未找到对应的数据记录".to_string();
    }
    if lower.contains("out of memory") {
        return "系统错误：内存不足".to_string();
    }
    if lower.contains("permission denied") {
        return "系统错误：权限不足".to_string();
    }
    if lower.contains("connection refused") {
        return "系统错误：数据库连接失败".to_string();
    }
    if lower.contains("timeout") {
        return "系统错误：操作超时".to_string();
    }
    if lower.contains("already exists") {
        return "操作失败：数据已存在".to_string();
    }
    if lower.contains("库存不足") || lower.contains("insufficient stock") {
        return "操作失败：库存不足".to_string();
    }
    if lower.contains("cannot") && lower.contains("admin") {
        return "操作失败：不能删除或修改默认管理员账户".to_string();
    }
    if lower.contains("用户名已存在") || lower.contains("username already exists") {
        return "操作失败：用户名已存在".to_string();
    }
    if lower.contains("密码错误") || lower.contains("wrong password") {
        return "操作失败：密码错误".to_string();
    }
    if lower.contains("原密码错误") || lower.contains("old password") {
        return "操作失败：原密码错误".to_string();
    }
    if lower.contains("图片") || lower.contains("image") && lower.contains("fail") {
        return "操作失败：图片处理出错，请重试".to_string();
    }
    
    // 如果已经有中文，直接返回
    if has_chinese(msg) {
        return msg.to_string();
    }
    
    // 其他错误，返回原始信息加上中文前缀
    format!("系统错误：{}", msg)
}

/// 判断字符串是否包含中文字符
fn has_chinese(s: &str) -> bool {
    s.chars().any(|c| c >= '\u{4e00}' && c <= '\u{9fff}')
}

/// 用于 Rust 命令的便捷包装：在 map_err 中使用
pub fn err(msg: &str) -> String {
    msg.to_string()
}
