import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:dartdoc/src/dartdoc_options.dart';
// 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 'package:logging/logging.dart';

final _logger = Logger('dartdoc');

/// A custom [Level] for tracking file writes and verification.
///
/// Has a value of `501` – one more than [Level.FINE].
final Level progressLevel = Level('PROGRESS', 501);

/// A custom [Level] for errant print statements.
///
/// Has a value of `1201` – one more than [Level.SHOUT].
final Level printLevel = Level('PRINT', 1201);

void logWarning(Object message) {
  _logger.log(Level.WARNING, message);
}

void logInfo(Object message) {
  _logger.log(Level.INFO, message);
}

void logProgress(Object message) {
  _logger.log(progressLevel, message);
}

void logPrint(Object message) {
  _logger.log(printLevel, message);
}

abstract class Jsonable {
  /// The `String` to print when in human-readable mode
  String get text;

  /// The JSON content to print when in JSON-output mode.
  Object toJson();

  @override
  String toString() => text;
}

void startLogging(LoggingContext config) {
  // By default, get all log output at `progressLevel` or greater.
  // This allows us to capture progress events and print `...`.
  Logger.root.level = progressLevel;
  if (config.json) {
    Logger.root.onRecord.listen((record) {
      if (record.level == progressLevel) {
        return;
      }

      var output = <String, dynamic>{'level': record.level.name};

      if (record.object is Jsonable) {
        output['data'] = record.object;
      } else {
        output['message'] = record.message;
      }

      print(json.encode(output));
    });
  } else {
    final stopwatch = Stopwatch()..start();

    // Used to track if we're printing `...` to show progress.
    // Allows unified new-line tracking
    var writingProgress = false;

    Logger.root.onRecord.listen((record) {
      if (record.level == progressLevel) {
        if (config.showProgress && stopwatch.elapsed.inMilliseconds > 250) {
          writingProgress = true;
          stdout.write('.');
          stopwatch.reset();
        }
        return;
      }

      stopwatch.reset();
      if (writingProgress) {
        // print a new line after progress dots...
        print('');
        writingProgress = false;
      }
      var message = record.message;
      assert(message == message.trimRight());
      assert(message.isNotEmpty);

      if (record.level < Level.WARNING) {
        if (!config.quiet) {
          if (config.showProgress && message.endsWith('...')) {
            // Assume there may be more progress to print, so omit the trailing
            // newline
            writingProgress = true;
            stdout.write(message);
          } else {
            print(message);
          }
        }
      } else {
        stderr.writeln(message);
      }
    });
  }
}

abstract class LoggingContext implements DartdocOptionContextBase {
  bool get json => optionSet['json'].valueAt(context);
  bool get showProgress => optionSet['showProgress'].valueAt(context);
  bool get quiet => optionSet['quiet'].valueAt(context);
}

Future<List<DartdocOption>> createLoggingOptions() async {
  return <DartdocOption>[
    DartdocOptionArgOnly<bool>('json', false,
        help: 'Prints out progress JSON maps. One entry per line.',
        negatable: true),
    DartdocOptionArgOnly<bool>('showProgress', false,
        help: 'Display progress indications to console stdout',
        negatable: false),
    DartdocOptionArgSynth<bool>('quiet',
        (DartdocSyntheticOption option, Directory dir) {
      if (option.root['generateDocs']?.valueAt(dir) == false) {
        return true;
      }
      return false;
    },
        abbr: 'q',
        negatable: true,
        help: 'Only show warnings and errors; silence all other output.'),
  ];
}
