// 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/material.dart';

/// Flutter code sample for [Scaffold.floatingActionButtonAnimator].

void main() => runApp(const ScaffoldFloatingActionButtonAnimatorApp());

class ScaffoldFloatingActionButtonAnimatorApp extends StatelessWidget {
  const ScaffoldFloatingActionButtonAnimatorApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: ScaffoldFloatingActionButtonAnimatorExample(),
    );
  }
}

enum FabAnimator { defaultStyle, none }

const List<(FabAnimator, String)> fabAnimatoregments = <(FabAnimator, String)>[
  (FabAnimator.defaultStyle, 'Default'),
  (FabAnimator.none, 'None'),
];

enum FabLocation { centerFloat, endFloat, endTop }

const List<(FabLocation, String)> fabLocationegments = <(FabLocation, String)>[
  (FabLocation.centerFloat, 'centerFloat'),
  (FabLocation.endFloat, 'endFloat'),
  (FabLocation.endTop, 'endTop'),
];

class ScaffoldFloatingActionButtonAnimatorExample extends StatefulWidget {
  const ScaffoldFloatingActionButtonAnimatorExample({super.key});

  @override
  State<ScaffoldFloatingActionButtonAnimatorExample> createState() =>
      _ScaffoldFloatingActionButtonAnimatorExampleState();
}

class _ScaffoldFloatingActionButtonAnimatorExampleState
    extends State<ScaffoldFloatingActionButtonAnimatorExample> {
  Set<FabAnimator> _selectedFabAnimator = <FabAnimator>{
    FabAnimator.defaultStyle,
  };
  Set<FabLocation> _selectedFabLocation = <FabLocation>{FabLocation.endFloat};
  FloatingActionButtonAnimator? _floatingActionButtonAnimator;
  FloatingActionButtonLocation? _floatingActionButtonLocation;
  bool _showFab = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButtonLocation: _floatingActionButtonLocation,
      floatingActionButtonAnimator: _floatingActionButtonAnimator,
      appBar: AppBar(title: const Text('FloatingActionButtonAnimator Sample')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            SegmentedButton<FabAnimator>(
              selected: _selectedFabAnimator,
              onSelectionChanged: (Set<FabAnimator> styles) {
                setState(() {
                  _floatingActionButtonAnimator = switch (styles.first) {
                    FabAnimator.defaultStyle => null,
                    FabAnimator.none =>
                      FloatingActionButtonAnimator.noAnimation,
                  };
                  _selectedFabAnimator = styles;
                });
              },
              segments: fabAnimatoregments.map<ButtonSegment<FabAnimator>>((
                (FabAnimator, String) fabAnimator,
              ) {
                final FabAnimator animator = fabAnimator.$1;
                final String label = fabAnimator.$2;
                return ButtonSegment<FabAnimator>(
                  value: animator,
                  label: Text(label),
                );
              }).toList(),
            ),
            const SizedBox(height: 10),
            SegmentedButton<FabLocation>(
              selected: _selectedFabLocation,
              onSelectionChanged: (Set<FabLocation> styles) {
                setState(() {
                  _floatingActionButtonLocation = switch (styles.first) {
                    FabLocation.centerFloat =>
                      FloatingActionButtonLocation.centerFloat,
                    FabLocation.endFloat =>
                      FloatingActionButtonLocation.endFloat,
                    FabLocation.endTop => FloatingActionButtonLocation.endTop,
                  };
                  _selectedFabLocation = styles;
                });
              },
              segments: fabLocationegments.map<ButtonSegment<FabLocation>>((
                (FabLocation, String) fabLocation,
              ) {
                final FabLocation location = fabLocation.$1;
                final String label = fabLocation.$2;
                return ButtonSegment<FabLocation>(
                  value: location,
                  label: Text(label),
                );
              }).toList(),
            ),
            const SizedBox(height: 10),
            FilledButton.icon(
              onPressed: () {
                setState(() {
                  _showFab = !_showFab;
                });
              },
              icon: Icon(_showFab ? Icons.visibility_off : Icons.visibility),
              label: const Text('Toggle FAB'),
            ),
          ],
        ),
      ),
      floatingActionButton: !_showFab
          ? null
          : FloatingActionButton(
              onPressed: () {},
              child: const Icon(Icons.add),
            ),
    );
  }
}
