import 'dart:async';

import 'package:flutter/material.dart';

Future<void> runAfterDrawerClose(
  BuildContext context,
  FutureOr<void> Function() action,
) async {
  Navigator.of(context).pop();
  await action();
}

Future<bool> confirmAccountAction(
  BuildContext context, {
  required String title,
  required String message,
  required String confirmLabel,
}) async {
  return await showDialog<bool>(
        context: context,
        builder: (dialogContext) => AlertDialog(
          title: Text(title),
          content: Text(message),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(dialogContext, false),
              child: const Text('取消'),
            ),
            TextButton(
              onPressed: () => Navigator.pop(dialogContext, true),
              child: Text(
                confirmLabel,
                style: const TextStyle(color: Colors.red),
              ),
            ),
          ],
        ),
      ) ??
      false;
}

class DrawerShell extends StatelessWidget {
  final double widthFactor;
  final Widget child;
  final bool showBackground;

  const DrawerShell({
    super.key,
    required this.child,
    this.widthFactor = 0.78,
    this.showBackground = true,
  });

  @override
  Widget build(BuildContext context) {
    return Drawer(
      width: MediaQuery.sizeOf(context).width * widthFactor,
      backgroundColor: Colors.transparent,
      elevation: 0,
      child: ClipRRect(
        borderRadius: const BorderRadius.horizontal(right: Radius.circular(28)),
        child: Stack(
          children: [
            if (showBackground) ...[
              Positioned.fill(
                child: Image.asset(
                  'assets/branding/drawer_background_v1.png',
                  fit: BoxFit.cover,
                  alignment: Alignment.centerLeft,
                ),
              ),
              Positioned.fill(
                child: DecoratedBox(
                  decoration: BoxDecoration(
                    gradient: LinearGradient(
                      begin: Alignment.topCenter,
                      end: Alignment.bottomCenter,
                      colors: [
                        Colors.white.withValues(alpha: 0.12),
                        Colors.white.withValues(alpha: 0.42),
                        Colors.white.withValues(alpha: 0.72),
                      ],
                      stops: const [0.0, 0.48, 1.0],
                    ),
                  ),
                ),
              ),
            ] else
              const Positioned.fill(child: ColoredBox(color: Colors.white)),
            child,
          ],
        ),
      ),
    );
  }
}
