from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import TCS_CONTROLLER
from eive_tmtc.tmtc.tcs import CtrlSetId
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
from tmtccmd.config.tmtc import (
    tmtc_definitions_provider,
    TmtcDefinitionWrapper,
    OpCodeEntry,
)
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_3_fsfw_hk import (
    make_sid,
    generate_one_hk_command,
    create_request_one_diag_command,
    create_request_one_hk_command,
    create_enable_periodic_hk_command_with_interval_with_diag,
)


class OpCode:
    REQUEST_PRIMARY_TEMP_SET = "temp"
    ENABLE_TEMP_SET = "enable_temp_set"
    REQUEST_DEVICE_TEMP_SET = "temp_devs"
    REQUEST_DEVICE_SUS_SET = "temp_sus"
    REQUEST_HEATER_INFO = "heater_info"
    REQUEST_TCS_CTRL_INFO = "tcs_ctrl_info"


class Info:
    ENABLE_TEMP_SET = "Enable Primary Temperature Set"
    REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
    REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
    REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
    REQUEST_HEATER_INFO = "Request heater information"
    REQUEST_TCS_CTRL_INFO = "Request TCS controller information"


def pack_tcs_ctrl_commands(q: DefaultPusQueueHelper, op_code: str):
    if op_code == OpCode.REQUEST_PRIMARY_TEMP_SET:
        sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
        q.add_log_cmd(Info.REQUEST_PRIMARY_TEMP_SET)
        q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
    if op_code == OpCode.REQUEST_DEVICE_TEMP_SET:
        q.add_log_cmd(Info.REQUEST_DEVICE_TEMP_SET)
        q.add_pus_tc(
            generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
        )
    if op_code == OpCode.REQUEST_DEVICE_SUS_SET:
        q.add_log_cmd(Info.REQUEST_DEVICE_SUS_SET)
        q.add_pus_tc(
            generate_one_hk_command(
                make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
            )
        )
    if op_code == OpCode.REQUEST_HEATER_INFO:
        q.add_log_cmd(Info.REQUEST_HEATER_INFO)
        q.add_pus_tc(
            create_request_one_diag_command(
                make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
            )
        )
    if op_code == OpCode.REQUEST_TCS_CTRL_INFO:
        q.add_log_cmd(Info.REQUEST_TCS_CTRL_INFO)
        q.add_pus_tc(
            create_request_one_hk_command(
                make_sid(TCS_CONTROLLER, CtrlSetId.TCS_CTRL_INFO)
            )
        )
    if op_code == OpCode.ENABLE_TEMP_SET:
        interval_seconds = float(input("Please specify interval in seconds: "))
        cmds = create_enable_periodic_hk_command_with_interval_with_diag(
            False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
        )
        for cmd in cmds:
            q.add_pus_tc(cmd)
    pack_tcs_ass_cmds(q, op_code)


@tmtc_definitions_provider
def add_tcs_ctrl_cmds(defs: TmtcDefinitionWrapper):
    oce = OpCodeEntry()
    oce.add(keys=OpCode.ENABLE_TEMP_SET, info=Info.ENABLE_TEMP_SET)
    oce.add(keys=OpCode.REQUEST_PRIMARY_TEMP_SET, info=Info.REQUEST_PRIMARY_TEMP_SET)
    oce.add(keys=OpCode.REQUEST_DEVICE_TEMP_SET, info=Info.REQUEST_DEVICE_TEMP_SET)
    oce.add(keys=OpCode.REQUEST_DEVICE_SUS_SET, info=Info.REQUEST_DEVICE_SUS_SET)
    oce.add(keys=OpCode.REQUEST_HEATER_INFO, info=Info.REQUEST_HEATER_INFO)
    oce.add(keys=OpCode.REQUEST_TCS_CTRL_INFO, info=Info.REQUEST_TCS_CTRL_INFO)
    defs.add_service(
        name=CustomServiceList.TCS_CTRL,
        info="TCS controller",
        op_code_entry=oce,
    )