"""
용어집 데이터 모델
"""
from typing import Optional, List, Dict, Any
from datetime import datetime
from pydantic import BaseModel, Field
from uuid import UUID, uuid4


class DocumentSource(BaseModel):
    """문서 출처 정보"""
    type: str = Field(..., description="문서 타입 (업무매뉴얼, 정책 및 규정 등)")
    title: str = Field(..., description="문서 제목")
    url: Optional[str] = Field(None, description="문서 URL")
    excerpt: Optional[str] = Field(None, description="문서 발췌")


class Term(BaseModel):
    """용어 모델"""
    term_id: str = Field(..., description="용어 ID")
    term_name: str = Field(..., description="용어명")
    normalized_name: str = Field(..., description="정규화된 용어명 (소문자, 공백 제거)")
    category: str = Field(..., description="카테고리")
    definition: str = Field(..., description="용어 정의")
    context: Optional[str] = Field(None, description="회사 내 사용 맥락")
    synonyms: List[str] = Field(default_factory=list, description="동의어 목록")
    related_terms: List[str] = Field(default_factory=list, description="관련 용어 목록")
    document_source: Optional[DocumentSource] = Field(None, description="출처 문서")
    confidence_score: float = Field(0.0, ge=0.0, le=1.0, description="신뢰도 점수")
    usage_count: int = Field(0, ge=0, description="사용 횟수")
    last_updated: Optional[str] = Field(None, description="마지막 업데이트 일시")
    embedding: Optional[List[float]] = Field(None, description="임베딩 벡터 (1536차원)")

    class Config:
        json_schema_extra = {
            "example": {
                "term_id": "cs_int_001",
                "term_name": "VoC (Voice of Customer)",
                "normalized_name": "voc voice of customer",
                "category": "고객서비스-분석",
                "definition": "고객이 상품이나 서비스를 이용하면서 느낀 경험을 수집하고 분석하는 활동",
                "context": "당사의 VoC 관리 시스템은 모든 채널에서 수집된 의견을 통합 분석합니다.",
                "synonyms": ["고객의소리", "Customer Voice"],
                "related_terms": ["CS", "CRM"],
                "confidence_score": 0.95,
                "usage_count": 247
            }
        }


class TermSearchRequest(BaseModel):
    """용어 검색 요청"""
    query: str = Field(..., min_length=1, description="검색 쿼리")
    top_k: int = Field(5, ge=1, le=20, description="반환할 최대 결과 수")
    confidence_threshold: float = Field(0.7, ge=0.0, le=1.0, description="최소 신뢰도 임계값")
    search_type: str = Field("hybrid", description="검색 타입 (keyword, vector, hybrid)")

    class Config:
        json_schema_extra = {
            "example": {
                "query": "고객 만족도 조사",
                "top_k": 5,
                "confidence_threshold": 0.7,
                "search_type": "hybrid"
            }
        }


class TermSearchResult(BaseModel):
    """용어 검색 결과"""
    term: Term
    relevance_score: float = Field(..., ge=0.0, le=1.0, description="관련도 점수")
    match_type: str = Field(..., description="매칭 타입 (keyword, vector, hybrid)")


class TermExplainRequest(BaseModel):
    """용어 설명 요청"""
    term_id: str = Field(..., description="용어 ID")
    meeting_context: Optional[str] = Field(None, description="회의 맥락")
    max_context_docs: int = Field(3, ge=1, le=10, description="최대 참고 문서 수")


class TermExplanation(BaseModel):
    """용어 설명"""
    term: Term
    explanation: str = Field(..., description="맥락 기반 설명")
    context_documents: List[Dict[str, Any]] = Field(default_factory=list, description="참고 문서")
    generated_by: str = Field("claude-3-5-sonnet", description="생성 모델")
    cached: bool = Field(False, description="캐시 여부")


class TermStats(BaseModel):
    """용어 통계"""
    total_terms: int = Field(..., description="전체 용어 수")
    by_category: Dict[str, int] = Field(..., description="카테고리별 용어 수")
    by_source_type: Dict[str, int] = Field(..., description="출처 타입별 용어 수")
    avg_confidence: float = Field(..., description="평균 신뢰도")
