from __future__ import annotations

from typing import Any, Optional, Protocol

from decnet.web.db.models.topology import DeckyRow, EdgeRow, LANRow, TopologySummary


class TopologyRepository(Protocol):
    """Structural contract for the topology subsystem's repo dependency.

    Declares only the 10 methods the topology package actually calls.
    Any object with matching async signatures satisfies this Protocol
    without inheritance — including BaseRepository and test stubs.
    """

    async def create_topology(self, data: dict[str, Any]) -> str: ...
    async def get_topology(self, topology_id: str) -> Optional[TopologySummary]: ...
    async def update_topology_status(
        self, topology_id: str, new_status: str, reason: Optional[str] = None
    ) -> None: ...
    async def list_topologies(
        self, status: Optional[str] = None
    ) -> list[TopologySummary]: ...
    async def add_lan(self, data: dict[str, Any]) -> str: ...
    async def list_lans_for_topology(self, topology_id: str) -> list[LANRow]: ...
    async def add_topology_decky(self, data: dict[str, Any]) -> str: ...
    async def list_topology_deckies(self, topology_id: str) -> list[DeckyRow]: ...
    async def add_topology_edge(self, data: dict[str, Any]) -> str: ...
    async def list_topology_edges(self, topology_id: str) -> list[EdgeRow]: ...
