from datetime import datetime
from typing import List, Optional

from pydantic import BaseModel, Field


class RepoDocument(BaseModel):
    id: Optional[str] = None
    repo_id: str
    doc_path: str
    doc_type: str  # readme | docs | architecture | contributing | deployment | onboarding | adr | runbook
    source_type: str = "repo_doc"
    raw_content: str
    last_updated_commit: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)


class RepoDocumentSection(BaseModel):
    id: Optional[str] = None
    doc_id: str
    repo_id: str
    doc_path: str
    heading: str
    section_title: str
    section_level: int
    parent_section: Optional[str] = None
    heading_path: Optional[str] = None
    start_line: Optional[int] = None
    end_line: Optional[int] = None
    content_start_line: Optional[int] = None
    content_end_line: Optional[int] = None
    content_types: List[str] = Field(default_factory=list)
    content: str
    created_at: datetime = Field(default_factory=datetime.utcnow)


class IngestRequest(BaseModel):
    repo_id: str
    doc_path: str
    content: str
    commit_hash: Optional[str] = None
    snapshot_id: Optional[str] = None


class IngestResponse(BaseModel):
    run_id: str
    status: str
    message: str
