/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.android;

import static com.facebook.buck.rules.BuildableProperties.Kind.LIBRARY;

import com.facebook.buck.graph.AbstractBreadthFirstTraversal;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleDependencyVisitors;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.util.Optionals;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;

public class AndroidTransitiveDependencyGraph {


  private final ImmutableSortedSet<BuildRule> rulesToTraverseForTransitiveDeps;

  /**
   * @param deps A set of dependencies for a {@link BuildRule}, presumably one that is in the
   *     process of being constructed via its builder.
   */
  AndroidTransitiveDependencyGraph(ImmutableSortedSet<BuildRule> deps) {
    this.rulesToTraverseForTransitiveDeps = deps;
  }
  public ImmutableSet<SourcePath> findManifestFiles() {

    final ImmutableSet.Builder<SourcePath> manifestFiles = ImmutableSet.builder();

    new AbstractBreadthFirstTraversal<BuildRule>(rulesToTraverseForTransitiveDeps) {
      @Override
      public ImmutableSet<BuildRule> visit(BuildRule rule) {
        if (rule instanceof AndroidResource) {
          AndroidResource androidRule = (AndroidResource) rule;
          SourcePath manifestFile = androidRule.getManifestFile();
          if (manifestFile != null) {
            manifestFiles.add(manifestFile);
          }
        } else if (rule instanceof AndroidLibrary) {
          AndroidLibrary androidLibraryRule = (AndroidLibrary) rule;
          Optionals.addIfPresent(androidLibraryRule.getManifestFile(), manifestFiles);
        }
        return BuildRuleDependencyVisitors.maybeVisitAllDeps(
            rule,
            rule.getProperties().is(LIBRARY));
      }
    }.start();

    return manifestFiles.build();
  }
}
