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

功能：
1. 生成事件清单（按时间/影响力排序）
2. 生成每个事件的详细分析报告
3. 生成汇总报告
"""

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


def sort_events_by_time(events: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
    """按时间排序事件（最新的在前）"""
    return sorted(events, key=lambda e: e.get("start_time", ""), reverse=True)


def sort_events_by_influence(events: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
    """按影响力排序事件"""
    return sorted(
        events,
        key=lambda e: e.get("analysis", {}).get("influence", {}).get("score", 0),
        reverse=True
    )


def generate_event_markdown(event: Dict[str, Any], account_info: Dict[str, Any] = None) -> str:
    """
    生成单个事件的Markdown报告

    Args:
        event: 事件数据（包含基础数据和分析结果）
        account_info: 账号信息

    Returns:
        str: Markdown格式报告
    """
    md = ""
    md += f"## 事件：{event.get('id', '未知事件')}\n\n"

    # 基本信息
    md += "**时间范围：** "
    md += f"{event.get('start_time_str', '未知')} - {event.get('end_time_str', '未知')}\n"

    duration = event.get("duration_hours", 0)
    md += f"（持续 {round(duration, 1)} 小时）\n\n"

    md += "**推文统计：** "
    md += f"共 {event.get('tweet_count', 0)} 条推文 "
    md += f"（原创 {event.get('original_count', 0)}，转发 {event.get('retweet_count', 0)}）\n\n"

    # 互动数据
    engagement = event.get("total_engagement", {})
    md += "**互动数据：**\n"
    md += f"- 点赞：{engagement.get('likes', 0):,}\n"
    md += f"- 转发：{engagement.get('retweets', 0):,}\n"
    md += f"- 回复：{engagement.get('replies', 0):,}\n"
    md += f"- **总计：{engagement.get('total', 0):,}**\n\n"

    # 分析结果
    analysis = event.get("analysis", {})

    if "influence" in analysis:
        influence = analysis["influence"]
        md += "**影响力评估：**\n"
        md += f"- **评分：{influence.get('score', 0)}**\n"
        md += f"- **等级：{influence.get('level', '未知')}**\n\n"

    if "topic" in analysis:
        topic = analysis["topic"]
        md += "**主题分类：**\n"
        md += f"- **主要主题：{topic.get('primary_topic', '未知')}**\n"
        md += f"- 置信度：{topic.get('primary_confidence', 0)}\n"

        secondary = topic.get('secondary_topics', [])
        if secondary:
            md += f"- 次要主题：{', '.join(secondary)}\n"
        md += "\n"

    if "sentiment" in analysis:
        sentiment = analysis["sentiment"]
        md += "**情感倾向：**\n"
        md += f"- 倾向：{sentiment.get('sentiment', '未知')}\n"
        md += f"- 置信度：{sentiment.get('confidence', 0)}\n\n"

    if "propagation_pattern" in analysis:
        prop = analysis["propagation_pattern"]
        md += "**传播模式：**\n"
        md += f"- 模式：{prop.get('pattern', '未知')}\n"
        md += f"- 描述：{prop.get('description', '')}\n\n"

    # 话题标签
    hashtags = event.get("hashtags", [])[:10]
    if hashtags:
        md += "**话题标签：**\n"
        for h in hashtags[:10]:
            md += f"- #{h['tag']} ({h['count']}次)\n"
        md += "\n"

    # 关键推文
    key_tweet = event.get("key_tweet")
    if key_tweet:
        md += "**关键推文：**\n"
        md += f"```\n{key_tweet.get('text', '')}\n```\n"
        md += f"- 发布时间：{key_tweet.get('created_at', '')}\n"
        md += f"- 点赞：{key_tweet.get('like_count', 0):,} | 转发：{key_tweet.get('retweet_count', 0):,} | 回复：{key_tweet.get('reply_count', 0):,}\n\n"

    md += "---\n\n"

    return md


def generate_summary_report(
    events: List[Dict[str, Any]],
    account_info: Dict[str, Any] = None,
    time_range: str = "近一个月"
) -> str:
    """
    生成汇总报告

    Args:
        events: 事件列表
        account_info: 账号信息
        time_range: 时间范围描述

    Returns:
        str: Markdown格式汇总报告
    """
    md = ""
    md += "# 社交媒体事件挖掘分析报告\n\n"

    # 元数据
    md += f"**生成时间：** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"

    if account_info:
        md += "**目标账号：**\n"
        md += f"- 账号ID：{account_info.get('id', '未知')}\n"
        md += f"- 用户名：{account_info.get('username', '未知')}\n"
        md += f"- 简介：{account_info.get('bio', '')}\n"
        md += f"- 粉丝数：{account_info.get('followers_count', 0):,}\n"
        md += f"- 关注数：{account_info.get('following_count', 0):,}\n"
        md += f"- 认证状态：{account_info.get('verified', False)}\n\n"

    md += f"**分析范围：** {time_range}\n\n"

    # 统计摘要
    total_events = len(events)
    total_tweets = sum(e.get("tweet_count", 0) for e in events)
    total_engagement = sum(e.get("total_engagement", {}).get("total", 0) for e in events)

    md += "## 统计摘要\n\n"
    md += f"- **识别事件数：** {total_events}\n"
    md += f"- **分析推文数：** {total_tweets}\n"
    md += f"- **总互动量：** {total_engagement:,}\n\n"

    # 事件清单（按影响力排序）
    sorted_by_influence = sort_events_by_influence(events)

    md += "## 事件清单（按影响力排序）\n\n"
    md += "| 事件ID | 时间范围 | 推文数 | 互动量 | 影响力等级 | 主题 |\n"
    md += "|--------|----------|--------|--------|------------|------|\n"

    for i, event in enumerate(sorted_by_influence, 1):
        event_id = event.get("id", "未知")
        time_range_event = f"{event.get('start_time_str', '')[:10]}"
        tweet_count = event.get("tweet_count", 0)
        engagement = event.get("total_engagement", {}).get("total", 0)
        influence_level = event.get("analysis", {}).get("influence", {}).get("level", "未知")
        primary_topic = event.get("analysis", {}).get("topic", {}).get("primary_topic", "未知")

        md += f"| {i}. {event_id} | {time_range_event} | {tweet_count} | {engagement:,} | {influence_level} | {primary_topic} |\n"

    md += "\n"

    return md


def generate_full_report(
    events: List[Dict[str, Any]],
    account_info: Dict[str, Any] = None,
    time_range: str = "近一个月"
) -> str:
    """
    生成完整报告（汇总 + 详细）

    Args:
        events: 事件列表
        account_info: 账号信息
        time_range: 时间范围描述

    Returns:
        str: 完整的Markdown报告
    """
    # 1. 汇总部分
    report = generate_summary_report(events, account_info, time_range)

    # 2. 详细事件分析
    report += "## 详细事件分析\n\n"

    # 按时间排序（最新的在前）
    sorted_by_time = sort_events_by_time(events)

    for event in sorted_by_time:
        report += generate_event_markdown(event, account_info)

    return report


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

    # 示例数据
    example_events = [
        {
            "id": "event_1",
            "start_time_str": "2024-03-15 10:00:00",
            "end_time_str": "2024-03-16 10:00:00",
            "duration_hours": 24.0,
            "tweet_count": 10,
            "original_count": 8,
            "retweet_count": 2,
            "total_engagement": {
                "likes": 10000,
                "retweets": 5000,
                "replies": 1000,
                "total": 16000,
            },
            "hashtags": [
                {"tag": "launch", "count": 5},
                {"tag": "product", "count": 3},
            ],
            "key_tweet": {
                "text": "Exciting announcement coming soon!",
                "created_at": "2024-03-15T10:00:00Z",
                "like_count": 5000,
                "retweet_count": 2000,
                "reply_count": 500,
            },
            "analysis": {
                "influence": {
                    "score": 8000.0,
                    "level": "高",
                },
                "topic": {
                    "primary_topic": "产品发布",
                    "primary_confidence": 0.8,
                    "secondary_topics": ["技术更新"],
                },
                "sentiment": {
                    "sentiment": "正面",
                    "confidence": 0.7,
                },
                "propagation_pattern": {
                    "pattern": "主动发声",
                    "description": "以原创内容为主",
                },
            },
        }
    ]

    example_account = {
        "id": "elonmusk",
        "username": "Elon Musk",
        "bio": "Mars, cars, chips & rockets",
        "followers_count": 150000000,
        "following_count": 100,
        "verified": True,
    }

    if len(sys.argv) > 1:
        # 从文件读取
        with open(sys.argv[1], 'r', encoding='utf-8') as f:
            data = json.load(f)
            example_events = data.get("events", example_events)
            example_account = data.get("account_info", example_account)

    # 生成报告
    report = generate_full_report(example_events, example_account)

    print(report)


if __name__ == "__main__":
    main()
