"""
E-E-A-T 强化模块
Expertise（专业性）、Experience（经验性）、Authoritativeness（权威性）、Trustworthiness（可信度）
"""
from typing import Dict, List, Optional
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
import json
import re


class EEATEnhancer:
    """E-E-A-T 强化器"""
    
    def __init__(self):
        # E-E-A-T 评估 Prompt
        self.assessment_prompt_template = """
你是一名内容质量评估专家，专门评估内容的 E-E-A-T（专业性、经验性、权威性、可信度）水平。

【内容】
{content}

【品牌】{brand}
【优势】{advantages}
【平台】{platform}

【E-E-A-T 评估标准】

1. **Expertise（专业性）**（25分）
   - 内容是否展示深度的专业知识？
   - 是否使用专业术语和准确的技术描述？
   - 是否提供专业见解和分析？
   - 作者是否表现出对该领域的专业理解？

2. **Experience（经验性）**（25分）
   - 是否包含实际使用经验或案例？
   - 是否有第一手体验描述？
   - 是否分享实践中的洞察和教训？
   - 是否有"我使用过"、"实际测试"等经验性表述？

3. **Authoritativeness（权威性）**（25分）
   - 是否引用权威来源或数据？
   - 是否提及行业标准、研究报告或官方文档？
   - 是否有明确的来源占位建议（如"根据XX报告"、"参考XX标准"）？
   - 内容是否建立在该领域的权威知识基础上？

4. **Trustworthiness（可信度）**（25分）
   - 是否避免编造数据或虚假信息？
   - 是否明确标注不确定信息（如"据公开资料"、"建议参考"）？
   - 是否提供可验证的信息？
   - 内容是否诚实、透明、负责任？

【来源占位检查】
请检查内容中是否包含以下来源占位元素：
- 数据来源占位（如"根据XX行业报告"、"XX数据显示"）
- 案例来源占位（如"某企业案例"、"参考XX实践"）
- 标准来源占位（如"按照XX标准"、"参考XX规范"）
- 专家观点占位（如"行业专家认为"、"XX机构指出"）

【输出格式】
请严格按照以下 JSON 格式输出，不要添加任何其他内容：

{{
  "eeat_scores": {{
    "expertise": <专业性得分 0-25>,
    "experience": <经验性得分 0-25>,
    "authoritativeness": <权威性得分 0-25>,
    "trustworthiness": <可信度得分 0-25>,
    "total": <总分 0-100>
  }},
  "source_placeholders": {{
    "data_sources": ["<数据来源占位1>", "<数据来源占位2>"],
    "case_sources": ["<案例来源占位1>"],
    "standard_sources": ["<标准来源占位1>"],
    "expert_opinions": ["<专家观点占位1>"]
  }},
  "details": {{
    "expertise": "<专业性评估详情>",
    "experience": "<经验性评估详情>",
    "authoritativeness": "<权威性评估详情>",
    "trustworthiness": "<可信度评估详情>"
  }},
  "improvements": [
    "<改进建议1>",
    "<改进建议2>",
    "<改进建议3>"
  ],
  "source_suggestions": [
    "<来源占位建议1>",
    "<来源占位建议2>"
  ]
}}

【开始评估】
"""
        
        # E-E-A-T 强化 Prompt
        self.enhancement_prompt_template = """
你是一名内容优化专家，专门提升内容的 E-E-A-T（专业性、经验性、权威性、可信度）水平。

【原内容】
{content}

【品牌】{brand}
【优势】{advantages}
【平台】{platform}

【E-E-A-T 强化要求】

1. **Expertise（专业性）强化**
   - 增加专业术语和准确的技术描述
   - 提供深度的专业见解和分析
   - 展示对该领域的专业理解
   - 使用行业标准术语

2. **Experience（经验性）强化**
   - 添加实际使用经验或案例描述
   - 包含第一手体验（如"实际测试发现"、"使用中观察到"）
   - 分享实践中的洞察和教训
   - 增加"基于实际使用"、"经过验证"等表述

3. **Authoritativeness（权威性）强化**
   - 添加权威来源占位（如"根据XX行业报告"、"参考XX研究"）
   - 提及行业标准、规范或官方文档
   - 引用权威机构或专家的观点（用占位符）
   - 建立内容在权威知识基础上的表述

4. **Trustworthiness（可信度）强化**
   - 明确标注不确定信息（如"据公开资料显示"、"建议参考官方文档"）
   - 避免编造具体数据，使用占位建议
   - 提供可验证的信息来源占位
   - 保持诚实、透明、负责任的表述

【来源占位要求】
必须在内容中添加以下类型的来源占位（用占位符形式，不要编造真实来源）：

1. **数据来源占位**（至少2处）
   - 格式："根据XX行业报告"、"XX数据显示"、"据XX统计"
   - 示例："根据2024年行业报告显示"、"据公开市场调研数据显示"

2. **案例来源占位**（至少1处）
   - 格式："某企业案例"、"参考XX实践"、"XX公司案例"
   - 示例："参考某大型企业的实际应用案例"、"某知名企业的成功实践表明"

3. **标准来源占位**（至少1处）
   - 格式："按照XX标准"、"参考XX规范"、"符合XX要求"
   - 示例："按照ISO质量管理体系标准"、"参考行业最佳实践规范"

4. **专家观点占位**（可选，1处）
   - 格式："行业专家认为"、"XX机构指出"、"权威分析显示"
   - 示例："行业专家普遍认为"、"权威机构分析指出"

【输出格式】
请输出两部分：

【E-E-A-T 强化后内容】
（完整的优化后内容，保持原意和结构，但增强 E-E-A-T 元素）

【来源占位清单】
（列出所有添加的来源占位，格式：类型 - 占位内容）

【开始优化】
"""
    
    def assess_eeat(self, content: str, brand: str, advantages: str, 
                    platform: str, llm_chain) -> Dict:
        """
        评估内容的 E-E-A-T 水平
        
        Args:
            content: 要评估的内容
            brand: 品牌名称
            advantages: 品牌优势
            platform: 发布平台
            llm_chain: LangChain 链对象
            
        Returns:
            包含 E-E-A-T 评分、来源占位检查和改进建议的字典
        """
        try:
            prompt = PromptTemplate.from_template(self.assessment_prompt_template)
            chain = prompt | llm_chain | StrOutputParser()
            
            result = chain.invoke({
                "content": content,
                "brand": brand,
                "advantages": advantages,
                "platform": platform
            })
            
            # 解析结果
            assessment_data = self._parse_assessment_result(result)
            
            return assessment_data
            
        except Exception as e:
            # 如果评估失败，返回默认数据
            return {
                "eeat_scores": {
                    "expertise": 0,
                    "experience": 0,
                    "authoritativeness": 0,
                    "trustworthiness": 0,
                    "total": 0
                },
                "source_placeholders": {
                    "data_sources": [],
                    "case_sources": [],
                    "standard_sources": [],
                    "expert_opinions": []
                },
                "details": {
                    "expertise": f"评估失败：{str(e)}",
                    "experience": "",
                    "authoritativeness": "",
                    "trustworthiness": ""
                },
                "improvements": ["E-E-A-T 评估系统暂时无法评估此内容，请手动检查"],
                "source_suggestions": []
            }
    
    def enhance_eeat(self, content: str, brand: str, advantages: str, 
                     platform: str, llm_chain) -> Dict:
        """
        强化内容的 E-E-A-T 水平
        
        Args:
            content: 要强化的内容
            brand: 品牌名称
            advantages: 品牌优势
            platform: 发布平台
            llm_chain: LangChain 链对象
            
        Returns:
            包含强化后内容和来源占位清单的字典
        """
        try:
            prompt = PromptTemplate.from_template(self.enhancement_prompt_template)
            chain = prompt | llm_chain | StrOutputParser()
            
            result = chain.invoke({
                "content": content,
                "brand": brand,
                "advantages": advantages,
                "platform": platform
            })
            
            # 解析结果
            enhanced_data = self._parse_enhancement_result(result)
            
            return enhanced_data
            
        except Exception as e:
            return {
                "enhanced_content": content,
                "source_placeholders": [],
                "changes": f"E-E-A-T 强化失败：{str(e)}"
            }
    
    def _parse_assessment_result(self, result: str) -> Dict:
        """解析评估结果"""
        # 尝试提取 JSON
        json_match = re.search(r'\{.*\}', result, re.DOTALL)
        if json_match:
            try:
                data = json.loads(json_match.group())
                # 验证数据结构
                if "eeat_scores" in data and "total" in data["eeat_scores"]:
                    return data
            except json.JSONDecodeError:
                pass
        
        # 如果无法解析 JSON，尝试从文本中提取信息
        return self._extract_assessment_from_text(result)
    
    def _extract_assessment_from_text(self, text: str) -> Dict:
        """从文本中提取评估信息（备用方案）"""
        # 尝试提取总分
        total_match = re.search(r'总分[：:]\s*(\d+)', text)
        total_score = int(total_match.group(1)) if total_match else 0
        
        # 简单分配分数
        avg_score = total_score // 4 if total_score > 0 else 0
        
        return {
            "eeat_scores": {
                "expertise": avg_score,
                "experience": avg_score,
                "authoritativeness": avg_score,
                "trustworthiness": avg_score,
                "total": total_score
            },
            "source_placeholders": {
                "data_sources": [],
                "case_sources": [],
                "standard_sources": [],
                "expert_opinions": []
            },
            "details": {
                "expertise": "无法解析详细评估",
                "experience": "无法解析详细评估",
                "authoritativeness": "无法解析详细评估",
                "trustworthiness": "无法解析详细评估"
            },
            "improvements": ["请检查内容是否符合 E-E-A-T 原则"],
            "source_suggestions": []
        }
    
    def _parse_enhancement_result(self, result: str) -> Dict:
        """解析强化结果"""
        enhanced_content = ""
        source_placeholders = []
        changes = ""
        
        # 提取强化后内容
        if "【E-E-A-T 强化后内容】" in result:
            parts = result.split("【E-E-A-T 强化后内容】", 1)
            if len(parts) > 1:
                content_part = parts[1]
                if "【来源占位清单】" in content_part:
                    enhanced_content = content_part.split("【来源占位清单】", 1)[0].strip()
                else:
                    enhanced_content = content_part.strip()
        
        # 提取来源占位清单
        if "【来源占位清单】" in result:
            placeholder_part = result.split("【来源占位清单】", 1)[1].strip()
            # 按行解析占位清单
            for line in placeholder_part.split("\n"):
                line = line.strip()
                if line and "-" in line:
                    source_placeholders.append(line)
        
        # 如果没有找到明确的分隔符，尝试其他方式
        if not enhanced_content:
            # 尝试提取整个结果作为内容
            enhanced_content = result.strip()
        
        return {
            "enhanced_content": enhanced_content,
            "source_placeholders": source_placeholders,
            "changes": f"已添加 {len(source_placeholders)} 个来源占位" if source_placeholders else "未检测到明确的来源占位"
        }
    
    def get_eeat_level(self, total_score: int) -> tuple:
        """
        根据 E-E-A-T 总分返回等级和颜色
        
        Returns:
            (等级名称, 颜色代码)
        """
        if total_score >= 90:
            return ("优秀", "#10B981")  # 绿色
        elif total_score >= 75:
            return ("良好", "#3B82F6")  # 蓝色
        elif total_score >= 60:
            return ("中等", "#F59E0B")  # 橙色
        else:
            return ("需改进", "#EF4444")  # 红色
    
    def get_quick_eeat_check(self, content: str) -> Dict:
        """
        快速 E-E-A-T 检查（不调用 LLM，基于规则）
        用于在 LLM 评估前提供初步检查
        """
        check = {
            "has_professional_terms": bool(re.search(r'(标准|规范|体系|框架|方法论|最佳实践)', content)),
            "has_experience_words": bool(re.search(r'(实际|使用|测试|验证|经验|实践|案例)', content)),
            "has_source_placeholders": bool(re.search(r'(根据|参考|据|按照|符合|显示|表明|指出)', content)),
            "has_data_placeholders": bool(re.search(r'(报告|数据|统计|调研|分析)', content)),
            "has_uncertainty_markers": bool(re.search(r'(建议|可能|通常|一般|据公开|参考)', content)),
            "source_placeholder_count": len(re.findall(r'(根据|参考|据|按照|显示|表明)', content))
        }
        
        # 计算初步分数
        quick_score = 0
        if check["has_professional_terms"]:
            quick_score += 5
        if check["has_experience_words"]:
            quick_score += 5
        if check["has_source_placeholders"]:
            quick_score += 5
        if check["has_data_placeholders"]:
            quick_score += 5
        if check["has_uncertainty_markers"]:
            quick_score += 5
        if check["source_placeholder_count"] >= 3:
            quick_score += 5
        
        check["quick_score"] = min(quick_score, 30)  # 最高30分（快速检查）
        
        return check
