// Copyright 2018 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.devtools.build.docgen;

import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/** Assembles a list of native rules that can be exported to a builtin.proto file. */
public class ProtoFileBuildEncyclopediaProcessor extends BuildEncyclopediaProcessor {
  private ImmutableList<RuleDocumentation> nativeRules = null;

  public ProtoFileBuildEncyclopediaProcessor(
      RuleLinkExpander linkExpander, ConfiguredRuleClassProvider ruleClassProvider) {
    super(linkExpander, ruleClassProvider);
  }

  /*
   * Collects and processes all rule and attribute documentation in inputDirs and generates a list
   * of RuleDocumentation objects.
   */
  @Override
  public void generateDocumentation(List<String> inputDirs, String outputFile, String denyList)
      throws BuildEncyclopediaDocException, IOException {
    BuildDocCollector collector = new BuildDocCollector(linkExpander, ruleClassProvider, false);
    Map<String, RuleDocumentation> ruleDocEntries = collector.collect(inputDirs, denyList);
    RuleFamilies ruleFamilies = assembleRuleFamilies(ruleDocEntries.values());
    ImmutableList.Builder<RuleDocumentation> ruleDocsBuilder = new ImmutableList.Builder<>();

    for (RuleFamily entry : ruleFamilies.all) {
      for (RuleDocumentation doc : entry.getRules()) {
        ruleDocsBuilder.add(doc);
      }
    }
    nativeRules = ruleDocsBuilder.build();
  }

  public ImmutableList<RuleDocumentation> getNativeRules() {
    return nativeRules;
  }
}
