from abc import ABC, abstractmethod
from typing import Any, Mapping

from agentdhal_core import ComponentBase
from pydantic import BaseModel

from ._task import TaskRunner


class Team(ABC, TaskRunner, ComponentBase[BaseModel]):
    component_type = "team"

    @property
    @abstractmethod
    def name(self) -> str:
        """The name of the team. This is used by team to uniquely identify itself
        in a larger team of teams."""
        ...

    @property
    @abstractmethod
    def description(self) -> str:
        """A description of the team. This is used to provide context about the
        team and its purpose to its parent orchestrator."""
        ...

    @abstractmethod
    async def reset(self) -> None:
        """Reset the team and all its participants to its initial state."""
        ...

    @abstractmethod
    async def pause(self) -> None:
        """Pause the team and all its participants. This is useful for
        pausing the :meth:`agentdhal_agentchat.base.TaskRunner.run` or
        :meth:`agentdhal_agentchat.base.TaskRunner.run_stream` methods from
        concurrently, while keeping them alive."""
        ...

    @abstractmethod
    async def resume(self) -> None:
        """Resume the team and all its participants from a pause after
        :meth:`pause` was called."""
        ...

    @abstractmethod
    async def save_state(self) -> Mapping[str, Any]:
        """Save the current state of the team."""
        ...

    @abstractmethod
    async def load_state(self, state: Mapping[str, Any]) -> None:
        """Load the state of the team."""
        ...
