#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
综合分析引擎
整合原因分析、行为分析、反应解读、传播分析
"""

from typing import Dict, List, Any, Optional
from dataclasses import dataclass, field
from datetime import datetime
from .collector import SourceItem, VerificationResult
from .narrative import NarrativeAnalyzer
from .timeline import TimelineAnalyzer


@dataclass
class CauseAnalysis:
    """原因分析结果"""
    direct_cause: str = ""
    deep_cause: str = ""
    factors: Dict[str, Any] = field(default_factory=dict)
    political_context: str = ""
    historical_background: str = ""
    external_influence: str = ""


@dataclass
class BehaviorAnalysis:
    """行为分析结果"""
    actor: str = ""
    action_type: str = ""  # military, diplomatic, economic, cognitive
    action_description: str = ""
    tactical_intent: str = ""
    strategic_goal: str = ""
    behavior_pattern: str = ""
    cognitive_tactics: List[str] = field(default_factory=list)


@dataclass
class ReactionAnalysis:
    """反应解读结果"""
    actor: str = ""
    official_statement: str = ""
    military_adjustment: str = ""
    economic_measures: str = ""
    narrative_guidance: str = ""
    internal_differences: str = ""
    stance: str = ""
    objectives: str = ""


@dataclass
class InfluenceAssessment:
    """多维影响评估"""
    political_diplomatic: str = ""
    security_military: str = ""
    economic_social: str = ""
    opinion_psychological: str = ""
    risk_level: str = ""  # low, medium, high, critical


@dataclass
class Scenario:
    """情景推演"""
    name: str = ""
    probability: float = 0.0
    description: str = ""
    key_factors: List[str] = field(default_factory=list)
    potential_outcomes: List[str] = field(default_factory=list)


@dataclass
class DeepAnalysis:
    """深度研判与展望"""
    root_cause: str = ""
    nature_qualification: str = ""
    scenarios: List[Scenario] = field(default_factory=list)
    conflict_risks: List[str] = field(default_factory=list)
    misjudgment_factors: List[str] = field(default_factory=list)
    recommendations: List[str] = field(default_factory=list)


@dataclass
class ComprehensiveReport:
    """综合分析报告"""
    title: str = ""
    event_overview: str = ""
    timeline: List[Dict[str, Any]] = field(default_factory=list)
    key_evidence: List[SourceItem] = field(default_factory=list)
    
    # 第二章：关键方行为与意图分析
    china_mainland_behavior: BehaviorAnalysis = field(default_factory=BehaviorAnalysis)
    taiwan_region_behavior: BehaviorAnalysis = field(default_factory=BehaviorAnalysis)
    external_behavior: BehaviorAnalysis = field(default_factory=BehaviorAnalysis)
    
    # 第三章：多维影响评估
    influence_assessment: InfluenceAssessment = field(default_factory=InfluenceAssessment)
    
    # 第四章：深度研判与展望
    deep_analysis: DeepAnalysis = field(default_factory=DeepAnalysis)
    
    # 元数据
    analysis_time: str = ""
    analyzer: str = ""
    classification: str = "内部参考"
    verification_results: List[VerificationResult] = field(default_factory=list)


class EventAnalyzer:
    """事件综合分析器"""
    
    def __init__(self):
        self.narrative_analyzer = NarrativeAnalyzer()
        self.timeline_analyzer = TimelineAnalyzer()
        self.collected_items: List[SourceItem] = []
    
    def analyze_event(self, 
                   event_title: str,
                   keywords: List[str],
                   time_range: str = None,
                   sources: List[str] = None) -> ComprehensiveReport:
        """
        执行完整的事件分析
        
        Args:
            event_title: 事件标题
            keywords: 搜索关键词
            time_range: 时间范围
            sources: 信源类型列表 ['official', 'media', 'think_tank']
        
        Returns:
            ComprehensiveReport: 完整分析报告
        """
        print(f"=== 开始事件综合分析 ===")
        print(f"事件标题: {event_title}")
        print(f"关键词: {', '.join(keywords)}")
        print(f"时间范围: {time_range or '未指定'}")
        
        # 创建报告框架
        report = ComprehensiveReport(
            title=event_title,
            analysis_time=datetime.now().isoformat(),
            analyzer="瞰宇（全球数据采集师 + 认知战研究专家）"
        )
        
        # 步骤1：采集多信源数据
        print("\n[步骤1/5] 采集多信源数据...")
        # 这里应该调用 collector，简化处理
        # self.collect_sources(keywords, sources, time_range)
        
        # 步骤2：原因分析
        print("\n[步骤2/5] 原因分析...")
        report.deep_analysis.root_cause = self._analyze_causes(
            self.collected_items, keywords)
        
        # 步骤3：行为分析
        print("\n[步骤3/5] 行为分析...")
        report.china_mainland_behavior = self._analyze_behavior(
            '中国大陆', self.collected_items)
        report.taiwan_region_behavior = self._analyze_behavior(
            '台湾地区当局（对手分析）', self.collected_items)
        report.external_behavior = self._analyze_behavior(
            '美国及其他外部势力', self.collected_items)
        
        # 步骤4：反应解读
        print("\n[步骤4/5] 反应解读...")
        # reactions = self._analyze_reactions(self.collected_items)
        
        # 步骤5：传播与叙事分析
        print("\n[步骤5/5] 传播与叙事分析...")
        narrative_analysis = self.narrative_analyzer.analyze(
            [item.content for item in self.collected_items])
        
        # 影响评估
        print("\n[步骤6/6] 影响评估...")
        report.influence_assessment = self._assess_influence(
            self.collected_items, narrative_analysis)
        
        # 深度研判与展望
        print("\n[步骤7/7] 深度研判与展望...")
        report.deep_analysis = self._deep_analyze(
            self.collected_items, narrative_analysis, keywords)
        
        print("\n=== 分析完成 ===")
        return report
    
    def _analyze_causes(self, items: List[SourceItem], 
                     keywords: List[str]) -> str:
        """
        原因分析
        
        分析事件直接诱因与深层原因
        """
        # 简化实现，实际应使用NLP和知识图谱
        causes = []
        
        # 基于关键词和内容推断
        for item in items:
            content_lower = item.content.lower()
            
            # 检测政治日程
            if any(kw in content_lower for kw in ['选举', '政治', '政策']):
                causes.append("政治日程相关")
            
            # 检测战略试探
            if any(kw in content_lower for kw in ['试探', '示威', '威慑']):
                causes.append("战略试探行为")
            
            # 检测历史因素
            if any(kw in content_lower for kw in ['历史', '长期', '矛盾']):
                causes.append("历史因素影响")
            
            # 检测外部势力
            if any(kw in content_lower for kw in ['美国', '外部', '势力']):
                causes.append("外部势力示意")
        
        # 去重
        causes = list(set(causes))
        
        if not causes:
            return "需要更多信息进行原因分析"
        
        return "; ".join(causes)
    
    def _analyze_behavior(self, actor: str, 
                      items: List[SourceItem]) -> BehaviorAnalysis:
        """
        行为分析
        
        剖析各方具体行为模式、战术或政治意图
        """
        behavior = BehaviorAnalysis(actor=actor)
        
        # 简化实现，提取相关行为描述
        for item in items:
            if actor in item.source_name:
                # 提取行为类型
                content_lower = item.content.lower()
                
                if '军事' in content_lower or '演习' in content_lower:
                    behavior.action_type = "军事"
                    behavior.tactical_intent = "威慑与防御"
                elif '外交' in content_lower or '声明' in content_lower:
                    behavior.action_type = "外交"
                    behavior.tactical_intent = "政策宣示"
                elif '经济' in content_lower or '制裁' in content_lower:
                    behavior.action_type = "经济"
                    behavior.tactical_intent = "施压与反制"
                
                # 检测认知战术
                if '舆论' in content_lower or '叙事' in content_lower:
                    behavior.cognitive_tactics.append("舆论引导")
                if '叙事框架' in content_lower or '情感' in content_lower:
                    behavior.cognitive_tactics.append("情感操纵")
        
        return behavior
    
    def _assess_influence(self, items: List[SourceItem],
                          narrative_analysis: Dict) -> InfluenceAssessment:
        """
        影响评估
        
        多维影响评估：政治外交、安全军事、经济社会、舆论心理
        """
        influence = InfluenceAssessment()
        
        # 基于信源类型和叙事强度评估影响
        official_count = sum(1 for item in items if item.source_type == 'official')
        media_count = sum(1 for item in items if item.source_type == 'media')
        
        # 政治外交影响
        if official_count > 0:
            influence.political_diplomatic = "存在政治外交影响，官方表态积极"
        
        # 舆论心理影响
        if narrative_analysis.get('sentiment_intensity', 0) > 0.6:
            influence.opinion_psychological = (
                f"舆论情感强烈，强度为 "
                f"{narrative_analysis.get('sentiment_intensity', 0):.2f}"
            )
        
        # 安全军事影响
        military_keywords = ['军事', '演习', '部署', '威慑', '防御']
        if any(kw in ' '.join([item.content for item in items]).lower() 
               for kw in military_keywords):
            influence.security_military = "存在安全军事影响"
        
        # 风险等级评估
        influence.risk_level = self._assess_risk_level(
            influence, narrative_analysis)
        
        return influence
    
    def _assess_risk_level(self, influence: InfluenceAssessment,
                           narrative_analysis: Dict) -> str:
        """评估风险等级"""
        risk_score = 0
        
        if influence.political_diplomatic:
            risk_score += 1
        if influence.security_military:
            risk_score += 2
        if influence.economic_social:
            risk_score += 1
        if influence.opinion_psychological:
            risk_score += 1
        
        # 基于叙事强度调整
        sentiment_intensity = narrative_analysis.get('sentiment_intensity', 0)
        if sentiment_intensity > 0.7:
            risk_score += 1
        
        if risk_score >= 4:
            return "critical"
        elif risk_score >= 3:
            return "high"
        elif risk_score >= 2:
            return "medium"
        else:
            return "low"
    
    def _deep_analyze(self, items: List[SourceItem],
                    narrative_analysis: Dict,
                    keywords: List[str]) -> DeepAnalysis:
        """
        深度研判与展望
        
        事件根源与性质定性、情景推演、冲突风险点
        """
        deep_analysis = DeepAnalysis()
        
        # 事件性质定性
        if '军事' in ' '.join([item.content for item in items]).lower():
            deep_analysis.nature_qualification = "军事安全事件"
        elif '政治' in ' '.join([item.content for item in items]).lower():
            deep_analysis.nature_qualification = "政治外交事件"
        else:
            deep_analysis.nature_qualification = "混合威胁事件"
        
        # 情景推演
        deep_analysis.scenarios = [
            Scenario(
                name="基线情景",
                probability=0.5,
                description="维持现状，各方保持克制",
                potential_outcomes=["局势稳定", "持续对峙", "缓慢降温"]
            ),
            Scenario(
                name="升级情景",
                probability=0.3,
                description="紧张加剧，冲突风险上升",
                potential_outcomes=["军事对峙", "外交摩擦", "经济制裁"]
            ),
            Scenario(
                name="缓情景",
                probability=0.2,
                description="各方展现克制，寻求对话",
                potential_outcomes=["降温", "谈判接触", "关系改善"]
            )
        ]
        
        # 冲突风险点
        deep_analysis.conflict_risks = [
            "误判风险：信息不对称可能导致误判",
            "升级风险：强硬表态可能升级为实际行动",
            "外部干预：外部势力可能推波助澜",
            "认知战：虚假信息可能影响公众认知"
        ]
        
        # 误判因素
        deep_analysis.misjudgment_factors = [
            "信息不完整：部分信息可能不准确或滞后",
            "意图误读：可能误解对方真实意图",
            "时机把握：关键时点的误判",
            "内部协调：各方内部协调不畅"
        ]
        
        # 建议
        deep_analysis.recommendations = [
            "保持克制与冷静，避免过度反应",
            "加强信息沟通，减少信息不对称",
            "做好预案准备，防范升级风险",
            "强化认知防御，抵御虚假信息",
            "寻求外交对话，和平解决分歧"
        ]
        
        return deep_analysis


def main():
    """测试主函数"""
    analyzer = EventAnalyzer()
    
    # 模拟数据
    from .collector import SourceItem
    mock_items = [
        SourceItem(
            id='test1',
            url='http://example.com',
            source_type='official',
            source_name='中国国防部',
            content='中国国防部发表声明，强调维护国家主权和领土完整的决心。',
            title='国防部声明',
            timestamp=datetime.now().isoformat()
        ),
        SourceItem(
            id='test2',
            url='http://example.com',
            source_type='media',
            source_name='新华社',
            content='新华社报道，相关军事演习是例行性的，不针对任何特定国家。',
            title='军事演习报道',
            timestamp=datetime.now().isoformat()
        )
    ]
    
    analyzer.collected_items = mock_items
    
    # 执行分析
    report = analyzer.analyze_event(
        event_title='测试事件分析',
        keywords=['演习', '台湾'],
        time_range='2026-03-31'
    )
    
    print(f"\n报告标题: {report.title}")
    print(f"风险等级: {report.influence_assessment.risk_level}")
    print(f"情景数量: {len(report.deep_analysis.scenarios)}")


if __name__ == '__main__':
    main()
