"""Previews domain - business logic."""
from __future__ import annotations
from typing import Optional
from uuid import UUID

from src.core.exceptions import NotFoundError
from src.domain.previews.adapters import get_adapter
from src.domain.previews.repository import PreviewRepository, RoutesManifestRepository


class PreviewService:
    def __init__(
        self,
        preview_repo: PreviewRepository,
        manifest_repo: RoutesManifestRepository,
    ):
        self._preview_repo = preview_repo
        self._manifest_repo = manifest_repo

    async def create_preview(self, project_id: UUID, revision_id: UUID):
        return await self._preview_repo.create(project_id, revision_id)

    async def list_previews(self, project_id: UUID):
        return await self._preview_repo.list_for_project(project_id)

    async def get_preview(self, preview_id: UUID):
        pe = await self._preview_repo.get_by_id(preview_id)
        if not pe:
            raise NotFoundError("Preview not found")
        return pe

    async def stop_preview(self, preview_id: UUID):
        pe = await self._preview_repo.get_by_id(preview_id)
        if not pe:
            raise NotFoundError("Preview not found")
        await self._preview_repo.stop(preview_id)

    async def get_routes_manifest(
        self, project_id: UUID, revision_id: Optional[UUID] = None
    ) -> dict:
        manifest = await self._manifest_repo.get_latest(project_id, revision_id)
        if manifest:
            return manifest.manifest
        return {
            "routes": [{"path": "/", "label": "Home", "type": "page"}],
            "generated_at": None,
            "source": "default",
        }
