from trezor import utils
from trezor.wire.thp import ChannelState

if utils.USE_THP:
    import unittest
    from typing import TYPE_CHECKING

    from mock_wire_interface import MockHID
    from storage import cache_thp
    from trezor.wire import context
    from trezor.wire.thp import interface_manager
    from trezor.wire.thp.channel import Channel
    from trezor.wire.thp.session_context import SessionContext

    _MOCK_INTERFACE_HID = b"\x00"

    if TYPE_CHECKING:
        from trezor.wire import WireInterface

    def dummy_decode_iface(cached_iface: bytes):
        return MockHID(0xDEADBEEF)

    def get_new_channel(channel_iface: WireInterface | None = None) -> Channel:
        interface_manager.decode_iface = dummy_decode_iface
        channel_cache = cache_thp.get_new_channel(_MOCK_INTERFACE_HID)
        channel = Channel(channel_cache)
        channel.set_channel_state(ChannelState.TH1)
        if channel_iface is not None:
            channel.iface = channel_iface
        return channel

    def prepare_context() -> None:
        channel = get_new_channel()
        session_cache = cache_thp.get_new_session(channel.channel_cache)
        session_ctx = SessionContext(channel, session_cache)
        context.CURRENT_CONTEXT = session_ctx


if __debug__:
    # Disable log.debug
    def suppres_debug_log() -> None:
        from trezor import log

        log.debug = lambda name, msg, *args: None