// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/cupertino.dart';

import '../../gallery/demo.dart';

class CupertinoAlertDemo extends StatefulWidget {
  static const String routeName = '/cupertino/alert';

  @override
  _CupertinoAlertDemoState createState() => _CupertinoAlertDemoState();
}

class _CupertinoAlertDemoState extends State<CupertinoAlertDemo> {
  String? lastSelectedValue;

  void showDemoDialog({required BuildContext context, Widget? child}) {
    showCupertinoDialog<String>(
      context: context,
      builder: (BuildContext context) => child!,
    ).then((String? value) {
      if (value != null) {
        setState(() { lastSelectedValue = value; });
      }
    });
  }

  void showDemoActionSheet({required BuildContext context, Widget? child}) {
    showCupertinoModalPopup<String>(
      context: context,
      builder: (BuildContext context) => child!,
    ).then((String? value) {
      if (value != null) {
        setState(() { lastSelectedValue = value; });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        middle: const Text('Alerts'),
        // We're specifying a back label here because the previous page is a
        // Material page. CupertinoPageRoutes could auto-populate these back
        // labels.
        previousPageTitle: 'Cupertino',
        trailing: CupertinoDemoDocumentationButton(CupertinoAlertDemo.routeName),
      ),
      child: DefaultTextStyle(
        style: CupertinoTheme.of(context).textTheme.textStyle,
        child: Builder(
          builder: (BuildContext context) {
            return Stack(
              alignment: Alignment.center,
              children: <Widget>[
                CupertinoScrollbar(
                  child: ListView(
                    // Add more padding to the normal safe area.
                    padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 72.0)
                        + MediaQuery.of(context).padding,
                    children: <Widget>[
                      CupertinoButton.filled(
                        child: const Text('Alert'),
                        onPressed: () => _onAlertPress(context),
                      ),
                      const Padding(padding: EdgeInsets.all(8.0)),
                      CupertinoButton.filled(
                        child: const Text('Alert with Title'),
                        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0),
                        onPressed: () => _onAlertWithTitlePress(context),
                      ),
                      const Padding(padding: EdgeInsets.all(8.0)),
                      CupertinoButton.filled(
                        child: const Text('Alert with Buttons'),
                        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0),
                        onPressed: () => _onAlertWithButtonsPress(context),
                      ),
                      const Padding(padding: EdgeInsets.all(8.0)),
                      CupertinoButton.filled(
                        child: const Text('Alert Buttons Only'),
                        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0),
                        onPressed: () {
                          showDemoDialog(
                            context: context,
                            child: const CupertinoDessertDialog(),
                          );
                        },
                      ),
                      const Padding(padding: EdgeInsets.all(8.0)),
                      CupertinoButton.filled(
                        child: const Text('Action Sheet'),
                        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 36.0),
                        onPressed: () => _onActionSheetPress(context),
                      ),
                    ],
                  ),
                ),
                if (lastSelectedValue != null)
                  Positioned(
                    bottom: 32.0,
                    child: Text('You selected: $lastSelectedValue'),
                  ),
              ],
            );
          },
        ),
      ),
    );
  }

  void _onAlertPress(BuildContext context) {
    showDemoDialog(
      context: context,
      child: CupertinoAlertDialog(
        title: const Text('Discard draft?'),
        actions: <Widget>[
          CupertinoDialogAction(
            child: const Text('Discard'),
            isDestructiveAction: true,
            onPressed: () => Navigator.pop(context, 'Discard'),
          ),
          CupertinoDialogAction(
            child: const Text('Cancel'),
            isDefaultAction: true,
            onPressed: () => Navigator.pop(context, 'Cancel'),
          ),
        ],
      ),
    );
  }

  void _onAlertWithTitlePress(BuildContext context) {
    showDemoDialog(
      context: context,
      child: CupertinoAlertDialog(
        title: const Text('Allow "Maps" to access your location while you are using the app?'),
        content: const Text('Your current location will be displayed on the map and used '
          'for directions, nearby search results, and estimated travel times.'),
        actions: <Widget>[
          CupertinoDialogAction(
            child: const Text("Don't Allow"),
            onPressed: () => Navigator.pop(context, 'Disallow'),
          ),
          CupertinoDialogAction(
            child: const Text('Allow'),
            onPressed: () => Navigator.pop(context, 'Allow'),
          ),
        ],
      ),
    );
  }

  void _onAlertWithButtonsPress(BuildContext context) {
    showDemoDialog(
      context: context,
      child: const CupertinoDessertDialog(
        title: Text('Select Favorite Dessert'),
        content: Text('Please select your favorite type of dessert from the '
          'list below. Your selection will be used to customize the suggested '
          'list of eateries in your area.'),
      ),
    );
  }

  void _onActionSheetPress(BuildContext context)  {
    showDemoActionSheet(
      context: context,
      child: CupertinoActionSheet(
        title: const Text('Favorite Dessert'),
        message: const Text('Please select the best dessert from the options below.'),
        actions: <Widget>[
          CupertinoActionSheetAction(
            child: const Text('Profiteroles'),
            onPressed: () => Navigator.pop(context, 'Profiteroles'),
          ),
          CupertinoActionSheetAction(
            child: const Text('Cannolis'),
            onPressed: () => Navigator.pop(context, 'Cannolis'),
          ),
          CupertinoActionSheetAction(
            child: const Text('Trifle'),
            onPressed: () => Navigator.pop(context, 'Trifle'),
          ),
        ],
        cancelButton: CupertinoActionSheetAction(
          child: const Text('Cancel'),
          isDefaultAction: true,
          onPressed: () => Navigator.pop(context, 'Cancel'),
        ),
      ),
    );
  }
}

class CupertinoDessertDialog extends StatelessWidget {
  const CupertinoDessertDialog({Key? key, this.title, this.content}) : super(key: key);

  final Widget? title;
  final Widget? content;

  @override
  Widget build(BuildContext context) {
    return CupertinoAlertDialog(
      title: title,
      content: content,
      actions: <Widget>[
        CupertinoDialogAction(
          child: const Text('Cheesecake'),
          onPressed: () {
            Navigator.pop(context, 'Cheesecake');
          },
        ),
        CupertinoDialogAction(
          child: const Text('Tiramisu'),
          onPressed: () {
            Navigator.pop(context, 'Tiramisu');
          },
        ),
        CupertinoDialogAction(
          child: const Text('Apple Pie'),
          onPressed: () {
            Navigator.pop(context, 'Apple Pie');
          },
        ),
        CupertinoDialogAction(
          child: const Text("Devil's food cake"),
          onPressed: () {
            Navigator.pop(context, "Devil's food cake");
          },
        ),
        CupertinoDialogAction(
          child: const Text('Banana Split'),
          onPressed: () {
            Navigator.pop(context, 'Banana Split');
          },
        ),
        CupertinoDialogAction(
          child: const Text('Oatmeal Cookie'),
          onPressed: () {
            Navigator.pop(context, 'Oatmeal Cookies');
          },
        ),
        CupertinoDialogAction(
          child: const Text('Chocolate Brownie'),
          onPressed: () {
            Navigator.pop(context, 'Chocolate Brownies');
          },
        ),
        CupertinoDialogAction(
          child: const Text('Cancel'),
          isDestructiveAction: true,
          onPressed: () {
            Navigator.pop(context, 'Cancel');
          },
        ),
      ],
    );
  }
}
