"""Tests for PeerDrop Core event bus."""

import trio

from peerdrop.core.events import (
    EventBus,
    PeerDiscovered,
    TransferCompleted,
    TransferProgress,
)


def test_event_bus_publish_sync():
    bus = EventBus()
    rx = bus.subscribe(PeerDiscovered)

    event = PeerDiscovered(peer_id="QmTest", addrs=["/ip4/1.2.3.4/tcp/4001"])
    bus.publish(event)

    # Should be available immediately (memory channel)
    received = rx.receive_nowait()
    assert received.peer_id == "QmTest"


def test_event_bus_multiple_subscribers():
    bus = EventBus()
    rx1 = bus.subscribe(TransferCompleted)
    rx2 = bus.subscribe(TransferCompleted)

    event = TransferCompleted(transfer_id="abc", file_name="test.txt")
    bus.publish(event)

    # Both subscribers should have the event
    msg1 = rx1.receive_nowait()
    msg2 = rx2.receive_nowait()
    assert msg1.transfer_id == "abc"
    assert msg2.transfer_id == "abc"


def test_event_bus_different_types():
    bus = EventBus()
    rx_peer = bus.subscribe(PeerDiscovered)
    rx_transfer = bus.subscribe(TransferCompleted)

    bus.publish(PeerDiscovered(peer_id="Qm1", addrs=[]))
    bus.publish(TransferCompleted(transfer_id="t1", file_name="f.txt"))

    peer_event = rx_peer.receive_nowait()
    transfer_event = rx_transfer.receive_nowait()

    assert isinstance(peer_event, PeerDiscovered)
    assert isinstance(transfer_event, TransferCompleted)


def test_event_bus_unsubscribe():
    bus = EventBus()
    bus.subscribe(PeerDiscovered)
    bus.unsubscribe_all()

    # After unsubscribe, publish should not crash
    bus.publish(PeerDiscovered(peer_id="Qm1", addrs=[]))
