// Copyright 2019 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';
import 'package:provider/provider.dart';

import 'dashboard_navigation_drawer.dart';
import 'logic/links.dart';
import 'state/index.dart';
import 'widgets/app_bar.dart';
import 'widgets/error_brook_watcher.dart';
import 'widgets/header_text.dart';

/// Index page.
///
/// Expects an [IndexState] to be available via [Provider].
class IndexPage extends StatelessWidget {
  const IndexPage({
    super.key,
  });

  static const String routeName = '/';

  static const Widget separator = SizedBox(height: 24.0);

  @override
  Widget build(BuildContext context) {
    final IndexState indexState = Provider.of<IndexState>(context);
    final List<CocoonLink> cocoonLinks = createCocoonLinks(context);
    return AnimatedBuilder(
      animation: indexState,
      builder: (BuildContext context, Widget? child) => Scaffold(
        appBar: const CocoonAppBar(
          title: Text('Cocoon'),
        ),
        body: ErrorBrookWatcher(
          errors: indexState.errors,
          child: Center(
            child: ListView(
              children: <Widget>[
                const HeaderText('Select a dashboard'),
                for (CocoonLink link in cocoonLinks)
                  Column(
                    children: <Widget>[
                      IntrinsicWidth(
                        stepWidth: 80.0,
                        child: ElevatedButton.icon(
                          icon: link.icon!,
                          label: Text(link.name!.toUpperCase()),
                          onPressed: link.action,
                        ),
                      ),
                      separator,
                    ],
                  )
              ],
            ),
          ),
        ),
        drawer: const DashboardNavigationDrawer(),
      ),
    );
  }
}
