"""Pydantic models for the admin graph management API.

知识图谱管理接口的请求/响应数据模型。
涵盖图谱统计、实体/关系 CRUD、重复检测与合并、
图谱重建、占位符管理、实体类型与关系类型定义等。
"""

from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field


# ── Statistics & Health ─────────────────────────────────────────────────────
# 图谱统计与数据质量健康度响应模型


class NodeTypeCount(BaseModel):
    label: str
    count: int


class RelTypeCount(BaseModel):
    type: str
    count: int


class GraphStatsResponse(BaseModel):
    total_nodes: int = 0
    total_relationships: int = 0
    orphan_nodes: int = 0
    placeholder_count: int = 0
    node_counts: list[NodeTypeCount] = Field(default_factory=list)
    rel_counts: list[RelTypeCount] = Field(default_factory=list)


class GraphHealthResponse(BaseModel):
    no_relation_ratio: float = Field(0.0, description="比例：无关系的非Document实体/全部非Document实体")
    duplicate_candidates: int = 0
    missing_in_graph: int = Field(0, description="ES中有但图谱中无的文档数")
    total_es_docs: int = 0


# ── Entity CRUD ─────────────────────────────────────────────────────────────
# 实体增删改查相关模型


class EntityListItem(BaseModel):
    id: str
    labels: list[str]
    name: str = ""
    properties: dict[str, Any] = Field(default_factory=dict)
    connection_count: int = 0


class EntityListResponse(BaseModel):
    items: list[EntityListItem] = Field(default_factory=list)
    total: int = 0
    page: int = 1
    page_size: int = 20


class EntityNeighbor(BaseModel):
    id: str
    labels: list[str]
    name: str = ""
    rel_type: str = ""
    direction: str = ""  # "out" or "in"


class EntityRelatedDoc(BaseModel):
    doc_id: str = ""
    title: str = ""
    doc_number: str = ""
    rel_type: str = ""


class EntityDetail(BaseModel):
    id: str
    labels: list[str]
    properties: dict[str, Any] = Field(default_factory=dict)
    neighbors: list[EntityNeighbor] = Field(default_factory=list)
    related_docs: list[EntityRelatedDoc] = Field(default_factory=list)


class EntityCreateRequest(BaseModel):
    label: str = Field(..., description="实体类型，如 Organization, Person")
    properties: dict[str, Any] = Field(default_factory=dict, description="属性，至少包含 name")


class EntityUpdateRequest(BaseModel):
    properties: dict[str, Any] = Field(..., description="要更新的属性键值对")


class EntityCreateResponse(BaseModel):
    id: str
    labels: list[str]
    properties: dict[str, Any] = Field(default_factory=dict)


class EntityDeleteResponse(BaseModel):
    id: str
    deleted_relationships: int = 0


# ── Duplicate Detection & Merge ─────────────────────────────────────────────
# 重复实体检测与合并操作的请求/响应模型


class DuplicateCandidate(BaseModel):
    entity_a_id: str
    entity_a_name: str
    entity_b_id: str
    entity_b_name: str
    similarity: float = Field(..., ge=0, le=1)
    match_type: str = Field(..., description="edit_distance | alias_match")
    label: str = ""


class DuplicateListResponse(BaseModel):
    candidates: list[DuplicateCandidate] = Field(default_factory=list)
    total: int = 0


class EntityMergeRequest(BaseModel):
    primary_id: str = Field(..., description="保留的实体 ID")
    secondary_id: str = Field(..., description="将被合并删除的实体 ID")
    add_alias: bool = Field(True, description="是否将被合并实体名加入别名")


class EntityMergeResponse(BaseModel):
    primary_id: str
    migrated_relationships: int = 0
    aliases: list[str] = Field(default_factory=list)


# ── Relationships ───────────────────────────────────────────────────────────
# 关系增删查相关模型


class RelationshipItem(BaseModel):
    id: str
    type: str
    source_id: str
    source_name: str = ""
    source_labels: list[str] = Field(default_factory=list)
    target_id: str
    target_name: str = ""
    target_labels: list[str] = Field(default_factory=list)
    properties: dict[str, Any] = Field(default_factory=dict)


