// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. 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:io';
import 'package:path/path.dart' as path;

enum Level { debug, info, warning, error }

abstract class Logger {
  Level level;

  Logger(this.level);

  void info(String msg, [error, StackTrace stackTrace]);
  void warning(String msg, [error, StackTrace stackTrace]);
  void error(String msg, [error, StackTrace stackTrace]);
  void debug(String msg, [error, StackTrace stackTrace]);

  void destroy();
}

String _formatMessage(String msg, error, [StackTrace stackTrace]) {
  if (error == null) return msg;
  if (stackTrace == null) return msg + ": $error";
  return msg + ": $error\n$stackTrace";
}

class StdOutLogger extends Logger {
  StdOutLogger(Level level) : super(level);

  @override
  void info(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.info, "$_datetime Info: $msg");
  }

  @override
  void warning(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.warning, "$_datetime Warning: $msg");
  }

  @override
  void error(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.error, "$_datetime Error: $msg");
  }

  @override
  void debug(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.debug, "$_datetime Debug: $msg");
  }

  void _print(Level logLevel, String msg) {
    if (logLevel.index >= level.index) {
      print(msg);
    }
  }

  @override
  void destroy() {
    // nothing to do
  }

  String get _datetime => "${new DateTime.now()}";
}

class FileLogger extends Logger {
  IOSink _sink;

  FileLogger(String fileName, Level level, {bool append: false})
      : super(level) {
    var mode = append ? FileMode.APPEND : FileMode.WRITE;
    _sink = new File(path.absolute(fileName)).openWrite(mode: mode);
  }

  @override
  void destroy() {
    if (_sink != null) {
      _sink.close();
      _sink = null;
    }
  }

  @override
  void info(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.info, "$_datetime Info: $msg");
  }

  @override
  void warning(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.warning, "$_datetime Warning: $msg");
  }

  @override
  void error(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.error, "$_datetime Error: $msg");
  }

  @override
  void debug(String msg, [error, stackTrace]) {
    msg = _formatMessage(msg, error, stackTrace);
    _print(Level.debug, "$_datetime Debug: $msg");
  }

  void _print(Level logLevel, String msg) {
    if (logLevel.index >= level.index && _sink != null) _sink.writeln(msg);
  }

  static String get _datetime => "${new DateTime.now()}";
}
