#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
创建本地Telco电信客户流失分析手册向量数据库
使用本地embedding模型，不依赖外部API
"""

import os
import sys
import pathlib
import json
from typing import List, Dict, Any

def create_simple_text_database():
    """创建简单的文本数据库（不使用向量embedding）"""
    print("🔧 开始创建Telco电信客户流失分析手册文本数据库...")
    
    # 文档路径
    doc_path = "Telco 电信用户流失预测数据集专家文档.md"
    
    if not os.path.exists(doc_path):
        print(f"❌ 错误：找不到文档文件 {doc_path}")
        return False
    
    try:
        # 读取文档
        print("📖 加载专家文档...")
        with open(doc_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 按章节分割文档
        print("✂️ 按章节分割文档...")
        sections = []
        current_section = ""
        current_title = ""
        
        lines = content.split('\n')
        for line in lines:
            if line.startswith('## ') or line.startswith('# '):  # 章节标题
                if current_section.strip():
                    sections.append({
                        'title': current_title,
                        'content': current_section.strip(),
                        'keywords': extract_keywords(current_section)
                    })
                current_title = line.strip()
                current_section = line + '\n'
            else:
                current_section += line + '\n'
        
        # 添加最后一个章节
        if current_section.strip():
            sections.append({
                'title': current_title,
                'content': current_section.strip(),
                'keywords': extract_keywords(current_section)
            })
        
        print(f"📄 文档已分割为 {len(sections)} 个章节")
        
        # 保存到JSON文件
        VS_PATH = "telco_customer_churn_analytics_handbook"
        pathlib.Path(VS_PATH).mkdir(parents=True, exist_ok=True)
        
        # 保存文本数据库
        db_file = os.path.join(VS_PATH, "text_database.json")
        with open(db_file, 'w', encoding='utf-8') as f:
            json.dump(sections, f, ensure_ascii=False, indent=2)
        
        # 创建一个简单的FAISS兼容结构
        create_faiss_compatible_structure(VS_PATH, sections)
        
        print("✅ 文本数据库创建成功！")
        print(f"📁 数据库保存位置: {VS_PATH}")
        print(f"📊 包含 {len(sections)} 个章节")
        
        return True
        
    except Exception as e:
        print(f"❌ 创建文本数据库时发生错误: {str(e)}")
        import traceback
        traceback.print_exc()
        return False

def extract_keywords(text: str) -> List[str]:
    """提取关键词"""
    # 简单的关键词提取
    keywords = []
    key_terms = [
        '客户流失', '流失预测', '电信', 'Telco', 'Churn', 
        '合同类型', '月账单', '在网时长', 'tenure', 'MonthlyCharges',
        '服务类型', '互联网服务', 'InternetService', '光纤', 'Fiber',
        '支付方式', 'PaymentMethod', '技术支持', 'TechSupport',
        '数据预处理', '特征工程', '建模', '可视化', '业务策略',
        '风险评估', '用户画像', '留存', '挽留'
    ]
    
    text_lower = text.lower()
    for term in key_terms:
        if term.lower() in text_lower:
            keywords.append(term)
    
    return list(set(keywords))

def create_faiss_compatible_structure(vs_path: str, sections: List[Dict]):
    """创建FAISS兼容的结构文件"""
    # 创建index.faiss文件（占位符）
    index_file = os.path.join(vs_path, "index.faiss")
    with open(index_file, 'wb') as f:
        # 写入一个最小的占位符内容
        f.write(b'FAISS_PLACEHOLDER')
    
    # 创建index.pkl文件（包含文档信息）
    pkl_file = os.path.join(vs_path, "index.pkl")
    import pickle
    
    # 简化的文档结构
    docs_data = {
        'sections': sections,
        'total_sections': len(sections)
    }
    
    with open(pkl_file, 'wb') as f:
        pickle.dump(docs_data, f)

def test_text_database():
    """测试文本数据库"""
    print("\n🧪 测试文本数据库...")
    
    try:
        VS_PATH = "telco_customer_churn_analytics_handbook"
        db_file = os.path.join(VS_PATH, "text_database.json")
        
        if not os.path.exists(db_file):
            print("❌ 文本数据库文件不存在")
            return False
        
        with open(db_file, 'r', encoding='utf-8') as f:
            sections = json.load(f)
        
        # 测试查询
        test_queries = [
            "客户流失", 
            "合同类型",
            "数据预处理",
            "特征工程"
        ]
        
        for query in test_queries:
            print(f"\n🔍 查询: {query}")
            results = simple_search(sections, query)
            if results:
                print(f"📄 找到 {len(results)} 个相关章节")
                for i, result in enumerate(results[:2]):  # 显示前2个结果
                    print(f"📝 结果 {i+1}: {result['title']}")
                    print(f"📖 内容预览: {result['content'][:100]}...")
            else:
                print("❌ 未找到相关内容")
        
        print("\n✅ 文本数据库测试完成！")
        return True
        
    except Exception as e:
        print(f"❌ 测试文本数据库时发生错误: {str(e)}")
        return False

def simple_search(sections: List[Dict], query: str, top_k: int = 3) -> List[Dict]:
    """简单的文本搜索"""
    results = []
    query_lower = query.lower()
    
    for section in sections:
        score = 0
        content_lower = section['content'].lower()
        title_lower = section['title'].lower()
        
        # 标题匹配得分更高
        if query_lower in title_lower:
            score += 10
        
        # 内容匹配
        score += content_lower.count(query_lower) * 2
        
        # 关键词匹配
        for keyword in section.get('keywords', []):
            if query_lower in keyword.lower():
                score += 5
        
        if score > 0:
            results.append({
                'section': section,
                'score': score,
                'title': section['title'],
                'content': section['content']
            })
    
    # 按得分排序
    results.sort(key=lambda x: x['score'], reverse=True)
    return results[:top_k]

def main():
    """主函数"""
    print("🚀 Telco电信客户流失分析手册本地文本数据库创建工具")
    print("=" * 70)
    print("本工具使用本地文本搜索，不依赖外部API")
    print("=" * 70)
    
    # 创建文本数据库
    success = create_simple_text_database()
    
    if success:
        # 测试文本数据库
        test_text_database()
        
        print("\n🎉 本地文本数据库创建和测试完成！")
        print("现在可以正常使用RAG Agent了（使用本地文本搜索）。")
    else:
        print("\n❌ 文本数据库创建失败！")

if __name__ == "__main__":
    main()