from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.config import QueueCommands
from tmtccmd.tc.pus_200_fsfw_modes import Modes
from tmtccmd.utility import ObjectId

from .common import command_mode
import config.object_ids as obj_ids

from pus_tc.prompt_parameters import prompt_parameters


class OpCodes:
    THERMAL_CONTROLLER = [obj_ids.THERMAL_CONTROLLER_ID.hex(), "ctrl-th"]
    CORE_CONTROLLER = [obj_ids.CORE_CONTROLLER_ID.hex(), "ctrl-core"]


class Info:
    THERMAL_CONTROLLER = "Thermal controller"
    CORE_CONTROLLER = "ACS controller"


def pack_cmd_ctrl_to_prompted_mode(tc_queue: TcQueueT, object_id: ObjectId):
    parameters = prompt_parameters(
        [
            {"name": "Mode", "defaultValue": "2"},
            {"name": "Submode", "defaultValue": "0"},
        ]
    )
    mode = int(parameters["Mode"])
    if mode < 0 or mode > 2:
        print("Invalid Mode, defaulting to OFF")
        mode = 0
    submode = int(parameters["Submode"])
    command_mode(
        object_id=object_id.as_bytes,
        mode=mode,
        submode=submode,
        tc_queue=tc_queue,
        info=f"Commanding {object_id} to {mode}, {submode}",
    )


def pack_cmd_ctrl_to_off(tc_queue: TcQueueT, object_id: ObjectId):
    command_mode(
        object_id=object_id.as_bytes,
        mode=Modes.OFF,
        submode=0,
        tc_queue=tc_queue,
        info=f"Commanding {object_id} OFF",
    )


def pack_cmd_ctrl_to_on(tc_queue: TcQueueT, object_id: ObjectId):
    command_mode(
        object_id=object_id.as_bytes,
        mode=Modes.ON,
        submode=0,
        tc_queue=tc_queue,
        info=f"Commanding {object_id} ON",
    )


def pack_cmd_ctrl_to_nml(tc_queue: TcQueueT, object_id: ObjectId):
    command_mode(
        object_id=object_id.as_bytes,
        mode=Modes.NORMAL,
        submode=0,
        tc_queue=tc_queue,
        info=f"Commanding {object_id} NORMAL",
    )


def get_object_from_op_code(op_code: str):
    try:
        return bytes.fromhex(op_code)
    except:
        pass

    if op_code in OpCodes.THERMAL_CONTROLLER:
        return obj_ids.THERMAL_CONTROLLER_ID
    if op_code in OpCodes.CORE_CONTROLLER:
        return obj_ids.CORE_CONTROLLER_ID