var fs = require('fs');
var path = require('canonical-path');
var Package = require('dgeni').Package;
var basePackage = require('../api-builder/docs-package');
var targetPackage = require('../api-builder/target-package');
var cheatsheetPackage = require('../api-builder/cheatsheet-package');

var PROJECT_PATH = path.resolve(__dirname, "../..");
var PUBLIC_PATH = path.resolve(PROJECT_PATH, 'public');
var DOCS_PATH = path.resolve(PUBLIC_PATH, 'docs');
var ANGULAR_REPO_PATH = path.resolve(__dirname, '../../../angular-dart');
// The 'docs' folder is actually named 'doc' for angular2 Dart.
var ANGULAR2_DOCS_PATH = path.resolve(ANGULAR_REPO_PATH, 'doc');
var NG_IO_PKG_PATH = path.resolve(__dirname, "../api-builder/angular.io-package");

function requireNgIoPkg(_path) { return require(path.resolve(NG_IO_PKG_PATH, _path)); }

module.exports = new Package('dart-api-and-cheatsheet-builder', [basePackage, targetPackage, cheatsheetPackage])

  // overrides base packageInfo and returns the one for the Angular repo.
  .factory(require('./services/packageInfo'))

  // Configure rendering
  .config(function (templateFinder, renderDocsProcessor) {

    templateFinder.templateFolders
      .unshift(path.resolve(NG_IO_PKG_PATH, 'templates'));

    // helpers are made available to the nunjucks templates
    renderDocsProcessor.helpers.relativePath = function (from, to) {
      return path.relative(from, to);
    };
  })

  .config(function (parseTagsProcessor, getInjectables) {
    const tagDefs = requireNgIoPkg('./tag-defs');
    parseTagsProcessor.tagDefinitions =
      parseTagsProcessor.tagDefinitions.concat(getInjectables(tagDefs));
  })

  .config(function (readFilesProcessor) {
    // confirm that the angular repo is actually there.
    if (!fs.existsSync(ANGULAR_REPO_PATH)) {
      throw new Error('dart-api-and-cheatsheet-builder task requires the angular2 repo to be at ' + ANGULAR_REPO_PATH);
    }
    readFilesProcessor.basePath = DOCS_PATH;
    readFilesProcessor.sourceFiles = [{
      basePath: ANGULAR2_DOCS_PATH,
      include: path.resolve(ANGULAR2_DOCS_PATH, 'cheatsheet/*.md')
    }];
  })

  .config(function (convertPrivateClassesToInterfacesProcessor,
    createOverviewDump,
    extractDecoratedClassesProcessor,
    extractJSDocCommentsProcessor,
    extractTitleFromGuides,
    generateNavigationDoc,
    mergeDecoratorDocs,
    readTypeScriptModules
  ) {
    // Clear out unwanted processors
    createOverviewDump.$enabled = false;
    convertPrivateClassesToInterfacesProcessor.$enabled = false;
    extractDecoratedClassesProcessor.$enabled = false;
    extractJSDocCommentsProcessor.$enabled = false;
    extractTitleFromGuides.$enabled = false;
    generateNavigationDoc.$enabled = false;
    mergeDecoratorDocs.$enabled = false;
    readTypeScriptModules.$enabled = false;
  })

  .config(function (computePathsProcessor) {
    computePathsProcessor.pathTemplates.push({
      docTypes: ['cheatsheet-data'],
      pathTemplate: '../guide/cheatsheet.json',
      outputPathTemplate: '${path}'
    });
  })

  .config(function (getLinkInfo) {
    getLinkInfo.relativeLinks = true;
  })

  .config(function (templateEngine, getInjectables) {
    templateEngine.filters = templateEngine.filters.concat(getInjectables([
      requireNgIoPkg('./rendering/trimBlankLines'),
      requireNgIoPkg('./rendering/toId'),
      requireNgIoPkg('./rendering/indentForMarkdown')
    ]));
  })

  ;