#!/usr/bin/env python3
"""
报告生成模块

功能：生成Markdown格式的综合评估报告
"""

import json
from datetime import datetime
from typing import Dict, Any


def generate_executive_summary(result: Dict[str, Any]) -> str:
    """
    生成执行摘要

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式的执行摘要
    """
    account_info = result.get("account_info", {})
    summary = result.get("analysis_summary", {})
    activity = result.get("detailed_analysis", {}).get("activity_metrics", {})
    engagement = result.get("detailed_analysis", {}).get("engagement_heat", {})
    network = result.get("detailed_analysis", {}).get("network_change", {})
    risk = result.get("detailed_analysis", {}).get("follower_risk_analysis", {}).get("risk_signals", {})

    md = ""
    md += "# 执行摘要\n\n"

    # 账号基本信息
    md += "**账号基本信息：**\n"
    md += f"- 账号ID：{account_info.get('id', '未知')}\n"
    md += f"- 用户名：{account_info.get('username', '未知')}\n"
    md += f"- 粉丝数：{account_info.get('followers_count', 0):,}\n"
    md += f"- 认证状态：{'已认证' if account_info.get('verified') else '未认证'}\n\n"

    # 核心数据展示
    md += "**核心指标：**\n"
    md += f"- 发帖总数：{activity.get('total_tweets', 0)}\n"
    md += f"- 日均发帖：{activity.get('daily_average', 0):.1f}\n"
    md += f"- 平均互动量：{engagement.get('average_total_engagement', 0):.0f}\n"
    md += f"- 互动峰值：{engagement.get('peak_engagement', 0):,}\n"
    md += f"- 粉丝增长率：{network.get('followers_growth_rate', 0):.1f}%\n\n"

    # 账号性质
    md += "**账号性质：**\n"
    md += f"- 角色：{summary.get('account_role', '未知')}\n"
    md += f"- 影响力质量：{summary.get('influence_quality', {}).get('quality_level', '未知')}\n"
    md += f"- 总体风险等级：{summary.get('overall_risk_level', '未知')}\n\n"

    # 核心活动与状态变化
    md += "**核心活动与状态变化：**\n"

    # 活跃度趋势
    if activity.get('daily_average', 0) >= 5:
        md += "- 活跃度：**较高**，日均发帖数超过5条\n"
    elif activity.get('daily_average', 0) >= 1:
        md += "- 活跃度：**中等**，日均发帖数在1-5条之间\n"
    else:
        md += "- 活跃度：**较低**，日均发帖数少于1条\n"

    # 粉丝增长趋势
    if network.get('followers_growth_rate', 0) > 10:
        md += f"- 粉丝增长：**快速上升**（增长率{network.get('followers_growth_rate', 0):.1f}%），可能存在异常增长\n"
    elif network.get('followers_growth_rate', 0) > 0:
        md += f"- 粉丝增长：**稳步上升**（增长率{network.get('followers_growth_rate', 0):.1f}%）\n"
    elif network.get('followers_growth_rate', 0) < -10:
        md += f"- 粉丝增长：**快速下降**（增长率{network.get('followers_growth_rate', 0):.1f}%）\n"
    else:
        md += f"- 粉丝增长：**基本稳定**\n"

    md += "\n"

    return md


