// 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/foundation.dart';
import 'package:flutter/material.dart';

typedef ShowSnackBarCallback = ScaffoldFeatureController<SnackBar, SnackBarClosedReason> Function(SnackBar snackBar);

class TaskBox extends StatelessWidget {
  const TaskBox({super.key, this.cellSize, required this.child});

  final Widget child;
  final double? cellSize;

  static const double _kDefaultCellSize = 20;
  static const double _kWebCellSize = 36;

  /// Status messages that map to [TaskStatus] enums.
  // TODO(chillers): Remove these and use TaskStatus enum when available. https://github.com/flutter/cocoon/issues/441
  static const String statusCancelled = 'Cancelled';
  static const String statusFailed = 'Failed';
  static const String statusNew = 'New';
  static const String statusSkipped = 'Skipped';
  static const String statusSucceeded = 'Succeeded';
  static const String statusInfraFailure = 'Infra Failure';
  static const String statusInProgress = 'In Progress';

  /// A lookup table to define the background color for this TaskBox.
  ///
  /// The status messages are based on the messages the backend sends.
  ///
  /// These colors should map to the MILO color scheme.
  static const Map<String, Color> statusColor = <String, Color>{
    statusCancelled: Colors.lightBlue,
    statusFailed: Colors.red,
    statusNew: Colors.grey,
    statusSkipped: Colors.transparent,
    statusSucceeded: Colors.green,
    statusInfraFailure: Colors.purple,
    statusInProgress: Colors.yellow,
  };

  /// Returns the cell size of the nearest task box, or null if there is no
  /// nearest task box.
  static double? maybeOf(BuildContext context) {
    final _TaskBox? box = context.dependOnInheritedWidgetOfExactType<_TaskBox>();
    return box?.size;
  }

  /// Returns the cell size of the nearest task box.
  static double of(BuildContext context) {
    return maybeOf(context) ?? _kDefaultCellSize;
  }

  @override
  Widget build(BuildContext context) {
    final double size = cellSize ?? (kIsWeb ? _kWebCellSize : _kDefaultCellSize);
    return _TaskBox(
      size: TaskBox.maybeOf(context) ?? size,
      child: child,
    );
  }
}

class _TaskBox extends InheritedWidget {
  const _TaskBox({
    required this.size,
    required super.child,
  });

  final double size;

  @override
  bool updateShouldNotify(covariant _TaskBox oldWidget) => size != oldWidget.size;
}
