#
# Copyright (c) FIRST and other WPILib contributors.
# Open Source Software; you can modify and/or share it under the terms of
# the WPILib BSD license file in the root directory of this project.
#

import enum
import commands2


class RobotContainer:
    """This class is where the bulk of the robot should be declared. Since Command-based is a
    "declarative" paradigm, very little robot logic should actually be handled in the :class:`.Robot`
    periodic methods (other than the scheduler calls). Instead, the structure of the robot (including
    subsystems, commands, and button mappings) should be declared here.
    """

    # The enum used as keys for selecting the command to run.
    class CommandSelector(enum.Enum):
        ONE = enum.auto()
        TWO = enum.auto()
        THREE = enum.auto()

    # An example selector method for the selectcommand.
    def select(self) -> CommandSelector:
        """Returns the selector that will select which command to run.
        Can base this choice on logical conditions evaluated at runtime.
        """
        return self.CommandSelector.ONE

    def __init__(self) -> None:
        # An example selectcommand. Will select from the three commands based on the value returned
        # by the selector method at runtime. Note that selectcommand takes a generic type, so the
        # selector does not have to be an enum; it could be any desired type (string, integer,
        # boolean, double...)
        self.example_select_command = commands2.SelectCommand(
            # Maps selector values to commands
            {
                self.CommandSelector.ONE: commands2.PrintCommand(
                    "Command one was selected!"
                ),
                self.CommandSelector.TWO: commands2.PrintCommand(
                    "Command two was selected!"
                ),
                self.CommandSelector.THREE: commands2.PrintCommand(
                    "Command three was selected!"
                ),
            },
            self.select,
        )

        # Configure the button bindings
        self.configureButtonBindings()

    def configureButtonBindings(self) -> None:
        """Use this method to define your button->command mappings. Buttons can be created by
        instantiating a {GenericHID} or one of its subclasses
        ({org.wpilib.driverstation.Joystick} or {XboxController}), and then calling passing it to a
        {org.wpilib.command2.button.JoystickButton}.
        """

    def getAutonomousCommand(self) -> commands2.Command:
        """Use this to pass the autonomous command to the main {Robot} class.

        :returns: the command to run in autonomous
        """
        return self.example_select_command
