from typing import Union

from config.definitions import SPACE_PACKET_IDS
from tmtccmd.config.definitions import (
    ServiceOpCodeDictT,
)
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.utility.retval import RetvalDictT
from tmtccmd.utility.obj_id import ObjectIdDictT
from tmtccmd.com_if.com_interface_base import CommunicationInterface
from tmtccmd.core.backend import TmTcHandler
from tmtccmd.config.hook import TmTcHookBase

from config.retvals import get_retval_dict
from pus_tc.cmd_definitions import get_eive_service_op_code_dict


class EiveHookObject(TmTcHookBase):
    def __init__(self, json_cfg_path: str):
        super().__init__(json_cfg_path=json_cfg_path)

    def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT:
        return get_eive_service_op_code_dict()

    def assign_communication_interface(
        self, com_if_key: str
    ) -> Union[CommunicationInterface, None]:
        from tmtccmd.config.com_if import create_communication_interface_default

        return create_communication_interface_default(
            com_if_key=com_if_key,
            json_cfg_path=self.json_cfg_path,
            space_packet_ids=SPACE_PACKET_IDS,
        )

    def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int):
        from config.custom_mode_op import custom_mode_operation

        custom_mode_operation(mode=mode, tmtc_backend=tmtc_backend)

    def pack_service_queue(self, service: int, op_code: str, service_queue: TcQueueT):
        from pus_tc.tc_packer_hook import pack_service_queue_user

        pack_service_queue_user(
            service=service, op_code=op_code, service_queue=service_queue
        )

    def get_object_ids(self) -> ObjectIdDictT:
        from config.object_ids import get_object_ids

        return get_object_ids()

    def get_retval_dict(self) -> RetvalDictT:
        return get_retval_dict()