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

  final String tokenGroup;

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

  final BuildContext context;
  late final ThemeData _theme = Theme.of(context);
  late final ColorScheme _colors = _theme.colorScheme;

  @override
  Color get backgroundColor => ${componentColor("$tokenGroup.container")};

  @override
  Color get actionTextColor =>  MaterialStateColor.resolveWith((Set<MaterialState> states) {
    if (states.contains(MaterialState.disabled)) {
      return ${componentColor("$tokenGroup.action.pressed.label-text")};
    }
    if (states.contains(MaterialState.pressed)) {
      return ${componentColor("$tokenGroup.action.pressed.label-text")};
    }
    if (states.contains(MaterialState.hovered)) {
      return ${componentColor("$tokenGroup.action.hover.label-text")};
    }
    if (states.contains(MaterialState.focused)) {
      return ${componentColor("$tokenGroup.action.focus.label-text")};
    }
    return ${componentColor("$tokenGroup.action.label-text")};
  });

  @override
  Color get disabledActionTextColor =>
    ${componentColor("$tokenGroup.action.pressed.label-text")};


  @override
  TextStyle get contentTextStyle =>
    ${textStyle("$tokenGroup.supporting-text")}!.copyWith
      (color:  ${componentColor("$tokenGroup.supporting-text")},
    );

  @override
  double get elevation => ${elevation("$tokenGroup.container")};

  @override
  ShapeBorder get shape => ${shape("$tokenGroup.container")};

  @override
  SnackBarBehavior get behavior => SnackBarBehavior.fixed;

  @override
  EdgeInsets get insetPadding => const EdgeInsets.fromLTRB(15.0, 5.0, 15.0, 10.0);

  @override
  bool get showCloseIcon => false;

  @override
  Color? get closeIconColor => ${componentColor("$tokenGroup.icon")};

  @override
  double get actionOverflowThreshold => 0.25;
}
''';
}