def generate_data_visualization(result: Dict[str, Any]) -> str:
    """
    生成数据可视化部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    activity = result.get("detailed_analysis", {}).get("activity_metrics", {})
    engagement = result.get("detailed_analysis", {}).get("engagement_heat", {})
    network = result.get("detailed_analysis", {}).get("network_change", {})
    topic = result.get("detailed_analysis", {}).get("topic_analysis", {})
    community = result.get("detailed_analysis", {}).get("follower_risk_analysis", {}).get("core_community", {})

    md = ""
    md += "# 数据可视化\n\n"

    # 核心指标表
    md += "## 核心指标\n\n"
    md += "| 指标 | 数值 |\n"
    md += "|------|------|\n"
    md += f"| 发帖总数 | {activity.get('total_tweets', 0):,} |\n"
    md += f"| 日均发帖 | {activity.get('daily_average', 0):.2f} |\n"
    md += f"| 互动峰值 | {engagement.get('peak_engagement', 0):,} |\n"
    md += f"| 粉丝净增长 | {network.get('followers_change', 0):,} |\n"
    md += "\n"

    # 高频互动账号Top5
    md += "## 高频互动账号Top5\n\n"
    top_interactors = community.get("top_interactors", [])[:5]
    if top_interactors:
        md += "| 排名 | 账号 | 总互动数 | 转推率 | 回复率 | 互动模式 |\n"
        md += "|------|------|----------|--------|--------|----------|\n"
        for i, actor in enumerate(top_interactors, 1):
            md += f"| {i} | {actor.get('username', '未知')} | {actor.get('total_interactions', 0)} | "
            md += f"{actor.get('retweet_ratio', 0):.1f}% | {actor.get('reply_ratio', 0):.1f}% | "
            md += f"{actor.get('interaction_pattern', '未知')} |\n"
    else:
        md += "暂无高频互动账号数据\n"

    md += "\n"

    # 主要话题标签
    md += "## 主要话题标签\n\n"
    hashtags = []
    for narrative in topic.get("core_narratives", [])[:10]:
        key_element = narrative.get("key_element", "")
        if key_element and key_element.startswith("#"):
            hashtags.append(key_element)

    if hashtags:
        for ht in hashtags[:10]:
            md += f"- {ht}\n"
    else:
        md += "暂无话题标签数据\n"

    md += "\n"

    return md


def generate_core_narrative_section(result: Dict[str, Any]) -> str:
    """
    生成核心叙事部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    topic_analysis = result.get("detailed_analysis", {}).get("topic_analysis", {})

    md = ""
    md += "# 核心叙事\n\n"

    # 主要主题
    md += "## 本期集中推动的核心叙事\n\n"
    primary_topic = topic_analysis.get("topic_classification", {}).get("primary_topic", "未知")
    primary_confidence = topic_analysis.get("topic_classification", {}).get("primary_confidence", 0)

    md += f"**主要关注领域：** {primary_topic}\n"
    md += f"**置信度：** {primary_confidence:.2%}\n\n"

    # 核心叙事列表
    md += "## 核心叙事列表\n\n"
    narratives = topic_analysis.get("core_narratives", [])[:5]

    if narratives:
        md += "| 叙事ID | 类型 | 关键元素 | 出现次数 | 情感倾向 |\n"
        md += "|--------|------|----------|----------|----------|\n"
        for narrative in narratives:
            md += f"| {narrative.get('narrative_id', '未知')} | "
            md += f"{narrative.get('type', '未知')} | "
            md += f"{narrative.get('key_element', '未知')} | "
            md += f"{narrative.get('occurrence_count', 0)} | "
            md += f"{narrative.get('sentiment', '未知')} |\n"
    else:
        md += "暂未识别到明显的核心叙事\n"

    md += "\n"

    # 叙事变化分析
    md += "## 叙事变化分析\n\n"
    md += "⚠️ **注意：** 要进行叙事变化分析，需要跨时间周期的数据对比。\n"
    md += "当前报告仅基于单一时间周期的分析结果。\n\n"

    return md


