from __future__ import annotations

from pydantic import BaseModel, Field, field_validator

from app.models.mongo_ref import MongoReference, parse_mongo_uri


class StreamEventEnvelope(BaseModel):
    """Common metadata on pipeline Redis stream events."""

    event_id: str
    event_version: str = "v1"
    repo_id: str


class GraphArtifactReadyEvent(StreamEventEnvelope):
    """graph.artifact.ready — snapshot graph finalized (Code Parser)."""

    snapshot_id: str
    commit_sha: str
    artifact_id: str
    artifact_uri: str
    parser_version: str | None = None
    graph_schema_version: str = "v1"
    node_count: int | None = None
    edge_count: int | None = None

    def artifact_ref(self) -> MongoReference:
        return parse_mongo_uri(self.artifact_uri)


class CommitAnalysisReadyEvent(StreamEventEnvelope):
    """commit.analysis.ready — commit narrative ready (Commit Intelligence)."""

    commit_sha: str
    analysis_id: str
    base_commit_sha: str | None = None
    summary: str | None = None
    impacted_symbols: list[str] = Field(default_factory=list)
    changed_files: list[str] = Field(default_factory=list)
    graph_schema_version: str = "v1"

    @field_validator("impacted_symbols", "changed_files", mode="before")
    @classmethod
    def _default_lists(cls, value: list[str] | None) -> list[str]:
        return value or []


STREAM_GRAPH_ARTIFACT_READY = "graph.artifact.ready"
STREAM_COMMIT_ANALYSIS_READY = "commit.analysis.ready"
