"""Core EIVE TM handler module
"""
from config.object_ids import get_object_ids
from spacepackets.ecss import PusTelemetry
from spacepackets.ecss.pus_17_test import Service17Tm
from spacepackets.util import PrintFormats
from tmtccmd import get_console_logger
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
from tmtccmd.pus import VerificationWrapper
from tmtccmd.tm import Service20FsfwTm, Service200FsfwTm
from tmtccmd.tm.pus_17_test import Service17TmExtended
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter

from .event_handler import handle_event_packet
from .verification_handler import handle_service_1_fsfw_packet
from .hk_handling import handle_hk_packet
from .action_reply_handler import handle_action_reply

LOGGER = get_console_logger()


def pus_factory_hook(
    packet: bytes,
    verif_wrapper: VerificationWrapper,
    printer: FsfwTmTcPrinter,
    raw_logger: RawTmtcTimedLogWrapper,
):
    if len(packet) < 8:
        LOGGER.warning("Detected packet shorter than 8 bytes!")
        return
    try:
        tm_packet = PusTelemetry.unpack(packet)
    except ValueError:
        LOGGER.warning("Could not generate PUS TM object from raw data")
        LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}")
        return
    service = tm_packet.service
    file_logger = printer.file_logger
    obj_id_dict = get_object_ids()
    dedicated_handler = True
    if service == 1:
        handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
    elif service == 3:
        handle_hk_packet(printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict)
    elif service == 5:
        handle_event_packet(raw_tm=packet, printer=printer, file_logger=file_logger)
    elif service == 8:
        handle_action_reply(raw_tm=packet, printer=printer, obj_id_dict=obj_id_dict)
    elif service == 17:
        tm_packet = Service17Tm.unpack(raw_telemetry=packet)
        if tm_packet.subservice == 2:
            verif_wrapper.dlog("Received Ping Reply TM[17,2]")
        dedicated_handler = True
    elif service == 20:
        tm_packet = Service20FsfwTm.unpack(raw_telemetry=packet)
        dedicated_handler = False
    elif service == 200:
        tm_packet = Service200FsfwTm.unpack(raw_telemetry=packet)
        dedicated_handler = False
    else:
        LOGGER.info(f"The service {service} is not implemented in Telemetry Factory")
        tm_packet.print_source_data(PrintFormats.HEX)
        dedicated_handler = True
    if not dedicated_handler and tm_packet is not None:
        printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
    raw_logger.log_tm(tm_packet)