from abc import (
    ABCMeta,
)
from typing import (
    Type,
)

from edu_rdm_integration.adapters.helpers import (
    WebEduFunctionHelper,
)
from edu_rdm_integration.adapters.results import (
    WebEduFunctionResult,
)
from edu_rdm_integration.adapters.validators import (
    WebEduFunctionValidator,
)
from function_tools.functions import (
    BaseFunction,
    LazySavingPredefinedQueueFunction,
    LazySavingPredefinedQueueGlobalHelperFunction,
)


class WebEduFunction(BaseFunction, metaclass=ABCMeta):
    """
    Базовый класс для создания функций продуктов Образования.
    """


class WebEduLazySavingPredefinedQueueFunction(LazySavingPredefinedQueueFunction, metaclass=ABCMeta):
    """
    Базовый класс для создания функций с отложенным сохранением объектов
    моделей с предустановленной очередью продуктов Образования.
    """

    def _prepare_helper_class(self) -> Type[WebEduFunctionHelper]:
        """
        Возвращает класс помощника функции.
        """
        return WebEduFunctionHelper

    def _prepare_validator_class(self) -> Type[WebEduFunctionValidator]:
        """
        Возвращает класс валидатора функции.
        """
        return WebEduFunctionValidator

    def _prepare_result_class(self) -> Type[WebEduFunctionResult]:
        """
        Возвращает класс результата функции.
        """
        return WebEduFunctionResult


class WebEduLazySavingPredefinedQueueGlobalHelperFunction(
    LazySavingPredefinedQueueGlobalHelperFunction,
    metaclass=ABCMeta,
):
    """
    Базовый класс для создания функций с отложенным сохранением,
    предустановленной очередью на сохранение и глобальным помощником продуктов Образования.
    """