from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field, field_validator


class DocChunkDocument(BaseModel):
    """Upstream `doc_chunks` document (Docs Ingestion)."""

    chunk_id: str
    repo_id: str
    doc_path: str
    section_title: str
    chunk_text: str
    chunk_hash: str | None = None
    source_type: str = "repo_doc"
    snapshot_id: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)

    @field_validator("metadata", mode="before")
    @classmethod
    def _default_metadata(cls, value: Any) -> dict[str, Any]:
        return value or {}

    def resolved_snapshot_id(self) -> str | None:
        if self.snapshot_id:
            return self.snapshot_id
        meta = self.metadata.get("snapshot_id")
        return str(meta).strip() if meta else None

    def resolved_commit_sha(self) -> str | None:
        for key in ("commit_hash", "commit_sha"):
            value = self.metadata.get(key)
            if value:
                return str(value).strip()
        return None

    def resolved_section_level(self) -> int | None:
        value = self.metadata.get("section_level")
        if value is None:
            return None
        try:
            return int(value)
        except (TypeError, ValueError):
            return None
