// 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:args/args.dart';
import 'package:status_file/canonical_status_file.dart';
import 'package:status_file/status_file.dart' as status_file;
import 'package:status_file/status_file_linter.dart';
import 'package:status_file/status_file_normalizer.dart';
import 'package:status_file/utils.dart';

ArgParser buildParser() {
  var parser = ArgParser();
  parser.addFlag("overwrite",
      abbr: 'w',
      negatable: false,
      defaultsTo: false,
      help: "Overwrite input files with formatted output.");
  parser.addFlag("help",
      abbr: "h",
      negatable: false,
      defaultsTo: false,
      help: "Show help and commands for this tool.");
  return parser;
}

void printHelp(ArgParser parser) {
  print("Usage: dart status_file/bin/normalize.dart <path>");
  print(parser.usage);
}

void main(List<String> arguments) {
  var parser = buildParser();
  var results = parser.parse(arguments);
  if (results["help"]) {
    printHelp(parser);
    return;
  }
  if (results.rest.isEmpty) {
    printHelp(parser);
    exit(1);
  }
  print("");
  bool overwrite = results["overwrite"];
  for (var path in results.rest) {
    if (FileSystemEntity.isFileSync(path)) {
      normalizeFile(path, overwrite);
    } else if (FileSystemEntity.isDirectorySync(path)) {
      Directory(path).listSync(recursive: true).forEach((entry) {
        if (!canLint(entry.path)) {
          return;
        }
        normalizeFile(entry.path, overwrite);
      });
    }
  }
}

bool normalizeFile(String path, bool writeFile) {
  try {
    var statusFile = StatusFile.read(path);
    var normalizedStatusFile = normalizeStatusFile(statusFile);
    if (writeFile) {
      File(path).writeAsStringSync(normalizedStatusFile.toString());
      print("Normalized $path");
    } else {
      print(normalizedStatusFile);
    }
    // Check if there are linting errors remaining, such as line comments,
    // that needs to be handled manually.
    var lintErrors = lint(normalizedStatusFile);
    if (lintErrors.isNotEmpty) {
      print("The normalizer could not remove all linting errors. The following "
          "has to be removed manually:");
      lintErrors.forEach(print);
    }
  } on status_file.SyntaxError catch (error) {
    stderr.writeln("Could not parse $path:\n$error");
  }
  return false;
}
