"""
쿼리 복잡도 계산 모듈

사용자 질문의 복잡도를 분석하여 Self-RAG 적용 여부를 결정합니다.
"""

from dataclasses import dataclass

import structlog

logger = structlog.get_logger(__name__)


@dataclass
class ComplexityResult:
    """복잡도 계산 결과"""

    score: float  # 0.0-1.0
    length_score: float
    depth_score: float
    multi_intent_score: float
    details: dict


class ComplexityCalculator:
    """쿼리 복잡도 계산기"""

    def __init__(
        self,
        threshold: float = 0.7,
        length_weight: float = 0.3,
        depth_weight: float = 0.4,
        multi_intent_weight: float = 0.3,
    ):
        self.threshold = threshold
        self.length_weight = length_weight
        self.depth_weight = depth_weight
        self.multi_intent_weight = multi_intent_weight

        # 한국어 지표 키워드
        self.depth_indicators = ["어떻게", "왜", "차이", "비교", "단계", "방법", "원리", "이유"]
        self.multi_intent_indicators = ["그리고", "또는", "그런데", "아니면", "그다음", "추가로"]

    async def calculate(self, query: str) -> ComplexityResult:
        """
        쿼리 복잡도 계산

        Args:
            query: 사용자 질문

        Returns:
            ComplexityResult: 복잡도 점수 및 상세 정보
        """
        # 1. 길이 점수
        length_score = min(len(query) / 100, 1.0) * self.length_weight

        # 2. 깊이 점수
        depth_count = sum(1 for word in self.depth_indicators if word in query)
        depth_score = min(depth_count / 3, 1.0) * self.depth_weight

        # 3. 다중 의도 점수
        multi_count = sum(1 for word in self.multi_intent_indicators if word in query)
        multi_score = min(multi_count / 2, 1.0) * self.multi_intent_weight

        # 최종 점수
        total_score = length_score + depth_score + multi_score

        result = ComplexityResult(
            score=total_score,
            length_score=length_score,
            depth_score=depth_score,
            multi_intent_score=multi_score,
            details={
                "query_length": len(query),
                "depth_indicators_found": depth_count,
                "multi_intent_indicators_found": multi_count,
            },
        )

        logger.info(
            "complexity_calculated",
            score=result.score,
            threshold=self.threshold,
            self_rag_applicable=result.score >= self.threshold,
        )

        return result

    def requires_self_rag(self, complexity: ComplexityResult) -> bool:
        """Self-RAG 적용 필요 여부 판단"""
        return complexity.score >= self.threshold