def generate_role_strategy_section(result: Dict[str, Any]) -> str:
    """
    生成角色与策略部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    summary = result.get("analysis_summary", {})
    content_dist = result.get("detailed_analysis", {}).get("content_distribution", {})
    topic = result.get("detailed_analysis", {}).get("topic_analysis", {})

    md = ""
    md += "# 角色与策略\n\n"

    # 账号角色
    md += "## 账号角色\n\n"
    account_role = summary.get("account_role", "未知")

    role_descriptions = {
        "信息源": "该账号主要发布原创内容，可能是信息的原始来源",
        "放大器": "该账号大量转发其他账号的内容，主要起信息放大作用",
        "意见领袖": "该账号在特定领域（如政治）具有影响力，经常发表观点",
        "混合型": "该账号同时进行原创和转发，角色较为多元"
    }

    md += f"**角色：** {account_role}\n"
    md += f"**描述：** {role_descriptions.get(account_role, '未知角色')}\n\n"

    # 主要传播策略
    md += "## 主要传播策略\n\n"

    # 分析内容类型分布
    distribution = content_dist.get("distribution", {})
    original_ratio = distribution.get("original", 0)
    retweet_ratio = distribution.get("retweet", 0)

    strategies = []

    if original_ratio >= 70:
        strategies.append("✅ 制造原创内容，主动设置议程")
    if retweet_ratio >= 50:
        strategies.append("✅ 大量转发，扩大信息传播范围")

    # 分析话题标签使用
    narratives = topic.get("core_narratives", [])
    if len(narratives) > 3:
        strategies.append("✅ 使用特定话题标签，建立品牌识别")

    # 分析互动模式
    engagement = result.get("detailed_analysis", {}).get("engagement_heat", {})
    top_tweets = engagement.get("top_tweets", [])
    if top_tweets:
        # 检查是否有@有影响力用户
        for tweet in top_tweets[:3]:
            text = tweet.get("text", "")
            if "@" in text:
                strategies.append("✅ @有影响力用户，寻求互动和传播")
                break

    # 检测争议性内容
    risk = result.get("detailed_analysis", {}).get("follower_risk_analysis", {}).get("risk_signals", {})
    risk_level = risk.get("overall_risk_level", "未知")
    if risk_level in ["高", "极高"]:
        strategies.append("⚠️ 可能使用争议性内容吸引关注")

    if strategies:
        for strategy in strategies:
            md += f"{strategy}\n"
    else:
        md += "暂未识别到明显的传播策略\n"

    md += "\n"

    return md


def generate_influence_assessment_section(result: Dict[str, Any]) -> str:
    """
    生成影响力评估部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    influence_quality = result.get("analysis_summary", {}).get("influence_quality", {})
    follower_quality = result.get("detailed_analysis", {}).get("follower_risk_analysis", {}).get("follower_quality", {})

    md = ""
    md += "# 影响力评估\n\n"

    # 影响力真实性
    md += "## 影响力真实性\n\n"
    quality_level = influence_quality.get("quality_level", "未知")
    reality_score = influence_quality.get("reality_score", 0)

    md += f"**质量等级：** {quality_level}\n"
    md += f"**真实性评分：** {reality_score}/100\n\n"

    # 关键因素
    md += "### 关键因素\n\n"
    factors = influence_quality.get("factors", {})

    md += f"- 平均互动量：{factors.get('average_engagement', 0):.0f}\n"
    md += f"- 粉丝增长率：{factors.get('followers_growth_rate', 0):.1f}%\n"
    md += f"- 高质量粉丝比例：{factors.get('high_quality_follower_ratio', 0):.1f}%\n"
    md += f"- 机器人嫌疑比例：{factors.get('bot_suspect_ratio', 0):.1f}%\n\n"

    # 影响力评估结论
    md += "### 评估结论\n\n"

    if reality_score >= 80:
        md += "✅ **影响力真实可信** - 粉丝互动模式正常，无明显异常信号\n"
    elif reality_score >= 50:
        md += "⚠️ **影响力基本真实，但存在一些疑点** - 需要持续观察\n"
    else:
        md += "❌ **影响力高度可疑** - 存在大量机器人粉丝或互动异常\n"

    md += "\n\n"

    # 主要影响受众
    md += "## 主要影响受众\n\n"

    # 基于话题分析推断受众类型
    topic_primary = result.get("detailed_analysis", {}).get("topic_analysis", {}).get("topic_classification", {}).get("primary_topic", "")

    audience_map = {
        "政治": "政治关注者、政策制定者、政治活动家",
        "科技": "科技从业者、技术爱好者、创新者",
        "经济": "商业人士、投资者、经济学家",
        "社会": "社会活动家、公民组织、普通公众",
        "环境": "环保主义者、科学家、政策制定者",
        "军事": "军事爱好者、安全分析师、政策制定者",
        "娱乐": "娱乐消费者、粉丝群体、媒体从业者",
        "健康": "医疗从业者、患者群体、公众",
    }

    primary_audience = audience_map.get(topic_primary, "无法确定")

    md += f"基于主要话题（{topic_primary}），推断该账号的主要影响受众为：\n\n"
    md += f"- {primary_audience}\n\n"

    return md


