"""
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 evennia.contrib.grid import extended_room
from evennia.contrib.game_systems.gendersub import SetGender
from evennia.contrib.rpg.rpsystem import RPSystemCmdSet
from evennia.contrib.rpg.character_creator.character_creator import ContribChargenCmdSet
from commands.sittables import CmdNoSitStand
from commands.everyone import (CmdTake, CmdThink, CmdWhisper, CmdRead,
                               CmdEat, CmdDrink, CmdUse, CmdPush,
                               CmdPull, CmdOpen, CmdClose, CmdFeed)
from commands.say import CmdSay
from commands.scoring import CmdScore
from commands.hint import CmdHint
from commands.misc import CmdLight
from commands.wizards import (CmdGM, CmdSpell, CmdGMTrigger,
                              CmdMakeCocktail, CmdGift)
from typeclasses.tutorial import CmdTutorial


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()
        self.add(CmdTutorial)
        self.add(CmdHint)
        self.add(CmdNoSitStand)
        self.add(CmdEat)
        self.add(CmdDrink)
        self.add(CmdUse)
        self.add(CmdPush)
        self.add(CmdPull)
        self.add(CmdOpen)
        self.add(CmdClose)
        self.add(CmdLight)
        self.add(CmdTake)
        self.add(CmdThink)
        self.add(SetGender)
        self.add(RPSystemCmdSet)
        self.add(extended_room.ExtendedRoomCmdSet)
        self.add(CmdSay)
        self.add(CmdWhisper)
        self.add(CmdRead)
        self.add(CmdGM)
        self.add(CmdSpell)
        self.add(CmdGMTrigger)
        self.add(CmdMakeCocktail)
        self.add(CmdGift)
        self.add(CmdFeed)
        self.add(CmdScore)


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.
        #
        self.add(ContribChargenCmdSet)


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.
        #
