from datetime import date, datetime

from pydantic import BaseModel


class CategoryCreate(BaseModel):
    knowledge_base_id: int | None = None
    name: str
    description: str | None = None
    parent_id: int | None = None
    icon: str | None = None
    color: str | None = None
    sort_order: int = 0


class CategoryResponse(BaseModel):
    id: int
    knowledge_base_id: int | None
    name: str
    description: str | None
    parent_id: int | None
    icon: str | None
    color: str | None
    sort_order: int = 0
    doc_count: int = 0
    document_count: int = 0
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class TagCategoryResponse(BaseModel):
    id: int
    name: str
    code: str
    description: str | None
    part_number: int
    sort_order: int = 0
    icon: str | None
    color: str | None
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class TagCreate(BaseModel):
    name: str
    parent_id: int | None = None
    description: str | None = None
    icon: str | None = "🏷️"
    color: str | None = "#6366f1"
    sort_order: int = 0
    status: str = "enabled"
    tag_category_id: int | None = None
    tag_code: str | None = None
    is_predefined: bool = False
    keywords: list[str] | None = None
    search_weight: float = 1.0
    search_priority: int = 0


class TagUpdate(BaseModel):
    name: str | None = None
    parent_id: int | None = None
    description: str | None = None
    icon: str | None = None
    color: str | None = None
    sort_order: int | None = None
    status: str | None = None
    tag_category_id: int | None = None
    keywords: list[str] | None = None
    search_weight: float | None = None
    search_priority: int | None = None


class TagResponse(BaseModel):
    id: int
    name: str
    parent_id: int | None
    description: str | None
    icon: str | None
    color: str | None
    sort_order: int = 0
    status: str
    document_count: int = 0
    tag_category_id: int | None = None
    tag_code: str | None = None
    is_predefined: bool = False
    is_system: bool = False
    keywords: list[str] | None = None
    search_weight: float = 1.0
    search_priority: int = 0
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class TagTreeNode(TagResponse):
    children: list["TagTreeNode"] = []

    class Config:
        from_attributes = True


class TagTreeGrouped(BaseModel):
    part_number: int
    part_name: str
    categories: list[dict]

    class Config:
        from_attributes = True


class AutoTagSuggestion(BaseModel):
    tag_id: int
    tag_name: str
    tag_code: str | None
    confidence: float
    matched_keywords: list[str]


class AutoTagRequest(BaseModel):
    document_id: int
    confidence_threshold: float = 0.6


class AutoTagResponse(BaseModel):
    document_id: int
    suggestions: list[AutoTagSuggestion]
    total_suggestions: int


class BatchAutoTagRequest(BaseModel):
    document_ids: list[int]
    confidence_threshold: float = 0.6
    auto_apply: bool = False


class BatchAutoTagResponse(BaseModel):
    total_documents: int
    processed: int
    results: list[AutoTagResponse]


class DocumentCreate(BaseModel):
    title: str
    content: str
    summary: str | None = None
    category_id: int | None = None
    source: str | None = None
    reference_url: str | None = None
    status: str = "draft"
    is_public: bool = True
    tag_ids: list[int] = []
    file_type: str | None = None
    file_path: str | None = None
    segmentation_mode: str = "automatic"
    character_count: int | None = None
    doc_type: str | None = None
    doc_number: str | None = None
    issuing_authority: str | None = None
    doc_number_year: int | None = None
    doc_number_serial: int | None = None
    issue_date: date | None = None
    effective_date: date | None = None
    expire_date: date | None = None
    doc_status: str | None = None
    supersedes_doc_ids: list[int] | None = None
    superseded_by_doc_id: int | None = None
    tax_type_tags: list[str] | None = None
    has_attachment: bool = False
    attachment_types: list[str] | None = None
    parse_quality_score: float | None = None
    content_hash: str | None = None
    version_number: int = 1
    data_center_doc_id: int | None = None


class DocumentUpdate(BaseModel):
    title: str | None = None
    content: str | None = None
    summary: str | None = None
    category_id: int | None = None
    source: str | None = None
    reference_url: str | None = None
    status: str | None = None
    is_public: bool | None = None
    tag_ids: list[int] | None = None
    chunk_size: int | None = None
    chunk_overlap: int | None = None
    segmentation_mode: str | None = None
    splitter_type: str | None = None


class DocumentResponse(BaseModel):
    id: int
    title: str
    content: str
    summary: str | None
    category_id: int | None
    category_name: str | None = None
    author_id: int
    source: str | None
    reference_url: str | None
    status: str
    is_public: bool
    view_count: int
    is_vectorized: bool
    vector_model: str | None
    file_type: str | None = None
    segmentation_mode: str = "automatic"
    chunk_size: int = 1000
    chunk_overlap: int = 200
    splitter_type: str = "recursive"
    character_count: int = 0
    recall_count: int = 0
    doc_type: str | None = None
    doc_number: str | None = None
    issuing_authority: str | None = None
    doc_number_year: int | None = None
    doc_number_serial: int | None = None
    issue_date: date | None = None
    effective_date: date | None = None
    expire_date: date | None = None
    doc_status: str | None = None
    supersedes_doc_ids: list[int] | None = None
    superseded_by_doc_id: int | None = None
    tax_type_tags: list[str] | None = None
    has_attachment: bool = False
    attachment_types: list[str] | None = None
    parse_quality_score: float | None = None
    content_hash: str | None = None
    version_number: int = 1
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class QACreate(BaseModel):
    question: str
    answer: str
    category_id: int | None = None
    related_documents: list[int] | None = None


class QAResponse(BaseModel):
    id: int
    question: str
    answer: str
    category_id: int | None
    related_documents: list[int] | None
    use_count: int
    helpful_count: int
    status: str
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class SearchRequest(BaseModel):
    query: str
    knowledge_base_id: int | None = None
    category_id: int | None = None
    search_type: str = "keyword"
    limit: int = 10


class VectorSearchRequest(BaseModel):
    query: str
    knowledge_base_id: int | None = None
    category_id: int | None = None
    top_k: int = 5


class VectorizationStatusResponse(BaseModel):
    document_id: int
    status: str
    progress: float
    is_vectorized: bool
    vector_model: str | None = None


class VectorizationTasksResponse(BaseModel):
    tasks: list[dict]
    total: int


class BatchUploadResult(BaseModel):
    filename: str
    success: bool
    document_id: int | None = None
    is_vectorized: bool | None = None
    error: str | None = None


class BatchUploadResponse(BaseModel):
    total: int
    success: int
    failed: int
    results: list[BatchUploadResult]


class KnowledgeStatsResponse(BaseModel):
    total_documents: int
    published_documents: int
    total_categories: int
    total_tags: int
    total_qa: int
