#!/usr/bin/env python3
"""
Base Reviewer - 검토자 추상 인터페이스

모든 검토자가 상속받아야 하는 기본 클래스
"""

import json
import sys
from abc import ABC, abstractmethod
from pathlib import Path
from typing import Any, Dict, List

# 로깅 설정
try:
    from logging_config import log_error, log_execution, setup_logging
except ImportError:
    sys.path.insert(0, str(Path(__file__).parent.parent))
    from logging_config import log_error, log_execution, setup_logging


class ReviewerInterface(ABC):
    """검토자 인터페이스 (추상화)"""

    def __init__(self):
        """초기화 및 로거 설정"""
        self.logger = setup_logging("red_team.base_reviewer")
        log_execution(self.logger, "ReviewerInterface initialized")

    @abstractmethod
    def review(self, doc: str) -> Dict[str, Any]:
        """
        문서 검토 (추상 메서드)

        Args:
            doc: 검토할 문서 (텍스트 또는 파일 경로)

        Returns:
            {
                "risk_level": str,  # "low"|"medium"|"high"|"critical"
                "issues": List[Dict],  # 문제점 목록
                "recommendation": str,  # 권장사항
                "details": Dict  # 상세 정보 (선택)
            }
        """
        pass

    def _assess_risk(self, issues: List[Dict]) -> str:
        """
        리스크 레벨 평가 (공통 로직)

        Args:
            issues: 문제점 목록

        Returns:
            "low"|"medium"|"high"|"critical"
        """
        if not issues:
            return "low"

        # 심각도 점수 계산
        severity_scores = {"low": 1, "medium": 2, "high": 3, "critical": 4}
        max_severity = "low"

        for issue in issues:
            severity = issue.get("severity", "low")
            if severity_scores.get(severity, 0) > severity_scores.get(max_severity, 0):
                max_severity = severity

        # 이슈 개수 기반 조정
        if len(issues) > 5 and max_severity == "medium":
            max_severity = "high"
        elif len(issues) > 10 and max_severity == "high":
            max_severity = "critical"

        return max_severity

    def _get_recommendation(self, risk_level: str) -> str:
        """
        리스크 레벨별 권장사항 (공통 로직)

        Args:
            risk_level: "low"|"medium"|"high"|"critical"

        Returns:
            권장사항 텍스트
        """
        recommendations = {
            "low": "낮은 위험 - 현재 수준 유지",
            "medium": "중간 위험 - 수정 권장",
            "high": "높은 위험 - 즉시 수정 필요",
            "critical": "심각한 위험 - 즉시 중단 및 수정 필요",
        }
        return recommendations.get(risk_level, "알 수 없음")


def main():
    """CLI 테스트 인터페이스"""
    if len(sys.argv) > 1 and sys.argv[1] == "test":
        print(
            json.dumps(
                {
                    "status": "loaded",
                    "interface": "ReviewerInterface",
                    "methods": ["review", "_assess_risk", "_get_recommendation"],
                },
                indent=2,
            )
        )
    else:
        print(
            json.dumps(
                {
                    "error": "This is an abstract class. Use concrete implementations.",
                    "usage": "python3 base_reviewer.py test",
                }
            )
        )


if __name__ == "__main__":
    main()
