#!/usr/bin/env python3
"""
媒体评估脚本

功能：
1. 智能采集媒体基本信息（历史、规模、影响力）
2. 评估媒体政治倾向
3. 生成媒体画像
"""

import json
import re
from typing import Dict, Any, Optional, List
from dataclasses import dataclass


@dataclass
class MediaProfile:
    """媒体画像"""
    name: str
    url: str
    established_year: Optional[int]
    headquarters: Optional[str]
    owner: Optional[str]
    political_leaning: str
    credibility_score: float  # 0-100
    audience_scale: str  # "global", "regional", "national", "local"
    language: List[str]
    media_type: str  # "news_agency", "newspaper", "tv", "online", "magazine"
    notes: List[str]


# 国际主流媒体数据库（示例，实际应用中应使用外部知识库）
INTERNATIONAL_MEDIA_DB = {
    "reuters.com": {
        "name": "路透社 (Reuters)",
        "established": 1851,
        "headquarters": "伦敦，英国",
        "owner": "汤森路透",
        "political_leaning": "中间偏中立",
        "credibility": 88,
        "audience_scale": "global",
        "media_type": "news_agency",
        "description": "世界最大的国际多媒体新闻通讯社之一，以快速、准确、中立著称。"
    },
    "apnews.com": {
        "name": "美联社 (AP)",
        "established": 1846,
        "headquarters": "纽约，美国",
        "owner": "非营利合作组织",
        "political_leaning": "中立",
        "credibility": 90,
        "audience_scale": "global",
        "media_type": "news_agency",
        "description": "美国最大的非营利性新闻机构，以客观、事实驱动的报道闻名。"
    },
    "bbc.com": {
        "name": "英国广播公司 (BBC)",
        "established": 1922,
        "headquarters": "伦敦，英国",
        "owner": "英国公共媒体",
        "political_leaning": "中间偏左（社会自由主义）",
        "credibility": 85,
        "audience_scale": "global",
        "media_type": "broadcast",
        "description": "英国公共广播机构，全球最具影响力的媒体之一。"
    },
    "cnn.com": {
        "name": "美国有线电视新闻网 (CNN)",
        "established": 1980,
        "headquarters": "亚特兰大，美国",
        "owner": "华纳兄弟探索",
        "political_leaning": "中间偏左（自由主义）",
        "credibility": 72,
        "audience_scale": "global",
        "media_type": "tv",
        "description": "美国主要有线电视新闻网络，以24小时滚动新闻著称。"
    },
    "nytimes.com": {
        "name": "纽约时报 (The New York Times)",
        "established": 1851,
        "headquarters": "纽约，美国",
        "owner": "纽约时报公司",
        "political_leaning": "自由主义/进步主义",
        "credibility": 82,
        "audience_scale": "global",
        "media_type": "newspaper",
        "description": "美国最具影响力的报纸之一，深度调查报道著称。"
    },
    "foxnews.com": {
        "name": "福克斯新闻 (Fox News)",
        "established": 1996,
        "headquarters": "纽约，美国",
        "owner": "福克斯公司",
        "political_leaning": "保守主义",
        "credibility": 60,
        "audience_scale": "national",
        "media_type": "tv",
        "description": "美国主要有线电视新闻网络，以保守主义观点著称。"
    },
    "theguardian.com": {
        "name": "卫报 (The Guardian)",
        "established": 1821,
        "headquarters": "伦敦，英国",
        "owner": "斯科特信托基金会",
        "political_leaning": "中间偏左（社会民主主义）",
        "credibility": 84,
        "audience_scale": "global",
        "media_type": "newspaper",
        "description": "英国主要报纸之一，以进步主义立场和深度调查著称。"
    },
    "wsj.com": {
        "name": "华尔街日报 (The Wall Street Journal)",
        "established": 1889,
        "headquarters": "纽约，美国",
        "owner": "新闻集团",
        "political_leaning": "商业保守主义/中右翼",
        "credibility": 83,
        "audience_scale": "global",
        "media_type": "newspaper",
        "description": "美国主要金融报纸，以商业和金融新闻著称。"
    },
}


def extract_domain(url: str) -> str:
    """从URL提取域名"""
    if not url:
        return ""

    # 移除协议前缀
    url = re.sub(r'^https?://', '', url)
    # 移除www前缀
    url = re.sub(r'^www\.', '', url)
    # 移除路径
    url = url.split('/')[0]
    return url.lower()


