"""The summary operator."""

from typing import Any, Optional

from dbgpt.core import LLMClient
from dbgpt.core.awel.flow import IOField, OperatorCategory, Parameter, ViewMetadata
from dbgpt.rag.assembler.summary import SummaryAssembler
from dbgpt.rag.knowledge.base import Knowledge
from dbgpt.rag.operators.assembler import AssemblerOperator
from dbgpt.util.i18n_utils import _


class SummaryAssemblerOperator(AssemblerOperator[Any, Any]):
    """The summary assembler operator."""

    metadata = ViewMetadata(
        label=_("Summary Operator"),
        name="summary_assembler_operator",
        category=OperatorCategory.RAG,
        description=_("The summary assembler operator."),
        inputs=[
            IOField.build_from(
                _("Knowledge"), "knowledge", Knowledge, _("Knowledge datasource")
            )
        ],
        outputs=[
            IOField.build_from(
                _("Document summary"),
                "summary",
                str,
                description="document summary",
            )
        ],
        parameters=[
            Parameter.build_from(
                _("LLM Client"),
                "llm_client",
                LLMClient,
                optional=True,
                default=None,
                description=_("The LLM Client."),
            ),
            Parameter.build_from(
                label=_("Model name"),
                name="model_name",
                type=str,
                optional=True,
                default="gpt-3.5-turbo",
                description=_("LLM model name"),
            ),
            Parameter.build_from(
                label=_("prompt language"),
                name="language",
                type=str,
                optional=True,
                default="en",
                description=_("prompt language"),
            ),
            Parameter.build_from(
                label=_("Max iteration with LLM"),
                name="max_iteration_with_llm",
                type=int,
                optional=True,
                default=5,
                description=_("prompt language"),
            ),
            Parameter.build_from(
                label=_("Concurrency limit with LLM"),
                name="concurrency_limit_with_llm",
                type=int,
                optional=True,
                default=3,
                description=_("The concurrency limit with llm"),
            ),
        ],
        documentation_url="https://github.com/openai/openai-python",
    )

    def __init__(
        self,
        llm_client: Optional[LLMClient],
        model_name: Optional[str] = "gpt-3.5-turbo",
        language: Optional[str] = "en",
        max_iteration_with_llm: Optional[int] = 5,
        concurrency_limit_with_llm: Optional[int] = 3,
        **kwargs
    ):
        """Create the summary assemble operator.

        Args:
              llm_client: (Optional[LLMClient]) The LLM client.
              model_name: (Optional[str]) The model name.
              language: (Optional[str]) The prompt language.
              max_iteration_with_llm: (Optional[int]) The max iteration with llm.
              concurrency_limit_with_llm: (Optional[int]) The concurrency limit with
                llm.
        """
        super().__init__(**kwargs)
        self._llm_client = llm_client
        self._model_name = model_name
        self._language = language
        self._max_iteration_with_llm = max_iteration_with_llm
        self._concurrency_limit_with_llm = concurrency_limit_with_llm

    async def map(self, knowledge: Knowledge) -> str:
        """Assemble the summary."""
        assembler = SummaryAssembler.load_from_knowledge(
            knowledge=knowledge,
            llm_client=self._llm_client,
            model_name=self._model_name,
            language=self._language,
            max_iteration_with_llm=self._max_iteration_with_llm,
            concurrency_limit_with_llm=self._concurrency_limit_with_llm,
        )
        return await assembler.generate_summary()

    def assemble(self, knowledge: Knowledge) -> Any:
        """Assemble the summary."""
        pass
