from pydantic import BaseModel, Field
import uuid
from enum import StrEnum
from app.core.rag.models.chunk import QAChunk
from typing import Union


class RetrieveType(StrEnum):
    """Retrieval type enumeration"""
    PARTICIPLE = "participle"
    SEMANTIC = "semantic"
    HYBRID = "hybrid"
    Graph = "graph"


class ChunkCreate(BaseModel):
    content: Union[str, QAChunk] = Field(
        description="Content can be either a string or a QAChunk object"
    )

    @property
    def chunk_content(self) -> str:
        """
        Get the actual content string regardless of input type
        """
        if isinstance(self.content, QAChunk):
            return f"question: {self.content.question} answer: {self.content.answer}"
        return self.content


class ChunkUpdate(BaseModel):
    content: Union[str, QAChunk] = Field(
        description="Content can be either a string or a QAChunk object"
    )

    @property
    def chunk_content(self) -> str:
        """
        Get the actual content string regardless of input type
        """
        if isinstance(self.content, QAChunk):
            return f"question: {self.content.question} answer: {self.content.answer}"
        return self.content


class ChunkRetrieve(BaseModel):
    query: str
    kb_ids: list[uuid.UUID]
    file_names_filter: list[str] | None = Field(None)
    similarity_threshold: float | None = Field(None)
    vector_similarity_weight: float | None = Field(None)
    top_k: int | None = Field(None)
    retrieve_type: RetrieveType | None = Field(None)
