use jieba_rs::Jieba;
use once_cell::sync::Lazy;

static JIEBA: Lazy<Jieba> = Lazy::new(Jieba::new);

/// 檢查文本是否包含中文字符
/// 包括 CJK Unified Ideographs (U+4E00-U+9FFF) 和 Extension A (U+3400-U+4DBF)
pub fn contains_chinese(text: &str) -> bool {
    text.chars()
        .any(|c| ('\u{4e00}'..='\u{9fff}').contains(&c) || ('\u{3400}'..='\u{4dbf}').contains(&c))
}

/// 對中文文本進行分詞，並用空格連接分詞結果
/// 非中文文本保持不變
///
/// # 示例
/// ```
/// use momentry_core::core::text::tokenizer::tokenize_chinese_text;
///
/// assert_eq!(tokenize_chinese_text("這是一個測試"), "這 是 一 個 測 試");
/// assert_eq!(tokenize_chinese_text("Hello world"), "Hello world");
/// assert_eq!(tokenize_chinese_text("中文English混合"), "中文 English 混合");
/// ```
pub fn tokenize_chinese_text(text: &str) -> String {
    if contains_chinese(text) {
        // 使用精確模式分詞（cut=false）
        let tokens = JIEBA.cut(text, false);
        tokens.join(" ")
    } else {
        text.to_string()
    }
}

/// 從 JSON 內容中提取文本並進行分詞
/// 支持兩種格式：
/// 1. content->'data'->>'text' (中文視頻格式)
/// 2. content->'text' (英文視頻格式)
pub fn extract_and_tokenize_text(content: &serde_json::Value) -> String {
    let raw_text = content
        .get("data")
        .and_then(|data| data.get("text"))
        .and_then(|v| v.as_str())
        .or_else(|| content.get("text").and_then(|v| v.as_str()))
        .unwrap_or("");

    tokenize_chinese_text(raw_text)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_contains_chinese() {
        assert!(contains_chinese("中文"));
        assert!(contains_chinese("這是一個測試"));
        assert!(contains_chinese("混合文本 English 中文"));
        assert!(!contains_chinese("English only"));
        assert!(!contains_chinese("123"));
        assert!(!contains_chinese(""));
    }

    #[test]
    fn test_tokenize_chinese_text() {
        // 純中文
        assert_eq!(tokenize_chinese_text("這是一個測試"), "這 是 一 個 測 試");

        // 純英文
        assert_eq!(tokenize_chinese_text("Hello world"), "Hello world");

        // 中英混合
        assert_eq!(
            tokenize_chinese_text("中文English混合"),
            "中文 English 混合"
        );

        // 空字符串
        assert_eq!(tokenize_chinese_text(""), "");

        // 數字和標點
        assert_eq!(tokenize_chinese_text("測試123。"), "測 試 123 。");
    }

    #[test]
    fn test_extract_and_tokenize_text() {
        // 中文格式：content->'data'->>'text'
        let content1 = serde_json::json!({
            "data": {
                "text": "這是一個測試"
            }
        });
        assert_eq!(extract_and_tokenize_text(&content1), "這 是 一 個 測 試");

        // 英文格式：content->'text'
        let content2 = serde_json::json!({
            "text": "Hello world"
        });
        assert_eq!(extract_and_tokenize_text(&content2), "Hello world");

        // 混合格式：優先使用 data->text
        let content3 = serde_json::json!({
            "data": {
                "text": "中文測試"
            },
            "text": "English text"
        });
        assert_eq!(extract_and_tokenize_text(&content3), "中文 測 試");

        // 無文本
        let content4 = serde_json::json!({});
        assert_eq!(extract_and_tokenize_text(&content4), "");

        // 非字符串文本
        let content5 = serde_json::json!({
            "data": {
                "text": 123
            }
        });
        assert_eq!(extract_and_tokenize_text(&content5), "");
    }
}
