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

class NavigationBarTemplate extends TokenTemplate {
  const NavigationBarTemplate(super.blockName, super.fileName, super.tokens, {
    super.colorSchemePrefix = '_colors.',
    super.textThemePrefix = '_textTheme.',
  });

  @override
  String generate() => '''
class _${blockName}DefaultsM3 extends NavigationBarThemeData {
  _${blockName}DefaultsM3(this.context)
      : super(
          height: ${tokens["md.comp.navigation-bar.container.height"]},
          elevation: ${elevation("md.comp.navigation-bar.container")},
          labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
        );

  final BuildContext context;
  late final ColorScheme _colors = Theme.of(context).colorScheme;
  late final TextTheme _textTheme = Theme.of(context).textTheme;

  @override Color? get backgroundColor => ${componentColor("md.comp.navigation-bar.container")};

  @override Color? get surfaceTintColor => ${color("md.comp.navigation-bar.container.surface-tint-layer.color")};

  @override MaterialStateProperty<IconThemeData?>? get iconTheme {
    return MaterialStateProperty.resolveWith((Set<MaterialState> states) {
      return IconThemeData(
        size: ${tokens["md.comp.navigation-bar.icon.size"]},
        color: states.contains(MaterialState.selected)
          ? ${componentColor("md.comp.navigation-bar.active.icon")}
          : ${componentColor("md.comp.navigation-bar.inactive.icon")},
      );
    });
  }

  @override Color? get indicatorColor => ${componentColor("md.comp.navigation-bar.active-indicator")};
  @override ShapeBorder? get indicatorShape => ${shape("md.comp.navigation-bar.active-indicator")};

  @override MaterialStateProperty<TextStyle?>? get labelTextStyle {
    return MaterialStateProperty.resolveWith((Set<MaterialState> states) {
    final TextStyle style = ${textStyle("md.comp.navigation-bar.label-text")}!;
      return style.apply(color: states.contains(MaterialState.selected)
        ? ${componentColor("md.comp.navigation-bar.active.label-text")}
        : ${componentColor("md.comp.navigation-bar.inactive.label-text")}
      );
    });
  }
}
''';
}
