"""输出审核器（敏感内容过滤）.

对 LLM 输出进行内容审核，检测以下不当内容：
  - 暴力/仇恨言论
  - 不当内容（色情、赌博、毒品相关）
  - 个人信息泄露（已由 PIIRedactor 处理，此处为二次校验）
  - 有害指令（如制造危险物品的步骤）

检测到不当内容时标记为需审核，由调用方决定是否返回。
"""

import re
from dataclasses import dataclass, field

import structlog

logger = structlog.get_logger()

# 敏感内容检测模式（中文 + 英文）
SENSITIVE_PATTERNS: list[tuple[str, re.Pattern[str]]] = [
    # 暴力/伤害
    (
        "violence",
        re.compile(
            r"(?:如何|怎么|怎样|how\s+to|ways\s+to)\s*(?:制造|制作|获取|make|create|get)"
            r".*?(?:炸弹|爆炸物|武器|枪|毒药|bomb|weapon|poison)",
            re.IGNORECASE,
        ),
    ),
    (
        "self_harm",
        re.compile(
            r"(?:自杀|自残|self[- ]?harm|suicide|kill\s+myself|结束生命)",
            re.IGNORECASE,
        ),
    ),
    # 仇恨言论
    (
        "hate_speech",
        re.compile(
            r"(?:歧视|仇恨|hate|discriminate|racist|纳粹|nazi)",
            re.IGNORECASE,
        ),
    ),
    # 非法活动
    (
        "illegal_activity",
        re.compile(
            r"(?:毒品|贩毒|drug\s+trafficking|洗钱|money\s+laundering|走私|smuggling)",
            re.IGNORECASE,
        ),
    ),
    # 不当内容
    (
        "explicit_content",
        re.compile(
            r"(?:色情|pornograph|成人内容|adult\s+content|赌博|gambling)",
            re.IGNORECASE,
        ),
    ),
]

# 未成年人保护模式
MINOR_PROTECTION_PATTERNS: list[re.Pattern[str]] = [
    re.compile(r"(?:未成年人|未成年|minor|underage|under\s+18|under\s+21)", re.IGNORECASE),
]


@dataclass
class ModerationResult:
    """审核结果."""

    approved: bool = True
    flagged_categories: list[str] = field(default_factory=list)
    warnings: list[str] = field(default_factory=list)
    filtered_text: str = ""


class OutputModerator:
    """输出审核器."""

    def moderate(
        self,
        text: str,
        context: str = "",
    ) -> ModerationResult:
        """审核 LLM 输出内容.

        Args:
            text: LLM 输出文本
            context: 调用上下文（如 "question_generation"）

        Returns:
            ModerationResult（含审核结果 + 标记的类别）
        """
        result = ModerationResult(filtered_text=text)

        # 敏感内容检测
        for category, pattern in SENSITIVE_PATTERNS:
            if pattern.search(text):
                result.flagged_categories.append(category)
                result.warnings.append(f"sensitive content detected: {category}")
                logger.warning(
                    "output_moderation_flagged",
                    category=category,
                    context=context,
                )

        # 未成年人保护
        for pattern in MINOR_PROTECTION_PATTERNS:
            if pattern.search(text):
                result.flagged_categories.append("minor_protection")
                result.warnings.append("minor-related content detected")
                logger.warning(
                    "output_moderation_minor_protection",
                    context=context,
                )
                break

        # 决策：检测到任何敏感类别则不批准
        if result.flagged_categories:
            result.approved = False

        return result

    def is_safe(self, text: str) -> bool:
        """快速检查输出是否安全."""
        return all(
            not pattern.search(text) for _, pattern in SENSITIVE_PATTERNS
        )
