"""
회의록 데이터 모델
"""
from typing import Optional, List, Dict, Any
from datetime import datetime
from pydantic import BaseModel, Field


class MinutesSection(BaseModel):
    """회의록 섹션"""
    section_id: str = Field(..., description="섹션 ID")
    type: str = Field(..., description="섹션 타입")
    title: str = Field(..., description="섹션 제목")
    content: Optional[str] = Field(None, description="섹션 내용")
    order: int = Field(0, description="순서")
    verified: bool = Field(False, description="검증 여부")


class RagMinutes(BaseModel):
    """RAG 회의록 모델"""
    # Meeting 정보
    meeting_id: str = Field(..., description="회의 ID")
    title: str = Field(..., description="회의 제목")
    purpose: Optional[str] = Field(None, description="회의 목적")
    description: Optional[str] = Field(None, description="회의 설명")
    scheduled_at: Optional[str] = Field(None, description="예약 일시")
    location: Optional[str] = Field(None, description="장소")
    organizer_id: str = Field(..., description="주최자 ID")

    # Minutes 정보
    minutes_id: str = Field(..., description="회의록 ID")
    minutes_status: str = Field(..., description="회의록 상태")
    minutes_version: int = Field(..., description="회의록 버전")
    created_by: str = Field(..., description="작성자")
    finalized_by: Optional[str] = Field(None, description="확정자")
    finalized_at: Optional[str] = Field(None, description="확정 일시")

    # 회의록 섹션 (JSON)
    sections: List[MinutesSection] = Field(default_factory=list, description="회의록 섹션 목록")

    # 전체 회의록 내용 (검색용 텍스트)
    full_content: str = Field(..., description="전체 회의록 내용")

    # Embedding
    embedding: Optional[List[float]] = Field(None, description="임베딩 벡터 (1536차원)")

    # 메타데이터
    created_at: Optional[str] = Field(None, description="생성 일시")
    updated_at: Optional[str] = Field(None, description="수정 일시")

    class Config:
        json_schema_extra = {
            "example": {
                "meeting_id": "MTG-2025-001",
                "title": "2025 Q1 마케팅 전략 회의",
                "purpose": "2025년 1분기 마케팅 전략 수립",
                "minutes_id": "MIN-2025-001",
                "minutes_status": "FINALIZED",
                "minutes_version": 1,
                "created_by": "user@example.com",
                "organizer_id": "organizer@example.com",
                "sections": [
                    {
                        "section_id": "SEC-001",
                        "type": "DISCUSSION",
                        "title": "시장 분석",
                        "content": "2025년 시장 동향 분석...",
                        "order": 1,
                        "verified": True
                    }
                ],
                "full_content": "2025 Q1 마케팅 전략 회의..."
            }
        }


class MinutesSearchRequest(BaseModel):
    """회의록 검색 요청"""
    query: str = Field(..., min_length=1, description="검색 쿼리 (회의록 내용)")
    top_k: int = Field(5, ge=1, le=20, description="반환할 최대 결과 수")
    similarity_threshold: float = Field(0.7, ge=0.0, le=1.0, description="최소 유사도 임계값")

    class Config:
        json_schema_extra = {
            "example": {
                "query": "마케팅 전략 수립",
                "top_k": 5,
                "similarity_threshold": 0.7
            }
        }


class MinutesSearchResult(BaseModel):
    """회의록 검색 결과"""
    minutes: RagMinutes
    similarity_score: float = Field(..., ge=0.0, le=1.0, description="유사도 점수")

    class Config:
        json_schema_extra = {
            "example": {
                "minutes": {
                    "meeting_id": "MTG-2025-001",
                    "title": "2025 Q1 마케팅 전략 회의",
                    "minutes_id": "MIN-2025-001"
                },
                "similarity_score": 0.92
            }
        }


class RelatedMinutesRequest(BaseModel):
    """연관 회의록 조회 요청"""
    minute_id: str = Field(..., description="기준 회의록 ID")
    meeting_title: str = Field(..., description="회의 제목")
    summary: str = Field(..., description="회의록 요약")
    top_k: int = Field(5, ge=1, le=20, description="반환할 최대 결과 수")
    similarity_threshold: float = Field(0.7, ge=0.0, le=1.0, description="최소 유사도 임계값")

    class Config:
        json_schema_extra = {
            "example": {
                "minute_id": "MIN-2025-001",
                "meeting_title": "2025 Q1 마케팅 전략 회의",
                "summary": "2025년 1분기 마케팅 전략 수립을 위한 회의",
                "top_k": 5,
                "similarity_threshold": 0.7
            }
        }


class RelatedMinutesResponse(BaseModel):
    """연관 회의록 조회 응답"""
    minutes: RagMinutes
    similarity_score: float = Field(..., ge=0.0, le=1.0, description="유사도 점수")

    class Config:
        json_schema_extra = {
            "example": {
                "minutes": {
                    "meeting_id": "MTG-2025-002",
                    "title": "2024 Q4 마케팅 성과 분석",
                    "minutes_id": "MIN-2024-050"
                },
                "similarity_score": 0.85
            }
        }
