from abc import ABC, abstractmethod


class Behavior(ABC):
    """
    Base interface for skills.
    Each skill must implement:
      - execute(reset: bool, *args) -> bool
      - is_ready(*args) -> bool
    """

    def __init__(self, agent):
        from agent.base_agent import Base_Agent  # type hinting

        self.agent: Base_Agent = agent

    @abstractmethod
    def execute(self, reset: bool, *args, **kwargs) -> bool:
        """
        Executes one step of the skill.

        Parameters
        ----------
        reset : bool
            Indicates if this is the first invocation of this skill (should reset internal state).
        *args
            Skill-specific arguments.

        Returns
        -------
        finished : bool
            True if the skill has finished execution.
        """
        raise NotImplementedError("Method 'execute' must be implemented in the Skill.")

    @abstractmethod
    def is_ready(self, *args) -> bool:
        """
        Checks if the current conditions allow starting the skill.

        Returns
        -------
        ready : bool
        """
        raise NotImplementedError("Method 'is_ready' must be implemented in the Skill.")