def generate_risk_signals_section(result: Dict[str, Any]) -> str:
    """
    生成风险信号部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    risk_analysis = result.get("detailed_analysis", {}).get("follower_risk_analysis", {}).get("risk_signals", {})

    md = ""
    md += "# 风险信号\n\n"

    # 总体风险等级
    overall_risk = risk_analysis.get("overall_risk_level", "未知")
    risk_score = risk_analysis.get("risk_score", 0)

    # 风险等级颜色标注
    risk_colors = {
        "极高": "🔴",
        "高": "🟠",
        "中": "🟡",
        "低": "🟢",
        "未发现明显风险": "✅"
    }

    md += "## 总体风险等级\n\n"
    md += f"{risk_colors.get(overall_risk, '')} **风险等级：** {overall_risk}\n"
    md += f"**风险评分：** {str(risk_score)}\n\n"

    # 详细风险信号
    md += "## 风险信号详情\n\n"

    risk_signals = risk_analysis.get("risk_signals", [])

    if risk_signals:
        md += "| 风险类型 | 出现次数 | 风险等级 | 评分 |\n"
        md += "|----------|----------|----------|------|\n"
        for signal in risk_signals:
            md += f"| {signal.get('type', '未知')} | "
            md += f"{signal.get('occurrence_count', 0)} | "
            md += f"{signal.get('risk_level', '未知')} | "
            md += f"{signal.get('score', 0)} |\n"
    else:
        md += "✅ 未检测到明显的风险信号\n"

    md += "\n"

    # 风险评估说明
    md += "## 风险评估说明\n\n"

    if overall_risk in ["极高", "高"]:
        md += "⚠️ **警示：** 该账号存在高风险行为，建议密切监控并准备应对措施。\n\n"
    elif overall_risk == "中":
        md += "⚠️ **注意：** 该账号存在一些风险信号，建议纳入常规监控。\n\n"
    else:
        md += "✅ **安全：** 该账号未检测到明显风险信号。\n\n"

    return md


def generate_conclusion_recommendations_section(result: Dict[str, Any]) -> str:
    """
    生成结论与建议部分

    Args:
        result: 综合评估结果

    Returns:
        str: Markdown格式
    """
    summary = result.get("analysis_summary", {})
    recommendations = result.get("recommendations", [])

    md = ""
    md += "# 结论与建议\n\n"

    # 总体判断
    md += "## 总体判断\n\n"

    account_role = summary.get("account_role", "未知")
    influence_quality = summary.get("influence_quality", {}).get("quality_level", "未知")
    overall_risk = summary.get("overall_risk_level", "未知")

    md += f"该账号在过去的观察期内表现为：\n\n"
    md += f"- **角色：** {account_role}\n"
    md += f"- **影响力质量：** {influence_quality}\n"
    md += f"- **风险等级：** {overall_risk}\n\n"

    # 给出总体判断
    if overall_risk in ["极高", "高"] or influence_quality in ["部分虚假", "高度可疑"]:
        md += "### 判断：需要持续监控\n\n"
        md += "该账号存在高风险或影响力可疑，建议纳入高危监控列表，24小时实时追踪其活动。\n\n"
    elif overall_risk == "中":
        md += "### 判断：需要常规监控\n\n"
        md += "该账号存在一些风险信号，建议纳入常规监控列表，定期（如每周）检查其活动。\n\n"
    else:
        md += "### 判断：一般关注\n\n"
        md += "该账号风险较低，可作为常规信息源，但建议保持适度关注。\n\n"

    # 后续行动建议
    md += "## 后续行动建议\n\n"

    if recommendations:
        md += "| 优先级 | 类型 | 行动 | 描述 |\n"
        md += "|--------|------|------|------|\n"
        for rec in recommendations:
            priority_emoji = {
                "紧急": "🔴",
                "高": "🟠",
                "中": "🟡",
                "低": "🟢"
            }.get(rec.get("priority", "中"), "")

            md += f"| {priority_emoji} {rec.get('priority', '未知')} | "
            md += f"{rec.get('type', '未知')} | "
            md += f"{rec.get('action', '未知')} | "
            md += f"{rec.get('description', '未知')} |\n"
    else:
        md += "暂无具体建议\n"

    md += "\n"

    return md


def generate_full_report(result: Dict[str, Any]) -> str:
    """
    生成完整报告

    Args:
        result: 综合评估结果

    Returns:
        str: 完整的Markdown报告
    """
    md = ""
    md += "# 社交媒体账号综合评估报告\n\n"

    # 报告元数据
    account_info = result.get("account_info", {})
    md += f"**生成时间：** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
    md += f"**目标账号：** @{account_info.get('username', '未知')}\n"
    md += f"**分析周期：** 近{result.get('parameters', {}).get('days_back', 90)}天\n\n"
    md += "---\n\n"

    # 各个部分
    md += generate_executive_summary(result)
    md += "---\n\n"
    md += generate_data_visualization(result)
    md += "---\n\n"
    md += generate_core_narrative_section(result)
    md += "---\n\n"
    md += generate_role_strategy_section(result)
    md += "---\n\n"
    md += generate_influence_assessment_section(result)
    md += "---\n\n"
    md += generate_risk_signals_section(result)
    md += "---\n\n"
    md += generate_conclusion_recommendations_section(result)

    return md


def main():
    """命令行入口，用于测试"""
    import sys

    # 示例数据
    example_result = {
        "account_info": {
            "id": "example_account",
            "username": "Example User",
            "followers_count": 100000,
            "verified": True,
        },
        "analysis_summary": {
            "account_role": "信息源",
            "influence_quality": {
                "quality_level": "真实",
                "reality_score": 85
            },
            "overall_risk_level": "低",
        },
        "detailed_analysis": {
            "activity_metrics": {
                "total_tweets": 100,
                "daily_average": 1.1,
            },
            "content_distribution": {
                "total": 100,
                "original": 70,
                "retweet": 20,
                "quote": 5,
                "reply": 5,
                "distribution": {
                    "original": 70.0,
                    "retweet": 20.0,
                    "quote": 5.0,
                    "reply": 5.0
                }
            },
            "engagement_heat": {
                "average_total_engagement": 500,
                "peak_engagement": 10000,
                "top_tweets": []
            },
            "network_change": {
                "followers_change": 5000,
                "followers_growth_rate": 5.2,
            },
            "topic_analysis": {
                "topic_classification": {
                    "primary_topic": "政治",
                    "primary_confidence": 0.8
                },
                "core_narratives": [
                    {
                        "narrative_id": "narrative_1",
                        "type": "hashtag_based",
                        "key_element": "#policy",
                        "occurrence_count": 10,
                        "sentiment": "负面"
                    }
                ]
            },
            "follower_risk_analysis": {
                "follower_quality": {
                    "total": 1000,
                    "high_quality_count": 800,
                    "high_quality_ratio": 80.0,
                    "bot_suspect_count": 20,
                    "bot_suspect_ratio": 2.0
                },
                "core_community": {
                    "top_interactors": []
                },
                "risk_signals": {
                    "overall_risk_level": "低",
                    "risk_score": 2,
                    "risk_signals": []
                }
            }
        },
        "recommendations": [
            {
                "type": "监控",
                "priority": "中",
                "action": "纳入常规监控列表",
                "description": "作为信息源，需要持续监测其内容质量和可信度"
            }
        ],
        "parameters": {
            "days_back": 90
        }
    }

    if len(sys.argv) > 1:
        with open(sys.argv[1], 'r', encoding='utf-8') as f:
            example_result = json.load(f)

    report = generate_full_report(example_result)
    print(report)


if __name__ == "__main__":
    main()
