// 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 pub.validator.compiled_dartdoc;

import 'dart:async';

import 'package:path/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 syncFuture(() {
      for (var entry in listDir(entrypoint.root.dir, recursive: true)) {
        if (path.basename(entry) != "nav.json") continue;
        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.");
        }
      }
    });
  }
}
