"""公文审查的核心数据模型。"""

from __future__ import annotations
from typing import Any, Literal
from pydantic import BaseModel, Field


Role = Literal[
    "title", "doc_number", "recipient",
    "heading_1", "heading_2", "heading_3", "heading_4",
    "body", "attachment_marker", "attachment_title", "signature", "date",
    "no_text_marker", "unknown", "any",
]
Severity = Literal["error", "warning", "info"]


class ParagraphStyle(BaseModel):
    font_eastasia: str | None = None
    font_ascii: str | None = None
    font_size_pt: float | None = None
    bold: bool = False
    italic: bool = False
    line_spacing: float | None = None
    line_spacing_rule: str | None = None
    alignment: str = "left"
    first_line_indent_pt: float = 0.0


class Run(BaseModel):
    text: str
    style: ParagraphStyle


class Paragraph(BaseModel):
    index: int
    text: str
    runs: list[Run]
    style: ParagraphStyle
    role: Role | None = None
    role_confidence: float = 1.0
    in_table: bool = False
    in_header: bool = False
    in_footer: bool = False


class Table(BaseModel):
    index: int
    rows: list[list[str]]


class Document(BaseModel):
    meta: dict[str, Any] = Field(default_factory=dict)
    paragraphs: list[Paragraph]
    tables: list[Table] = Field(default_factory=list)


class Location(BaseModel):
    paragraph_index: int
    role: Role | None = None
    char_start: int = 0
    char_end: int = 0
    context: str = ""


class Finding(BaseModel):
    finding_id: str
    rule_id: str
    rule_name: str
    severity: Severity
    category: str
    location: Location
    actual: dict[str, Any] = Field(default_factory=dict)
    expected: dict[str, Any] = Field(default_factory=dict)
    message: str
    suggestion: str = ""
    evidence: str = ""
    confidence: float = 1.0
