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

import 'package:args/args.dart';
import 'package:markdown/markdown.dart';

final extensionSets = <String, ExtensionSet>{
  'none': ExtensionSet.none,
  'CommonMark': ExtensionSet.commonMark,
  'GitHubFlavored': ExtensionSet.gitHubFlavored,
  'GitHubWeb': ExtensionSet.gitHubWeb,
};

Future main(List<String> args) async {
  var parser = new ArgParser()
    ..addFlag('help', negatable: false, help: 'Print help text and exit')
    ..addFlag('version', negatable: false, help: 'Print version and exit')
    ..addOption('extension-set',
        allowed: ['none', 'CommonMark', 'GitHubFlavored', 'GitHubWeb'],
        defaultsTo: 'CommonMark',
        help: 'Specify a set of extensions',
        allowedHelp: {
          'none': 'No extensions; similar to Markdown.pl',
          'CommonMark': 'Parse like CommonMark Markdown (default)',
          'GitHubFlavored': 'Parse like GitHub Flavored Markdown',
          'GitHubWeb': 'Parse like GitHub\'s Markdown-enabled web input fields',
        });
  var results = parser.parse(args);

  if (results['help'] as bool) {
    printUsage(parser);
    return;
  }

  if (results['version'] as bool) {
    print(version);
    return;
  }

  var extensionSet = extensionSets[results['extension-set']];

  if (results.rest.length > 1) {
    printUsage(parser);
    exitCode = 1;
    return;
  }

  if (results.rest.length == 1) {
    // Read argument as a file path.
    var input = new File(results.rest.first).readAsStringSync();
    print(markdownToHtml(input, extensionSet: extensionSet));
    return;
  }

  // Read from stdin.
  var buffer = new StringBuffer();
  String line;
  while ((line = stdin.readLineSync()) != null) {
    buffer.writeln(line);
  }
  print(markdownToHtml(buffer.toString(), extensionSet: extensionSet));
}

void printUsage(ArgParser parser) {
  print('''Usage: markdown.dart [options] [file]

Parse [file] as Markdown and print resulting HTML. If [file] is omitted,
use stdin as input.

By default, CommonMark Markdown will be parsed. This can be changed with
the --extensionSet flag.

${parser.usage}
''');
}
