"""
Claude AI 연동 서비스
"""
from anthropic import Anthropic
from typing import Dict, Any, Optional
from tenacity import retry, stop_after_attempt, wait_exponential
import logging

logger = logging.getLogger(__name__)


class ClaudeService:
    """Claude AI 서비스"""

    def __init__(
        self,
        api_key: str,
        model: str = "claude-3-5-sonnet-20241022",
        max_tokens: int = 1024,
        temperature: float = 0.3
    ):
        """
        초기화

        Args:
            api_key: Claude API 키
            model: 모델명
            max_tokens: 최대 토큰 수
            temperature: 온도
        """
        self.client = Anthropic(api_key=api_key)
        self.model = model
        self.max_tokens = max_tokens
        self.temperature = temperature

    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=10)
    )
    def explain_term(
        self,
        term_name: str,
        definition: str,
        context: Optional[str],
        meeting_context: Optional[str] = None,
        related_docs: Optional[str] = None
    ) -> Dict[str, Any]:
        """
        용어 설명 생성

        Args:
            term_name: 용어명
            definition: 용어 정의
            context: 회사 내 사용 맥락
            meeting_context: 회의 맥락
            related_docs: 관련 문서

        Returns:
            설명 결과
        """
        # 시스템 프롬프트
        system_prompt = (
            "당신은 전문 용어를 회의 맥락에 맞춰 설명하는 AI 어시스턴트입니다. "
            "2-3문장으로 간결하게 설명하세요."
        )

        # 사용자 프롬프트
        user_prompt = f"용어: {term_name}\n\n"
        user_prompt += f"정의: {definition}\n\n"

        if context:
            user_prompt += f"회사 내 사용 맥락: {context}\n\n"

        if meeting_context:
            user_prompt += f"회의 맥락: {meeting_context}\n\n"

        if related_docs:
            user_prompt += f"관련 문서:\n{related_docs}\n\n"

        user_prompt += (
            "위 정보를 바탕으로 이 용어를 2-3문장으로 간결하게 설명해주세요. "
            "회의 맥락이 있다면 회의와 연관지어 설명하세요."
        )

        try:
            response = self.client.messages.create(
                model=self.model,
                max_tokens=self.max_tokens,
                temperature=self.temperature,
                system=system_prompt,
                messages=[
                    {"role": "user", "content": user_prompt}
                ]
            )

            explanation = response.content[0].text
            tokens_used = response.usage.input_tokens + response.usage.output_tokens

            return {
                "explanation": explanation,
                "generated_by": self.model,
                "tokens_used": tokens_used,
                "cached": False
            }

        except Exception as e:
            logger.error(f"Claude API 호출 실패: {str(e)}")
            # Fallback: 기본 설명 반환
            fallback_explanation = f"{definition}"
            if context:
                fallback_explanation += f"\n\n{context}"

            return {
                "explanation": fallback_explanation,
                "generated_by": "fallback",
                "tokens_used": 0,
                "cached": False,
                "error": str(e)
            }

    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=10)
    )
    def summarize_similar_content(
        self,
        current_meeting_title: str,
        current_meeting_date: str,
        current_meeting_agendas: str,
        past_meeting_title: str,
        past_meeting_date: str,
        past_meeting_content: str
    ) -> Dict[str, Any]:
        """
        관련 회의록 유사 내용 요약 생성

        Args:
            current_meeting_title: 현재 회의 제목
            current_meeting_date: 현재 회의 날짜
            current_meeting_agendas: 현재 회의 안건
            past_meeting_title: 과거 회의 제목
            past_meeting_date: 과거 회의 날짜
            past_meeting_content: 과거 회의 내용

        Returns:
            요약 결과
        """
        # 시스템 프롬프트
        system_prompt = (
            "당신은 회의록 분석 전문가입니다. "
            "두 회의록을 비교하여 유사한 내용을 정확하게 추출하고 간결하게 요약합니다.\n\n"
            "중요한 원칙:\n"
            "1. 과거 회의록에서 실제로 다뤄진 내용만 포함하세요\n"
            "2. 환각(Hallucination)을 절대 생성하지 마세요\n"
            "3. 구체적인 날짜, 수치, 결정사항을 포함하세요\n"
            "4. 정확히 3문장으로 요약하세요"
        )

        # 사용자 프롬프트
        user_prompt = f"""아래 두 회의록을 비교하여 유사한 내용을 정확히 3문장으로 요약해주세요.

## 현재 회의
제목: {current_meeting_title}
날짜: {current_meeting_date}
안건:
{current_meeting_agendas}

## 과거 회의
제목: {past_meeting_title}
날짜: {past_meeting_date}
내용:
{past_meeting_content}

## 요구사항
1. 두 회의에서 공통적으로 논의된 주제나 결정사항을 찾아주세요
2. 정확히 3문장으로 요약하세요 (각 문장은 한 문단)
3. 구체적인 내용을 포함해주세요 (예: 날짜, 수치, 결정사항)
4. 과거 회의에서 실제로 다뤄진 내용만 포함해주세요 (환각 금지)
"""

        try:
            response = self.client.messages.create(
                model=self.model,
                max_tokens=self.max_tokens,
                temperature=self.temperature,
                system=system_prompt,
                messages=[
                    {"role": "user", "content": user_prompt}
                ]
            )

            summary = response.content[0].text
            tokens_used = response.usage.input_tokens + response.usage.output_tokens

            return {
                "summary": summary,
                "generated_by": self.model,
                "tokens_used": tokens_used,
                "cached": False
            }

        except Exception as e:
            logger.error(f"Claude API 호출 실패: {str(e)}")
            return {
                "summary": None,
                "generated_by": "fallback",
                "tokens_used": 0,
                "cached": False,
                "error": str(e)
            }
