"""Wiederverwendbare Bestätigungs-Dialoge fürs GTK-Frontend.

Vor destruktiven Aktionen (Pakete entfernen, Cache leeren, Bootloader ändern)
zeigen die Seiten einen `Adw.AlertDialog` und rufen den Callback nur bei
„Fortfahren". So liegt das Bestätigungsmuster an EINER Stelle.
"""
from __future__ import annotations

from typing import Callable

import gi

gi.require_version("Gtk", "4.0")
gi.require_version("Adw", "1")
from gi.repository import Adw, Gtk  # noqa: E402


def confirm(
    parent: Gtk.Widget,
    heading: str,
    body: str,
    on_confirm: Callable[[], None],
) -> None:
    """Zeigt einen Bestätigungs-Dialog. Ruft `on_confirm()`, wenn der Nutzer
    „Fortfahren" wählt; bei „Abbrechen" passiert nichts.

    `parent` ist irgendein Widget im Fenster — der Dialog hängt sich an dessen
    Root (Gtk.Window) an. Nicht-blockierend (libadwaita-Async-Pattern).
    """
    dialog = Adw.AlertDialog(heading=heading, body=body)
    dialog.add_response("cancel", "Cancel")
    dialog.add_response("confirm", "Continue")
    dialog.set_response_appearance("confirm", Adw.ResponseAppearance.DESTRUCTIVE)
    dialog.set_default_response("cancel")
    dialog.set_close_response("cancel")

    def _on_response(_dlg: Adw.AlertDialog, response: str) -> None:
        if response == "confirm":
            on_confirm()

    dialog.connect("response", _on_response)
    dialog.present(parent)
