// Copyright 2015 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.lib.rules.android;

import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import java.util.Collection;

public final class AndroidManifestMergeHelper {

  private AndroidManifestMergeHelper() {}

  public static void createMergeManifestAction(
      RuleContext ruleContext,
      Artifact merger,
      Iterable<Artifact> mergees,
      Collection<String> excludePermissions,
      Artifact mergedManifest) {
    CustomCommandLine.Builder commandLine = CustomCommandLine.builder();
    commandLine.addPrefixedExecPath("--merger=", merger);
    for (Artifact mergee : mergees) {
      commandLine.addPrefixedExecPath("--mergee=", mergee);
    }

    for (String excludePermission : excludePermissions) {
      commandLine.addPrefixed("--exclude_permission=", excludePermission);
    }

    commandLine.addPrefixedExecPath("--output=", mergedManifest);

    ruleContext.registerAction(
        new SpawnAction.Builder()
            .addInput(merger)
            .addInputs(mergees)
            .addOutput(mergedManifest)
            .setExecutable(ruleContext.getPrerequisite("$android_manifest_merge_tool", Mode.HOST))
            .setProgressMessage("Merging Android Manifests")
            .setMnemonic("AndroidManifestMerger")
            .addCommandLine(commandLine.build())
            .build(ruleContext));
  }
}
