import uuid
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field


class ParseRunStatus:
    PENDING = "pending"
    QUEUED = "queued"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"
    RETRYING = "retrying"


def build_stream_dedupe_key(
    repo_id: str,
    snapshot_id: str,
    commit_hash: str,
    doc_path: str,
) -> str:
    return f"{repo_id}:{snapshot_id}:{commit_hash}:{doc_path}"


class DocParseRun(BaseModel):
    id: Optional[str] = None
    run_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    repo_id: str
    doc_path: str
    snapshot_id: Optional[str] = None
    commit_hash: Optional[str] = None
    event_id: Optional[str] = None
    dedupe_key: Optional[str] = None
    status: str = ParseRunStatus.PENDING
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None
    error: Optional[str] = None
    chunks_created: int = 0
    retry_count: int = 0
    next_retry_at: Optional[datetime] = None
    last_error: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
