from __future__ import annotations

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field

from app.models.enums import ChunkType, EmbedStatus, SourceType


class SnapshotEmbedRequest(BaseModel):
    repo_id: str
    snapshot_id: str
    commit_sha: str
    artifact_uri: Optional[str] = None
    event_id: Optional[str] = None


class CommitEmbedRequest(BaseModel):
    repo_id: str
    analysis_id: str
    commit_sha: str
    snapshot_id: Optional[str] = None
    event_id: Optional[str] = None


class PipelineJobResponse(BaseModel):
    run_id: str
    celery_task_id: str
    status: str = "queued"


class EmbeddingRunResponse(BaseModel):
    run_id: str
    repo_id: str
    snapshot_id: str
    event_id: Optional[str] = None
    run_type: str
    status: EmbedStatus
    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
    updated_at: datetime
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None


class EmbeddingRecordSummary(BaseModel):
    record_id: str
    repo_id: str
    snapshot_id: str
    source_type: SourceType
    chunk_type: ChunkType
    embed_status: EmbedStatus
    commit_sha: Optional[str] = None
    file_path: Optional[str] = None
    doc_path: Optional[str] = None
    symbol_name: Optional[str] = None
    section_title: Optional[str] = None
    graph_node_id: Optional[str] = None
    qdrant_point_id: Optional[str] = None
    upstream_chunk_id: Optional[str] = None
    upstream_analysis_id: Optional[str] = None
    text_preview: str = Field(max_length=240)
    updated_at: datetime


class EmbeddingRecordCountResponse(BaseModel):
    repo_id: str
    snapshot_id: str
    total: int
    embedded: Optional[int] = None
    pending: Optional[int] = None
    failed: Optional[int] = None


class ServiceVersionResponse(BaseModel):
    service: str
    version: str
    environment: str
