"""Persist last-known Cloud entity catalogs for codegen (Core projection only)."""
from __future__ import annotations

from datetime import UTC, datetime
from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from src.domain.projects.models import ProjectCloudSchemaSnapshot


class ProjectCloudSchemaSnapshotRepository:
    def __init__(self, db: AsyncSession) -> None:
        self._db = db

    async def get_entities(self, project_id: UUID) -> list[dict]:
        row = await self._db.get(ProjectCloudSchemaSnapshot, project_id)
        if not row or not isinstance(row.entities_json, list):
            return []
        return [e for e in row.entities_json if isinstance(e, dict)]

    async def upsert(self, project_id: UUID, entities: list[dict]) -> None:
        now = datetime.now(UTC)
        payload = [e for e in entities if isinstance(e, dict)]
        row = await self._db.get(ProjectCloudSchemaSnapshot, project_id)
        if row is None:
            self._db.add(
                ProjectCloudSchemaSnapshot(
                    project_id=project_id,
                    entities_json=payload,
                    updated_at=now,
                )
            )
        else:
            row.entities_json = payload
            row.updated_at = now
        await self._db.flush()
