"""
Command sets

All commands in the game must be grouped in a cmdset.  A given command
can be part of any number of cmdsets and cmdsets can be added/removed
and merged onto entities at runtime.

To create new commands to populate the cmdset, see
`commands/command.py`.

This module wraps the default command sets of Evennia; overloads them
to add/remove commands from the default lineup. You can create your
own cmdsets by inheriting from them or directly from `evennia.CmdSet`.

"""

from evennia import default_cmds
from commands import translated, building, wilderness, general, noexit
from contrib import slow_exit


class CharacterCmdSet(default_cmds.CharacterCmdSet):
    """
    The `CharacterCmdSet` contains general in-game commands like `look`,
    `get`, etc available on in-game Character objects. It is merged with
    the `AccountCmdSet` when an Account puppets a Character.
    """

    key = "DefaultCharacter"

    def at_cmdset_creation(self):
        """
        Populates the cmdset
        """
        super().at_cmdset_creation()
        # remove these so they don't exist anymore alongside their
        # translated versions.
        self.remove(default_cmds.CmdLook())
        self.remove(default_cmds.CmdInventory())
        self.remove(default_cmds.CmdGet())
        self.remove(default_cmds.CmdDrop())
        self.remove(default_cmds.CmdGive())
        #
        # overriding default commands with they translated version:
        #
        self.add(translated.CmdLook())
        self.add(translated.CmdInventory())
        self.add(translated.CmdGet())
        self.add(translated.CmdDrop())
        self.add(translated.CmdGive())

        # slow exit module
        self.add(slow_exit.CmdSetSpeed())

        # new commands from scratch:
        self.add(wilderness.CmdOrienta())
        self.add(general.CmdRimappa())
        self.add(general.CmdVai())

        # custom building tools:
        self.add(building.CmdTunnel())
        self.add(building.CmdPortal())

        # noexit "fake" commands:
        self.add(noexit.CmdNord())
        self.add(noexit.CmdSud())
        self.add(noexit.CmdOvest())
        self.add(noexit.CmdEst())
        self.add(noexit.CmdAlto())
        self.add(noexit.CmdBasso())
        self.add(noexit.CmdDentro())
        self.add(noexit.CmdFuori())
        self.add(noexit.CmdNordovest())
        self.add(noexit.CmdNordest())
        self.add(noexit.CmdSudovest())
        self.add(noexit.CmdSudest())

        #
        # disabled:
        #
        self.remove(default_cmds.CmdWhisper())  # whispers are handled by CmdSay
        self.remove(default_cmds.CmdHome())


class AccountCmdSet(default_cmds.AccountCmdSet):
    """
    This is the cmdset available to the Account at all times. It is
    combined with the `CharacterCmdSet` when the Account puppets a
    Character. It holds game-account-specific commands, channel
    commands, etc.
    """

    key = "DefaultAccount"

    def at_cmdset_creation(self):
        """
        Populates the cmdset
        """
        super().at_cmdset_creation()
        #
        # any commands you add below will overload the default ones.
        #


class UnloggedinCmdSet(default_cmds.UnloggedinCmdSet):
    """
    Command set available to the Session before being logged in.  This
    holds commands like creating a new account, logging in, etc.
    """

    key = "DefaultUnloggedin"

    def at_cmdset_creation(self):
        """
        Populates the cmdset
        """
        super().at_cmdset_creation()
        #
        # any commands you add below will overload the default ones.
        #


class SessionCmdSet(default_cmds.SessionCmdSet):
    """
    This cmdset is made available on Session level once logged in. It
    is empty by default.
    """

    key = "DefaultSession"

    def at_cmdset_creation(self):
        """
        This is the only method defined in a cmdset, called during
        its creation. It should populate the set with command instances.

        As and example we just add the empty base `Command` object.
        It prints some info.
        """
        super().at_cmdset_creation()
        #
        # any commands you add below will overload the default ones.
        #
