// 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 SearchViewTemplate extends TokenTemplate {
  const SearchViewTemplate(super.blockName, super.fileName, super.tokens, {
    super.colorSchemePrefix = '_colors.',
    super.textThemePrefix = '_textTheme.'
  });

  @override
  String generate() => '''
class _${blockName}DefaultsM3 extends ${blockName}ThemeData {
  _${blockName}DefaultsM3(this.context, {required this.isFullScreen});

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

  static double fullScreenBarHeight = ${getToken('md.comp.search-view.full-screen.header.container.height')};

  @override
  Color? get backgroundColor => ${componentColor('md.comp.search-view.container')};

  @override
  double? get elevation => ${elevation('md.comp.search-view.container')};

  @override
  Color? get surfaceTintColor => ${colorOrTransparent('md.comp.search-view.container.surface-tint-layer.color')};

  // No default side

  @override
  OutlinedBorder? get shape => isFullScreen
    ? ${shape('md.comp.search-view.full-screen.container')}
    : ${shape('md.comp.search-view.docked.container')};

  @override
  TextStyle? get headerTextStyle => ${textStyleWithColor('md.comp.search-view.header.input-text')};

  @override
  TextStyle? get headerHintStyle => ${textStyleWithColor('md.comp.search-view.header.supporting-text')};

  @override
  BoxConstraints get constraints => const BoxConstraints(minWidth: 360.0, minHeight: 240.0);

  @override
  Color? get dividerColor => ${componentColor('md.comp.search-view.divider')};
}
''';
}