class RelationshipListResponse(BaseModel):
    items: list[RelationshipItem] = Field(default_factory=list)
    total: int = 0
    page: int = 1
    page_size: int = 20


class RelationshipCreateRequest(BaseModel):
    source_id: str
    target_id: str
    type: str
    properties: dict[str, Any] = Field(default_factory=dict)


class RelationshipCreateResponse(BaseModel):
    id: str
    type: str
    source_id: str
    target_id: str


# ── Rebuild ─────────────────────────────────────────────────────────────────
# 图谱重建任务的请求/响应/状态模型


class RebuildRequest(BaseModel):
    doc_ids: list[str] = Field(..., min_length=1, description="要重建图谱的文档 ID 列表")


class RebuildResponse(BaseModel):
    task_id: str
    doc_count: int


class RebuildAllResponse(BaseModel):
    task_id: str
    total_docs: int


class RebuildStatusResponse(BaseModel):
    task_id: str
    status: str  # PENDING | PROCESSING | COMPLETED | FAILED
    progress: float = 0.0
    current: int = 0
    total: int = 0
    current_doc_id: str = ""
    error: str | None = None


# ── Placeholders ────────────────────────────────────────────────────────────
# 占位符文档管理模型（引用了尚未入库的文档时自动创建占位符节点）


class PlaceholderReferencer(BaseModel):
    doc_id: str
    title: str = ""


class PlaceholderItem(BaseModel):
    id: str
    doc_id: str = ""
    doc_number: str = ""
    referencers: list[PlaceholderReferencer] = Field(default_factory=list)


class PlaceholderListResponse(BaseModel):
    items: list[PlaceholderItem] = Field(default_factory=list)
    total: int = 0


class PlaceholderLinkRequest(BaseModel):
    real_doc_id: str = Field(..., description="真实文档 ID")


class PlaceholderLinkResponse(BaseModel):
    placeholder_id: str
    real_doc_id: str
    migrated_relationships: int = 0


# ── Entity Type Definitions ─────────────────────────────────────────────────
# 实体类型定义模型（用于动态管理图谱 Schema）


class EntityTypeItem(BaseModel):
    name: str
    description: str = ""
    zh_name: str = Field("", description="前端短中文显示名")
    icon: str = ""
    color: str = ""
    key_property: str = Field("name", description="主键属性名（只读，来自 schema）")
    properties_schema: dict[str, Any] = Field(default_factory=dict)
    instance_count: int = 0


class EntityTypeListResponse(BaseModel):
    items: list[EntityTypeItem] = Field(default_factory=list)


class EntityTypeCreateRequest(BaseModel):
    """本期已禁用 — 类型定义仅通过 graph_schema.yaml 管理。保留模型以兼容路由签名。"""
    name: str = Field(..., min_length=1, max_length=50)
    description: str = ""
    icon: str = ""
    color: str = ""
    properties_schema: dict[str, Any] = Field(default_factory=dict)


class EntityTypeUpdateRequest(BaseModel):
    """仅允许修改展示元数据（zh_name, icon, color）。"""
    zh_name: str | None = Field(None, description="前端短中文显示名")
    icon: str | None = None
    color: str | None = None


# ── Relationship Type Definitions ───────────────────────────────────────────
# 关系类型定义模型（用于动态管理图谱 Schema）


class RelTypeItem(BaseModel):
    name: str
    description: str = ""
    zh_name: str = Field("", description="前端短中文显示名")
    source_labels: list[str] = Field(default_factory=list)
    target_labels: list[str] = Field(default_factory=list)
    instance_count: int = 0


class RelTypeListResponse(BaseModel):
    items: list[RelTypeItem] = Field(default_factory=list)


class RelTypeCreateRequest(BaseModel):
    """本期已禁用 — 类型定义仅通过 graph_schema.yaml 管理。保留模型以兼容路由签名。"""
    name: str = Field(..., min_length=1, max_length=50)
    description: str = ""
    source_labels: list[str] = Field(default_factory=list)
    target_labels: list[str] = Field(default_factory=list)


class RelTypeUpdateRequest(BaseModel):
    """仅允许修改展示元数据（zh_name）。"""
    zh_name: str | None = Field(None, description="前端短中文显示名")
