import hashlib
from datetime import datetime
from typing import Any, Dict, List, Optional

from pydantic import BaseModel, Field


class EmbeddingJobStatus:
    PENDING = "pending"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"
    RETRYING = "retrying"


class EmbeddingJob(BaseModel):
    id: Optional[str] = None
    job_id: str
    dedupe_key: str
    chunk_id: str
    repo_id: str
    snapshot_id: str
    document_id: str
    doc_path: str
    source_type: str
    chunk_type: str
    payload: Dict[str, Any]
    status: str = EmbeddingJobStatus.PENDING
    publish_backend: str = "redis_stream"
    retry_count: int = 0
    retry_history: List[Dict[str, Any]] = Field(default_factory=list)
    next_retry_at: Optional[datetime] = None
    processing_started_at: Optional[datetime] = None
    processing_completed_at: Optional[datetime] = None
    published_at: Optional[datetime] = None
    last_error: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)


def build_job_identity(chunk_id: str, snapshot_id: str) -> Dict[str, str]:
    dedupe_key = f"{chunk_id}:{snapshot_id}"
    job_hash = hashlib.sha256(dedupe_key.encode()).hexdigest()
    return {
        "dedupe_key": dedupe_key,
        "job_id": f"emb_{job_hash[:24]}",
    }