def assess_media_basic_info(media_url: str, media_name: str = None) -> Dict[str, Any]:
    """
    评估媒体基本信息

    Args:
        media_url: 媒体URL
        media_name: 媒体名称（可选）

    Returns:
        Dict: 媒体基本信息
    """
    domain = extract_domain(media_url)

    # 查询数据库
    if domain in INTERNATIONAL_MEDIA_DB:
        db_info = INTERNATIONAL_MEDIA_DB[domain]
        return {
            "source": "database",
            "media_name": db_info["name"],
            "established_year": db_info["established"],
            "headquarters": db_info["headquarters"],
            "owner": db_info["owner"],
            "audience_scale": db_info["audience_scale"],
            "media_type": db_info["media_type"],
            "description": db_info["description"],
        }

    # 如果不在数据库中，返回基本信息
    return {
        "source": "inferred",
        "media_name": media_name or "未知媒体",
        "established_year": None,
        "headquarters": None,
        "owner": None,
        "audience_scale": "unknown",
        "media_type": "unknown",
        "description": f"媒体 URL: {media_url}",
    }


def assess_political_leaning(media_url: str, media_name: str = None) -> Dict[str, Any]:
    """
    评估媒体政治倾向

    Returns:
        Dict: 政治倾向评估
            - leaning: 政治倾向标签
            - score: 评分（0-100，左翼=0，右翼=100，中立=50）
            - evidence: 评估依据
            - confidence: 置信度
    """
    domain = extract_domain(media_url)

    # 查询数据库
    if domain in INTERNATIONAL_MEDIA_DB:
        leaning_text = INTERNATIONAL_MEDIA_DB[domain]["political_leaning"]

        # 将文本倾向转换为评分
        score_map = {
            "中立": 50,
            "中间偏中立": 50,
            "自由主义/进步主义": 25,
            "中间偏左（社会自由主义）": 40,
            "中间偏左（社会民主主义）": 35,
            "保守主义": 75,
            "商业保守主义/中右翼": 65,
        }

        score = score_map.get(leaning_text, 50)

        return {
            "leaning": leaning_text,
            "score": score,
            "evidence": f"基于国际媒体数据库对 {INTERNATIONAL_MEDIA_DB[domain]['name']} 的历史记录",
            "confidence": "high",
            "source": "database",
        }

    # 默认评估
    return {
        "leaning": "未知",
        "score": 50,
        "evidence": "媒体不在已知数据库中，无法确定政治倾向",
        "confidence": "low",
        "source": "inferred",
    }


def assess_media_credibility(media_url: str) -> Dict[str, Any]:
    """
    评估媒体可信度

    Returns:
        Dict: 可信度评估
            - score: 0-100分
            - level: "high", "medium", "low"
            - factors: 评估因素
    """
    domain = extract_domain(media_url)

    if domain in INTERNATIONAL_MEDIA_DB:
        credibility_score = INTERNATIONAL_MEDIA_DB[domain].get("credibility", 60)
    else:
        # 未知媒体给予中等分数
        credibility_score = 60

    if credibility_score >= 80:
        level = "high"
    elif credibility_score >= 60:
        level = "medium"
    else:
        level = "low"

    return {
        "score": credibility_score,
        "level": level,
        "factors": {
            "historical_accuracy": credibility_score if domain in INTERNATIONAL_MEDIA_DB else 60,
            "editorial_standards": credibility_score if domain in INTERNATIONAL_MEDIA_DB else 60,
            "corrections_policy": credibility_score if domain in INTERNATIONAL_MEDIA_DB else 60,
        }
    }


def generate_media_assessment(media_url: str, article_url: str = None, media_name: str = None) -> Dict[str, Any]:
    """
    生成完整的媒体评估

    Args:
        media_url: 媒体主页URL
        article_url: 文章URL（可选，用于进一步分析）
        media_name: 媒体名称（可选）

    Returns:
        Dict: 完整的媒体评估结果
            - basic_info: 基本信息
            - political_leaning: 政治倾向
            - credibility: 可信度
            - summary: 总结性描述
    """
    basic_info = assess_media_basic_info(media_url, media_name)
    political_leaning = assess_political_leaning(media_url, media_name)
    credibility = assess_media_credibility(media_url)

    # 生成总结
    media_display_name = basic_info.get("media_name", media_name or "未知媒体")
    summary = f"{media_display_name}"

    if basic_info.get("established_year"):
        summary += f"，创立于{basic_info['established_year']}年"

    if basic_info.get("headquarters"):
        summary += f"，总部位于{basic_info['headquarters']}"

    summary += f"。政治倾向：{political_leaning['leaning']}，可信度评分：{credibility['score']}/100"

    return {
        "media_url": media_url,
        "article_url": article_url,
        "basic_info": basic_info,
        "political_leaning": political_leaning,
        "credibility": credibility,
        "summary": summary,
        "generated_at": "2024-04-02T00:00:00Z"  # 实际应用中应使用当前时间
    }


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

    # 示例
    if len(sys.argv) > 1:
        media_url = sys.argv[1]
        article_url = sys.argv[2] if len(sys.argv) > 2 else None
        media_name = sys.argv[3] if len(sys.argv) > 3 else None
    else:
        media_url = "https://www.reuters.com"
        article_url = None
        media_name = "路透社"

    result = generate_media_assessment(media_url, article_url, media_name)
    print(json.dumps(result, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
