from abc import ABC, abstractmethod

class BasePMSPlugin(ABC):
    """
    Базовый класс для всех PMS плагинов.
    Плагин должен уметь:
    - Возвращать данные fetch_data()
    - Предоставлять дефолтные parser_settings
    - Проходить базовую валидацию (validate_plugin)
    """
    
    def __init__(self, pms_config):
        """
        pms_config: объект PMSConfiguration
        """
        self.pms_config = pms_config


    @abstractmethod
    def _fetch_data(self):
        """
        Абстрактный метод для получения данных.
        """
        pass

    def fetch_data(self):
        """
        Обертка для выполнения _fetch_data с возможной дополнительной обработкой.
        """
        return self._fetch_data()

    @abstractmethod
    def get_default_parser_settings(self):
        """
        Возвращает словарь/JSON с дефолтными настройками разбора.
        Например:
        {
            "fields_mapping": {
                "reservation_id": "id",
                "check_in": "from",
                "check_out": "until"
            },
            "conditions": {
                "checkInStatus": "Заселен"
            }
        }
        """
        print("get_default_parser_settings. pms_config:", self.pms_config)
        return {}

    def validate_plugin(self):
        """
        Проверка на соответствие требованиям.
        Можно проверить наличие методов или полей.
        """
        # Например, проверить наличие fetch_data и get_default_parser_settings
        required_methods = ["fetch_data", "get_default_parser_settings"]
        for m in required_methods:
            if not hasattr(self, m):
                raise ValueError(f"Плагин {type(self).__name__} не реализует метод {m}.")
        # Можно добавить дополнительные проверки
        return True
