from config.definitions import CustomServiceList
from config.object_ids import BPX_HANDLER_ID
from tmtccmd import DefaultProcedureInfo, TcHandlerBase
from tmtccmd.tc import DefaultPusQueueHelper, service_provider
from tmtccmd.tc.decorator import ServiceProviderParams
from tmtccmd.tc.pus_8_funccmd import make_fsfw_action_cmd
from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid


class BpxSetIds:
    GET_HK_SET = 0
    GET_CFG_SET = 5


class BpxActionIds:
    REBOOT = 2
    RESET_COUNTERS = 3
    SET_CFG = 4
    GET_CFG = 5


class BpxOpCodes:
    HK = ["0", "hk"]
    RST_BOOT_CNT = ["1", "rst_boot_cnt"]
    REQUEST_CFG = ["2", "cfg"]
    REQUEST_CFG_HK = ["3", "cfg_hk"]
    REBOOT = ["4", "reboot"]


@service_provider(CustomServiceList.BPX_BATTERY.value)
def pack_bpx_commands(p: ServiceProviderParams):
    op_code = p.op_code
    q = p.queue_helper
    if op_code in BpxOpCodes.HK:
        q.add_log_cmd("Requesting BPX battery HK set")
        sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetIds.GET_HK_SET)
        q.add_pus_tc(generate_one_hk_command(sid=sid))
    if op_code in BpxOpCodes.RST_BOOT_CNT:
        q.add_log_cmd("Resetting reboot counters")
        q.add_pus_tc(
            make_fsfw_action_cmd(
                object_id=BPX_HANDLER_ID, action_id=BpxActionIds.RESET_COUNTERS
            )
        )
    if op_code in BpxOpCodes.REQUEST_CFG:
        q.add_log_cmd("Requesting configuration struct")
        q.add_pus_tc(
            make_fsfw_action_cmd(
                object_id=BPX_HANDLER_ID, action_id=BpxActionIds.GET_CFG
            )
        )
    if op_code in BpxOpCodes.REQUEST_CFG_HK:
        q.add_log_cmd("Requesting configuration struct HK")
        sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetIds.GET_CFG_SET)
        q.add_pus_tc(generate_one_hk_command(sid=sid))
    if op_code in BpxOpCodes.REBOOT:
        q.add_log_cmd("Rebooting BPX battery")
        q.add_pus_tc(
            make_fsfw_action_cmd(
                object_id=BPX_HANDLER_ID, action_id=BpxActionIds.REBOOT
            )
        )