#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
预警模块 - 美国对华制裁监测预警技能
识别高风险实体和潜在制裁目标

创建时间：2026-04-03
开发者：瞰宇 (Kàn Yǔ)
"""

import json
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from collections import Counter, defaultdict
from datetime import datetime


@dataclass
class RiskAlert:
    """风险预警"""
    entity_name: str  # 实体名称
    risk_level: str  # 风险等级（高/中/低）
    risk_type: str  # 风险类型
    triggers: List[str]  # 触发因素
    potential_sanction: str  # 潜在制裁措施
    recommendation: str  # 应对建议


class EarlyWarningSystem:
    """
    预警系统
    识别高风险实体和潜在制裁目标
    """
    
    # 高风险关键词
    HIGH_RISK_KEYWORDS = {
        "military": ["军事", "军队", "国防", "武器"],
        "surveillance": ["监控", "监视", "侦察", "面部识别"],
        "advanced_tech": ["先进", "前沿", "量子", "AI", "人工智能", "芯片", "半导体"],
        "cyber": ["网络", "黑客", "网络攻击", "网络安全"]
    }
    
    # 可能的制裁措施
    POTENTIAL_SANCTIONS = {
        "export_control": "出口管制（列入实体清单）",
        "financial_sanctions": "金融制裁（列入SDN清单）",
        "investment_restriction": "投资限制（限制美国投资）",
        "license_revocation": "许可证撤销"
    }
    
    def __init__(self):
        """初始化预警系统"""
        self.sanctioned_entities = []
        self.monitored_entities = []
        self.alerts = []
    
    def load_sanctioned_entities(self, entities: List[Dict]):
        """
        加载已制裁实体
        
        Args:
            entities: 已制裁实体列表
        """
        self.sanctioned_entities = entities
    
    def load_monitored_entities(self, entities: List[Dict]):
        """
        加载监测实体（未制裁，有风险）
        
        Args:
            entities: 监测实体列表
        """
        self.monitored_entities = entities
    
    def assess_risk_score(self, entity: Dict) -> Tuple[float, List[str]]:
        """
        评估实体风险分数
        
        Args:
            entity: 实体信息
            
        Returns:
            (风险分数, 触发因素列表）
        """
        risk_score = 0.0
        triggers = []
        
        name = entity.get("name", "").lower()
        description = entity.get("description", "").lower()
        combined = f"{name} {description}"
        
        # 检查高风险关键词
        for risk_type, keywords in self.HIGH_RISK_KEYWORDS.items():
            for keyword in keywords:
                if keyword in combined:
                    risk_score += 0.2
                    triggers.append(f"包含'{keyword}'相关词汇")
                    break  # 避免重复计数
        
        # 检查是否与已制裁实体关联
        for sanctioned in self.sanctioned_entities:
            sanctioned_name = sanctioned.get("name", "")
            if sanctioned_name.lower() in name or name in sanctioned_name.lower():
                risk_score += 0.3
                triggers.append(f"与已制裁实体'{sanctioned_name}'名称相似")
                break
        
        # 检查是否涉及高敏感产业
        if any(industry in combined for industry in ["半导体", "5G", "人工智能", "量子"]):
            risk_score += 0.15
            triggers.append("涉及高敏感产业")
        
        # 归一化到[0, 1]
        risk_score = min(1.0, risk_score)
        
        return risk_score, triggers
    
    def determine_risk_level(self, risk_score: float) -> str:
        """
        确定风险等级
        
        Args:
            risk_score: 风险分数
            
        Returns:
            风险等级（高/中/低）
        """
        if risk_score >= 0.6:
            return "高"
        elif risk_score >= 0.3:
            return "中"
        else:
            return "低"
    
    def generate_alerts(self) -> List[RiskAlert]:
        """
        生成风险预警
        
        Returns:
            RiskAlert对象列表
        """
        alerts = []
        
        for entity in self.monitored_entities:
            risk_score, triggers = self.assess_risk_score(entity)
            risk_level = self.determine_risk_level(risk_score)
            
            if risk_level in ["高", "中"]:
                # 确定风险类型
                risk_type = "综合风险"
                if "军事" in str(triggers):
                    risk_type = "军事用途风险"
                elif "监控" in str(triggers) or "监视" in str(triggers):
                    risk_type = "监控技术风险"
                elif "高敏感产业" in str(triggers):
                    risk_type = "高敏感产业风险"
                
                # 确定潜在制裁措施
                potential_sanctions = self.POTENTIAL_SANCTIONS.get("export_control", "未知")
                
                # 生成应对建议
                if risk_level == "高":
                    recommendation = "建议立即开展合规审查，准备应对预案，考虑业务调整"
                else:
                    recommendation = "建议加强合规管理，持续监测政策动向"
                
                alert = RiskAlert(
                    entity_name=entity.get("name", ""),
                    risk_level=risk_level,
                    risk_type=risk_type,
                    triggers=triggers,
                    potential_sanction=potential_sanctions,
                    recommendation=recommendation
                )
                
                alerts.append(alert)
        
        # 按风险分数排序
        self.alerts = sorted(
            alerts,
            key=lambda x: {
                "高": 3,
                "中": 2,
                "低": 1
            }[x.risk_level],
            reverse=True
        )
        
        return self.alerts
    
    def generate_warning_report(self) -> Dict:
        """
        生成预警报告
        
        Returns:
            预警报告字典
        """
        # 统计风险等级分布
        risk_level_counts = Counter()
        for alert in self.alerts:
            risk_level_counts[alert.risk_level] += 1
        
        # 生成预警列表
        alert_list = [
            {
                "实体名称": alert.entity_name,
                "风险等级": alert.risk_level,
                "风险类型": alert.risk_type,
                "触发因素": ", ".join(alert.triggers[:3]),  # 只显示前3个
                "潜在制裁措施": alert.potential_sanction,
                "应对建议": alert.recommendation
            }
            for alert in self.alerts
        ]
        
        report = {
            "预警摘要": {
                "总预警数量": len(self.alerts),
                "高风险": risk_level_counts["高"],
                "中风险": risk_level_counts["中"],
                "低风险": risk_level_counts["低"]
            },
            "详细预警": alert_list
        }
        
        return report


def main():
    """测试预警系统"""
    warning_system = EarlyWarningSystem()
    
    # 示例已制裁实体
    sanctioned_entities = [
        {
            "name": "华为技术有限公司",
            "reason": "涉及5G通信设备"
        },
        {
            "name": "中芯国际",
            "reason": "涉及半导体制造"
        }
    ]
    
    # 示例监测实体
    monitored_entities = [
        {
            "name": "某先进半导体公司",
            "description": "从事先进半导体研发和制造"
        },
        {
            "name": "某AI监控公司",
            "description": "从事人工智能监控技术开发"
        },
        {
            "name": "某量子科技公司",
            "description": "从事量子通信技术"
        }
    ]
    
    warning_system.load_sanctioned_entities(sanctioned_entities)
    warning_system.load_monitored_entities(monitored_entities)
    
    # 生成预警
    print("=== 生成风险预警 ===")
    alerts = warning_system.generate_alerts()
    print(f"生成 {len(alerts)} 条预警\n")
    
    # 生成报告
    report = warning_system.generate_warning_report()
    print(json.dumps(report, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
