"""
This program has been developed by students from the bachelor Computer Science at Utrecht
University within the Software Project course.
© Copyright Utrecht University (Department of Information and Computing Sciences)
"""


class LLMInstructions:
    """
    Helper class to construct the system instructions for the LLM.

    It combines the base persona (Pepper robot) with dynamic norms and goals
    provided by the BDI system.

    If no norms/goals are given it assumes empty lists.

    :ivar norms: A list of behavioral norms.
    :ivar goals: A list of specific conversational goals.
    """

    @staticmethod
    def default_norms() -> list[str]:
        return [
            "Be friendly and respectful.",
            "Make the conversation feel natural and engaging.",
        ]

    @staticmethod
    def default_goals() -> list[str]:
        return [
            "Try to learn the user's name during conversation.",
        ]

    def __init__(self, norms: list[str] | None = None, goals: list[str] | None = None):
        self.norms = norms or self.default_norms()
        self.goals = goals or self.default_goals()

    def build_developer_instruction(self) -> str:
        """
        Builds the final system prompt string.

        The prompt includes:
        1.  Persona definition.
        2.  Constraint on response length.
        3.  Instructions on how to handle goals (reach them in order, but prioritize natural flow).
        4.  The specific list of norms.
        5.  The specific list of goals.

        :return: The formatted system prompt string.
        """
        sections = [
            "You are a Pepper robot engaging in natural human conversation.",
            "Keep responses between 1–3 sentences, unless told otherwise.\n",
            "You're given goals to reach. Reach them in order, but make the conversation feel "
            "natural. Some turns you should not try to achieve your goals.\n",
        ]

        if self.norms:
            sections.append("Norms to follow:")
            for norm in self.norms:
                sections.append("- " + norm)
            sections.append("")

        if self.goals:
            sections.append("Goals to reach:")
            for goal in self.goals:
                sections.append("- " + goal)
            sections.append("")

        return "\n".join(sections).strip()
