from abc import ABC, abstractmethod
from typing import Dict

from mlagents.envs import AllBrainInfo, BrainParameters


class BaseUnityEnvironment(ABC):
    @abstractmethod
    def step(
        self, vector_action=None, memory=None, text_action=None, value=None
    ) -> AllBrainInfo:
        pass

    @abstractmethod
    def reset(
        self, config=None, train_mode=True, custom_reset_parameters=None
    ) -> AllBrainInfo:
        pass

    @property
    @abstractmethod
    def global_done(self):
        pass

    @property
    @abstractmethod
    def external_brains(self) -> Dict[str, BrainParameters]:
        pass

    @property
    @abstractmethod
    def reset_parameters(self) -> Dict[str, float]:
        pass

    @abstractmethod
    def close(self):
        pass
