import json

from pydantic import BaseModel

from app.models.chunk import EmbeddingChunkPayloadContract


class EmbeddingJobDispatchEvent(BaseModel):
    event_type: str
    event_version: str
    created_at: str
    job_id: str
    repo_id: str
    snapshot_id: str
    document_id: str
    chunk_id: str
    status: str
    payload: str


def parse_embedding_chunk_payload(payload_json: str) -> EmbeddingChunkPayloadContract:
    try:
        payload = json.loads(payload_json)
    except json.JSONDecodeError as exc:
        raise ValueError("Dispatch payload is not valid JSON") from exc

    if not isinstance(payload, dict):
        raise ValueError("Dispatch payload must be an object")
    try:
        return EmbeddingChunkPayloadContract.model_validate(payload)
    except Exception as exc:
        raise ValueError(f"Dispatch payload does not match chunk contract: {exc}") from exc
