from __future__ import annotations

from popup_window import PopupWindow, _FallbackGdk, _FallbackGtk


def _popup(**kwargs) -> PopupWindow:
    return PopupWindow(
        title="Accounts",
        gtk_module=_FallbackGtk,
        gdk_module=_FallbackGdk,
        **kwargs,
    )


def test_delete_event_handler_reports_event_handled() -> None:
    popup = _popup()

    assert popup._handle_delete_event() is True


def test_delete_event_hides_window_without_destroying_children() -> None:
    popup = _popup()
    content = popup.get_content_area()

    popup.show()
    popup.window.emit("delete-event", None)

    assert popup.is_closed is True
    assert popup.window.destroyed is False
    assert popup.get_content_area() is content


def test_window_survives_reopen_after_delete_event() -> None:
    popup = _popup()
    content = popup.get_content_area()

    popup.show()
    popup.window.emit("delete-event", None)
    popup.show()

    assert popup.is_closed is False
    assert popup.is_visible is True
    assert popup.get_content_area() is content


def test_focus_out_does_not_report_event_handled() -> None:
    popup = _popup()

    assert popup._handle_focus_out() is False


class _Requisition:
    def __init__(self, width: int, height: int) -> None:
        self.width = width
        self.height = height


def test_resize_to_content_uses_natural_size_request() -> None:
    popup = _popup()
    popup._content = type(
        "Content",
        (),
        {"get_preferred_size": lambda self: (_Requisition(10, 20), _Requisition(300, 400))},
    )()
    calls: list[tuple[int, int]] = []
    popup.window.resize = lambda width, height: calls.append((width, height))

    popup.resize_to_content()

    assert calls == [(300, 400)]
