#!/usr/bin/env python3
"""
内容分析模块

功能：
1. 统计内容类型分布（原创、转推、引用、回复）
2. 互动热度分析
3. 识别爆文（互动量最高的推文）
"""

import json
from typing import List, Dict, Any
from collections import defaultdict


def analyze_content_distribution(tweets: List[Dict[str, Any]]) -> Dict[str, Any]:
    """
    分析内容类型分布

    Args:
        tweets: 推文列表

    Returns:
        Dict: 内容类型分布
    """
    if not tweets:
        return {
            "total": 0,
            "original": 0,
            "retweet": 0,
            "quote": 0,
            "reply": 0,
            "distribution": {}
        }

    counts = {
        "original": 0,
        "retweet": 0,
        "quote": 0,
        "reply": 0
    }

    for tweet in tweets:
        # 转推
        if tweet.get("is_retweet_of") or tweet.get("retweeted_status"):
            counts["retweet"] += 1
        # 引用
        elif tweet.get("quoted_status") or tweet.get("is_quote"):
            counts["quote"] += 1
        # 回复
        elif tweet.get("in_reply_to_status_id") or tweet.get("in_reply_to_user_id"):
            counts["reply"] += 1
        # 原创
        else:
            counts["original"] += 1

    total = sum(counts.values())
    distribution = {
        k: round(v / total * 100, 2) if total > 0 else 0
        for k, v in counts.items()
    }

    return {
        "total": total,
        **counts,
        "distribution": distribution
    }


def analyze_engagement_heat(tweets: List[Dict[str, Any]], top_n: int = 5) -> Dict[str, Any]:
    """
    分析互动热度

    Args:
        tweets: 推文列表
        top_n: 返回Top N推文

    Returns:
        Dict: 互动热度分析结果
    """
    if not tweets:
        return {
            "average_likes": 0,
            "average_retweets": 0,
            "average_replies": 0,
            "average_total_engagement": 0,
            "peak_engagement": 0,
            "top_tweets": []
        }

    # 计算每条推文的互动量
    tweet_engagement = []
    for tweet in tweets:
        likes = tweet.get("like_count", 0) or tweet.get("favorite_count", 0)
        retweets = tweet.get("retweet_count", 0)
        replies = tweet.get("reply_count", 0)

        total = likes + retweets + replies

        tweet_engagement.append({
            "id": tweet.get("id"),
            "text": tweet.get("text", "")[:200] + "..." if len(tweet.get("text", "")) > 200 else tweet.get("text", ""),
            "created_at": tweet.get("created_at"),
            "likes": likes,
            "retweets": retweets,
            "replies": replies,
            "total_engagement": total
        })

    # 计算平均值
    total_tweets = len(tweet_engagement)
    avg_likes = sum(t["likes"] for t in tweet_engagement) / total_tweets
    avg_retweets = sum(t["retweets"] for t in tweet_engagement) / total_tweets
    avg_replies = sum(t["replies"] for t in tweet_engagement) / total_tweets
    avg_total = (avg_likes + avg_retweets + avg_replies)

    # 峰值互动
    peak_engagement = max(t["total_engagement"] for t in tweet_engagement)

    # Top N爆文
    top_tweets = sorted(tweet_engagement, key=lambda x: x["total_engagement"], reverse=True)[:top_n]

    return {
        "average_likes": round(avg_likes, 2),
        "average_retweets": round(avg_retweets, 2),
        "average_replies": round(avg_replies, 2),
        "average_total_engagement": round(avg_total, 2),
        "peak_engagement": peak_engagement,
        "top_tweets": top_tweets
    }


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

    # 示例数据
    example_tweets = [
        {
            "id": "1",
            "text": "This is an original tweet",
            "created_at": "2026-04-01T10:00:00Z",
            "like_count": 10000,
            "retweet_count": 5000,
            "reply_count": 1000,
        },
        {
            "id": "2",
            "text": "RT @user: This is a retweet",
            "created_at": "2026-04-01T11:00:00Z",
            "is_retweet_of": "tweet_id",
            "like_count": 5000,
            "retweet_count": 2000,
            "reply_count": 500,
        },
        {
            "id": "3",
            "text": "@user This is a reply",
            "created_at": "2026-04-01T12:00:00Z",
            "in_reply_to_status_id": "original_id",
            "like_count": 1000,
            "retweet_count": 200,
            "reply_count": 100,
        },
    ]

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

    # 内容分布
    content_dist = analyze_content_distribution(example_tweets)
    print("=== 内容分布 ===")
    print(json.dumps(content_dist, ensure_ascii=False, indent=2))

    print("\n=== 互动热度 ===")
    engagement = analyze_engagement_heat(example_tweets)
    print(json.dumps(engagement, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
