// Copyright 2019 The Flutter team. 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:gallery/data/gallery_options.dart';
import 'package:gallery/l10n/gallery_localizations.dart';
import 'package:gallery/layout/focus_traversal_policy.dart';
import 'package:gallery/pages/home.dart' as home;
import 'package:gallery/studies/starter/home.dart';

const _primaryColor = Color(0xFF6200EE);

class StarterApp extends StatefulWidget {
  const StarterApp({Key key, this.navigatorKey}) : super(key: key);

  final GlobalKey<NavigatorState> navigatorKey;

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

class _StarterAppState extends State<StarterApp> {
  FocusNode firstFocusNode;
  FocusNode lastFocusNode;

  @override
  void initState() {
    super.initState();
    firstFocusNode = FocusNode();
    lastFocusNode = FocusNode();
  }

  @override
  void dispose() {
    firstFocusNode.dispose();
    lastFocusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final backButtonFocusNode =
        home.InheritedFocusNodes.of(context).backButtonFocusNode;

    return MaterialApp(
      navigatorKey: widget.navigatorKey,
      title: GalleryLocalizations.of(context).starterAppTitle,
      debugShowCheckedModeBanner: false,
      localizationsDelegates: GalleryLocalizations.localizationsDelegates,
      supportedLocales: GalleryLocalizations.supportedLocales,
      locale: GalleryOptions.of(context).locale,
      home: DefaultFocusTraversal(
        policy: EdgeChildrenFocusTraversalPolicy(
          firstFocusNodeOutsideScope: backButtonFocusNode,
          lastFocusNodeOutsideScope: backButtonFocusNode,
          firstFocusNodeInsideScope: firstFocusNode,
          lastFocusNodeInsideScope: lastFocusNode,
        ),
        child: ApplyTextOptions(
          child: HomePage(
            firstFocusNode: firstFocusNode,
            lastFocusNode: lastFocusNode,
          ),
        ),
      ),
      theme: ThemeData(
        primaryColor: _primaryColor,
        highlightColor: Colors.transparent,
        colorScheme: ColorScheme(
          primary: _primaryColor,
          primaryVariant: const Color(0xFF3700B3),
          secondary: const Color(0xFF03DAC6),
          secondaryVariant: const Color(0xFF018786),
          background: Colors.white,
          surface: Colors.white,
          onBackground: Colors.black,
          error: const Color(0xFFB00020),
          onError: Colors.white,
          onPrimary: Colors.white,
          onSecondary: Colors.black,
          onSurface: Colors.black,
          brightness: Brightness.light,
        ),
        dividerTheme: DividerThemeData(
          thickness: 1,
          color: const Color(0xFFE5E5E5),
        ),
        platform: GalleryOptions.of(context).platform,
      ),
    );
  }
}
