/*
 * 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 com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleType;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;

import java.util.Set;

public class AndroidTransitiveDependencies {
  // TODO(devjasta): these fields should not be immutable; we should expect that these values
  // will all be transformed by various commands (and we shouldn't need to keep checking back to
  // get the latest values of them to observe those transformations).  There's a much richer
  // rule-based design that should be implemented though, so in the absence of that it's probably
  // best to keep this code as narrowly defined as possible.
  public ImmutableSet<String> classpathEntriesToDex;
  public final ImmutableSet<String> noDxClasspathEntries;
  public final ImmutableSet<String> pathsToThirdPartyJars;
  public final ImmutableSet<String> assetsDirectories;
  public final ImmutableSet<String> nativeLibsDirectories;
  public final ImmutableSet<String> manifestFiles;
  public final ImmutableSet<String> resDirectories;
  public final ImmutableSet<String> rDotJavaPackages;
  public final ImmutableMultimap<BuildRuleType,BuildRule> uncachedBuildRules;
  public final ImmutableSet<String> proguardConfigs;

  public AndroidTransitiveDependencies(Set<String> pathsToDex,
                                       Set<String> pathsToThirdPartyJars,
                                       ImmutableSet<String> assetsDirectories,
                                       ImmutableSet<String> nativeLibsDirectories,
                                       ImmutableSet<String> manifestFiles,
                                       ImmutableSet<String> resDirectories,
                                       ImmutableSet<String> rDotJavaPackages,
                                       ImmutableMultimap<BuildRuleType,BuildRule> uncachedBuildRules,
                                       ImmutableSet<String> proguardConfigs,
                                       ImmutableSet<String> noDxClasspathEntries) {
    this.classpathEntriesToDex = ImmutableSet.copyOf(pathsToDex);
    this.pathsToThirdPartyJars = ImmutableSet.copyOf(pathsToThirdPartyJars);
    this.assetsDirectories = ImmutableSet.copyOf(assetsDirectories);
    this.nativeLibsDirectories = ImmutableSet.copyOf(nativeLibsDirectories);
    this.manifestFiles = ImmutableSet.copyOf(manifestFiles);
    this.resDirectories = ImmutableSet.copyOf(resDirectories);
    this.rDotJavaPackages = ImmutableSet.copyOf(rDotJavaPackages);
    this.uncachedBuildRules = ImmutableMultimap.copyOf(uncachedBuildRules);
    this.proguardConfigs = ImmutableSet.copyOf(proguardConfigs);
    this.noDxClasspathEntries = ImmutableSet.copyOf(noDxClasspathEntries);
  }

  public void applyClasspathTransformation(InputTransformation transformation) {
    classpathEntriesToDex = ImmutableSet.copyOf(
        Iterables.transform(classpathEntriesToDex, transformation));
  }

  public interface InputTransformation extends Function<String, String> {
  }
}
