import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

import '../utils/haptics.dart';
import 'async_action_button.dart';

class ConfirmDialog extends StatelessWidget {
  final String title;
  final String content;
  final IconData? icon;
  final String confirmButton;

  /// Label of the cancel button. Set to `null` for a single-button dialog
  /// (only the confirm action is rendered).
  final String? cancelButton;
  final void Function()? onConfirm;
  final AsyncActionCallback? onConfirmAsync;
  final AsyncErrorBuilder? errorBuilder;

  const ConfirmDialog({
    super.key,
    required this.title,
    this.content = '',
    this.icon,
    this.confirmButton = 'Ok',
    this.cancelButton = 'Abbrechen',
    this.onConfirm,
    this.onConfirmAsync,
    this.errorBuilder,
  }) : assert(
         onConfirm != null || onConfirmAsync != null,
         'ConfirmDialog requires either onConfirm or onConfirmAsync',
       );

  void asDialog(BuildContext context) {
    showDialog(context: context, builder: build);
  }

  @override
  Widget build(BuildContext context) => AlertDialog(
    icon: icon != null ? Icon(icon) : null,
    title: Text(title),
    content: Text(content),
    actions: onConfirmAsync != null
        ? [
            AsyncDialogAction(
              confirmLabel: confirmButton,
              cancelLabel: cancelButton,
              onConfirm: onConfirmAsync!,
              errorBuilder: errorBuilder,
            ),
          ]
        : [
            if (cancelButton != null)
              TextButton(
                onPressed: () => Navigator.of(context).pop(),
                child: Text(cancelButton!),
              ),
            TextButton(
              onPressed: () {
                Haptics.confirm();
                Navigator.of(context).pop();
                onConfirm!();
              },
              child: Text(confirmButton),
            ),
          ],
  );

  static void openBrowser(BuildContext context, String url) {
    showDialog(
      context: context,
      builder: (context) => ConfirmDialog(
        title: 'Link öffnen',
        content: 'Möchtest du den folgenden Link öffnen?\n$url',
        confirmButton: 'Öffnen',
        onConfirm: () =>
            launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication),
      ),
    );
  }
}
