// Copyright (c) 2012, 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.

library compiled_dartdoc_validator;

import 'dart:async';

import '../../../pkg/pathos/lib/path.dart' as path;

import '../entrypoint.dart';
import '../io.dart';
import '../utils.dart';
import '../validator.dart';

/// Validates that a package doesn't contain compiled Dartdoc
/// output.
class CompiledDartdocValidator extends Validator {
  CompiledDartdocValidator(Entrypoint entrypoint)
    : super(entrypoint);

  Future validate() {
    return listDir(entrypoint.root.dir, recursive: true).then((entries) {
      for (var entry in entries) {
        if (path.basename(entry) != "nav.json") return false;
        var dir = path.dirname(entry);

        // Look for tell-tale Dartdoc output files all in the same directory.
        var files = [
          entry,
          path.join(dir, "index.html"),
          path.join(dir, "styles.css"),
          path.join(dir, "dart-logo-small.png"),
          path.join(dir, "client-live-nav.js")
        ];

        if (files.every((val) => fileExists(val))) {
          warnings.add("Avoid putting generated documentation in "
                  "${path.relative(dir)}.\n"
              "Generated documentation bloats the package with redundant "
                  "data.");
        }
      }
    });
  }
}
