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

from core.extension.extensible import Extensible, ExtensionModule


class ExternalDataTool(Extensible, ABC):
    """
    The base class of external data tool.
    """

    module: ExtensionModule = ExtensionModule.EXTERNAL_DATA_TOOL

    app_id: str
    """the id of app"""
    variable: str
    """the tool variable name of app tool"""

    def __init__(self, tenant_id: str, app_id: str, variable: str, config: dict[str, Any] | None = None):
        super().__init__(tenant_id, config)
        self.app_id = app_id
        self.variable = variable

    @classmethod
    @abstractmethod
    def validate_config(cls, tenant_id: str, config: dict[str, Any]):
        """
        Validate the incoming form config data.

        :param tenant_id: the id of workspace
        :param config: the form config data
        :return:
        """
        raise NotImplementedError

    @abstractmethod
    def query(self, inputs: Mapping[str, Any], query: str | None = None) -> str:
        """
        Query the external data tool.

        :param inputs: user inputs
        :param query: the query of chat app
        :return: the tool query result
        """
        raise NotImplementedError
