"""Legacy docs-ingestion chunk models and HTTP embedding job DTOs.

For pipeline embedding_records and Redis stream events, see:
- app.models.embedding_record
- app.models.stream_events
"""

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

from pydantic import BaseModel, Field


class DocChunk(BaseModel):
    id: Optional[str] = None
    chunk_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    repo_id: str
    doc_path: str
    section_title: str
    chunk_text: str
    chunk_hash: str
    source_type: str = "repo_doc"  # code, repo_doc, commit, route, dependency, architecture_summary
    
    # Token & Embedding Info
    token_count: Optional[int] = None
    embedding_model: Optional[str] = None  # e.g., "text-embedding-3-small"
    embedding_version: Optional[str] = None  # Version tracking for embeddings
    vector: Optional[List[float]] = None  # The actual embedding vector
    
    metadata: Dict[str, Any] = Field(default_factory=dict)
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: Optional[datetime] = None


class ChunkMetadataContract(BaseModel):
    chunk_id: Optional[str] = None
    repo_id: Optional[str] = None
    doc_path: Optional[str] = None
    chunk_type: str = "text"
    source_type: str = "repo_doc"
    section_title: Optional[str] = None
    section_level: Optional[int] = None
    heading: Optional[str] = None
    parent_section: Optional[str] = None
    heading_path: Optional[str] = None
    start_line: Optional[int] = None
    end_line: Optional[int] = None
    content_start_line: Optional[int] = None
    content_end_line: Optional[int] = None
    content_types: List[str] = Field(default_factory=list)
    chunk_index: Optional[int] = None
    section_index: Optional[int] = None
    chunk_order: Optional[int] = None
    char_count: Optional[int] = None
    token_count: Optional[int] = None
    snapshot: Dict[str, Optional[str]] = Field(default_factory=dict)
    markdown_entities: Dict[str, int] = Field(default_factory=dict)


class IngestionChunkContract(BaseModel):
    chunk_id: str
    repo_id: str
    doc_path: str
    section_title: str
    chunk_text: str
    chunk_hash: str
    source_type: str = "repo_doc"
    metadata: ChunkMetadataContract = Field(default_factory=ChunkMetadataContract)
    created_at: Optional[datetime] = None


class EmbeddingChunkPayloadContract(BaseModel):
    chunk_id: str
    repo_id: str
    snapshot_id: str
    document_id: str
    source_type: str
    chunk_type: str
    doc_path: str
    section_title: str
    section_level: int
    chunk_text: str
    chunk_hash: str
    metadata: Dict[str, Any] = Field(default_factory=dict)


def to_ingestion_chunk_contract(value: Dict[str, Any]) -> IngestionChunkContract:
    return IngestionChunkContract.model_validate(value)


class EmbeddingJobRequest(BaseModel):
    """Request to queue embedding job."""
    chunk_id: str
    chunk_text: str
    source_type: str = "repo_doc"
    metadata: Dict[str, Any] = Field(default_factory=dict)


class EmbeddingJobResponse(BaseModel):
    """Response from queued embedding job."""
    task_id: str
    chunk_id: str
    status: str  # queued, processing, completed, failed
    message: Optional[str] = None


class BatchEmbeddingRequest(BaseModel):
    """Request to queue batch embedding jobs."""
    chunks: List[EmbeddingJobRequest]
    source_type: str = "repo_doc"


class BatchEmbeddingResponse(BaseModel):
    """Response from batch embedding request."""
    batch_id: str
    total_chunks: int
    queued_chunks: int
    status: str
