from __future__ import annotations

import hashlib
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field

from app.models.enums import EmbedStatus


class EmbeddingRun(BaseModel):
    """Tracks a snapshot- or event-scoped embedding batch."""

    id: Optional[str] = None
    run_id: str
    dedupe_key: str
    repo_id: str
    snapshot_id: str
    event_id: Optional[str] = None
    run_type: str = "snapshot_batch"
    status: EmbedStatus = EmbedStatus.PENDING
    total_records: int = 0
    embedded_records: int = 0
    failed_records: int = 0
    retry_count: int = 0
    last_error: Optional[str] = None
    celery_task_id: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None


def build_run_dedupe_key(repo_id: str, snapshot_id: str, event_id: str) -> str:
    return f"{repo_id}:{snapshot_id}:{event_id}:embedding"


def build_run_id(dedupe_key: str) -> str:
    digest = hashlib.sha256(dedupe_key.encode("utf-8")).hexdigest()
    return f"erun_{digest[:24]}"
