import enum
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.pus_200_fsfw_modes import Modes
from config.object_ids import ACS_BOARD_ASS_ID, SUS_BOARD_ASS_ID

from .common import command_assembly


class AcsOpCodes:
    ACS_ASS_A_SIDE = ["0", "acs-a"]
    ACS_ASS_B_SIDE = ["1", "acs-b"]
    ACS_ASS_DUAL_MODE = ["2", "acs-d"]
    ACS_ASS_OFF = ["3", "acs-off"]
    ACS_ASS_A_ON = ["4", "acs-ao"]
    ACS_ASS_B_ON = ["5", "acs-bo"]
    ACS_ASS_DUAL_ON = ["6", "acs-do"]


class SusOpCodes:
    SUS_ASS_NOM_SIDE = ["0", "sus-nom"]
    SUS_ASS_RED_SIDE = ["1", "sus-red"]
    SUS_ASS_DUAL_MODE = ["2", "sus-d"]
    SUS_ASS_OFF = ["3", "sus-off"]


class DualSideSubmodes(enum.IntEnum):
    A_SIDE = 0
    B_SIDE = 1
    DUAL_SIDE = 2


def pack_acs_command(tc_queue: TcQueueT, op_code: str):
    if op_code in AcsOpCodes.ACS_ASS_A_SIDE:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.A_SIDE,
            tc_queue=tc_queue,
            info="Switching to ACS board assembly A side",
        )
    if op_code in AcsOpCodes.ACS_ASS_B_SIDE:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.B_SIDE,
            tc_queue=tc_queue,
            info="Switching to ACS board assembly B side",
        )
    if op_code in AcsOpCodes.ACS_ASS_DUAL_MODE:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.DUAL_SIDE,
            tc_queue=tc_queue,
            info="Switching to ACS board assembly dual mode",
        )
    if op_code in AcsOpCodes.ACS_ASS_A_ON:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.ON,
            submode=DualSideSubmodes.A_SIDE,
            tc_queue=tc_queue,
            info="Switching ACS board assembly A side on",
        )
    if op_code in AcsOpCodes.ACS_ASS_B_ON:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.ON,
            submode=DualSideSubmodes.B_SIDE,
            tc_queue=tc_queue,
            info="Switching ACS board assembly B side on",
        )
    if op_code in AcsOpCodes.ACS_ASS_DUAL_ON:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.ON,
            submode=DualSideSubmodes.B_SIDE,
            tc_queue=tc_queue,
            info="Switching ACS board assembly dual side on",
        )
    if op_code in AcsOpCodes.ACS_ASS_OFF:
        command_assembly(
            object_id=ACS_BOARD_ASS_ID,
            mode=Modes.OFF,
            submode=0,
            tc_queue=tc_queue,
            info="Switching to ACS board assembly off",
        )


def pack_sus_cmds(tc_queue: TcQueueT, op_code: str):
    if op_code in SusOpCodes.SUS_ASS_NOM_SIDE:
        command_assembly(
            object_id=SUS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.A_SIDE,
            tc_queue=tc_queue,
            info="Switching to SUS board to nominal side",
        )
    if op_code in SusOpCodes.SUS_ASS_RED_SIDE:
        command_assembly(
            object_id=SUS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.B_SIDE,
            tc_queue=tc_queue,
            info="Switching to SUS board to redundant side",
        )
    if op_code in SusOpCodes.SUS_ASS_OFF:
        command_assembly(
            object_id=SUS_BOARD_ASS_ID,
            mode=Modes.OFF,
            submode=0,
            tc_queue=tc_queue,
            info="Switching SUS board off",
        )
    if op_code in SusOpCodes.SUS_ASS_DUAL_MODE:
        command_assembly(
            object_id=SUS_BOARD_ASS_ID,
            mode=Modes.NORMAL,
            submode=DualSideSubmodes.DUAL_SIDE,
            tc_queue=tc_queue,
            info="Switching to SUS board to dual side",
        )