// Copyright 2015 The Vanadium 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 'dart:core';

import 'package:flutter/material.dart';
import 'package:logging/logging.dart';

import '../styles/common.dart' as style;

final Logger log = new Logger('components/toast');

class Durations {
  static const Duration permanent = const Duration(days: 100);
  static const Duration long = const Duration(seconds: 5);
  static const Duration medium = kSnackBarMediumDisplayDuration;
  static const Duration short = kSnackBarShortDisplayDuration;
}

ScaffoldFeatureController _currSnackBar;

void info(GlobalKey scaffoldKey, String text,
    {Duration duration: Durations.short}) {
  _closePrevious();
  _currSnackBar = scaffoldKey.currentState
      .showSnackBar(new SnackBar(content: new Text(text), duration: duration));
}

void error(GlobalKey scaffoldKey, String text, Error err,
    {Duration duration: Durations.long}) {
  _closePrevious();
  _currSnackBar = scaffoldKey.currentState.showSnackBar(new SnackBar(
      // TODO(aghassemi): Add "Details" action to error toasts and move error text there.
      content: new Text(text + ' - ERROR: $err', style: style.Text.error),
      duration: duration));

  log.severe(err);
}

void _closePrevious() {
  // TODO(aghassemi): Fix this in Flutter. Currently close() throws exception
  // if snackbar is already closed.
  try {
    _currSnackBar?.close();
  } catch (e) {}
}
