from enum import Enum
from typing import Optional

from pydantic import BaseModel, Field

from app.schemas.common import ErrorPayload


class FileSnapshot(BaseModel):
    path: str = Field(min_length=1)
    content: str
    content_hash: str = Field(min_length=1)


class IndexSnapshotRequest(BaseModel):
    project_id: str = Field(min_length=1)
    files: list[FileSnapshot]


class ChangeOp(str, Enum):
    UPSERT = "upsert"
    DELETE = "delete"


class ChangedFile(BaseModel):
    op: ChangeOp
    path: str = Field(min_length=1)
    content: Optional[str] = None
    content_hash: Optional[str] = None


class IndexChangesRequest(BaseModel):
    project_id: str = Field(min_length=1)
    changed_files: list[ChangedFile]


class IndexJobQueuedResponse(BaseModel):
    index_job_id: str
    status: str


class IndexJobStatus(str, Enum):
    QUEUED = "queued"
    RUNNING = "running"
    DONE = "done"
    ERROR = "error"


class IndexJobResponse(BaseModel):
    index_job_id: str
    status: IndexJobStatus
    indexed_files: int = 0
    failed_files: int = 0
    cache_hit_files: int = 0
    cache_miss_files: int = 0
    error: Optional[ErrorPayload] = None
