#!/usr/bin/env python

r"""
State Manager module:

   - Defines Valid states of the system

"""
from robot.libraries.BuiltIn import BuiltIn

BuiltIn().import_resource("state_manager.robot")

# We will build eventually the mapping for warm, cold reset as well.
VALID_STATES = {
    'reboot':
    {
         # (Power Policy, BMC state, Chassis State, Host State)
         ('LEAVE_OFF','Ready','Off','Off'),
         ('ALWAYS_POWER_ON','Ready','On','Running'),
         ('ALWAYS_POWER_ON','Ready','On','Off'),
         ('RESTORE_LAST_STATE','Ready','On','Running'),
         ('RESTORE_LAST_STATE','Ready','On','Off'),
         ('RESTORE_LAST_STATE','Ready','Off','Off'),
    },
}


class state_map():

    def get_system_state(self):
        r"""
        Return the system state as a tuple of power policy, bmc, chassis and
        host states.
        """
        power_policy = BuiltIn().run_keyword('Get System Power Policy')
        bmc_state = BuiltIn().run_keyword('Get BMC State')
        chassis_state = BuiltIn().run_keyword('Get Chassis Power State')
        host_state = BuiltIn().run_keyword('Get Host State')
        return (str(power_policy),
                str(bmc_state),
                str(chassis_state),
                str(host_state))

    def valid_boot_state(self, boot_type, state_set):
        r"""
        Validate a given set of states is valid.

        Description of arguments:
        boot_type   Reset type (reboot/warm/cold)
        state_set   State set (bmc,chassis,host)
        """
        if state_set in set(VALID_STATES[boot_type]):
            return True
        else:
            return False
