/*
 * Copyright 2014-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.ocaml;

import com.facebook.buck.rules.AbstractBuildRule;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.BuildableContext;
import com.facebook.buck.rules.RuleKey;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.fs.MkdirStep;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;

import java.nio.file.Path;

/**
 * Creates a debug launch script. The script will run OCaml debugger with
 * the target binary loaded. This works with bytecode and provides limited debugging
 * functionality like stepping, breakpoints, etc.
 */
public class OCamlDebugLauncher extends AbstractBuildRule {
  private final OCamlDebugLauncherStep.Args args;

  public OCamlDebugLauncher(
      BuildRuleParams params,
      SourcePathResolver resolver,
      OCamlDebugLauncherStep.Args args) {
    super(params, resolver);
    this.args = args;
  }

  @Override
  protected ImmutableCollection<Path> getInputsToCompareToOutput() {
    return ImmutableList.of();
  }

  @Override
  protected RuleKey.Builder appendDetailsToRuleKey(RuleKey.Builder builder) {
    return args.appendDetailsToRuleKey(builder);
  }

  @Override
  public ImmutableList<Step> getBuildSteps(
      BuildContext context,
      BuildableContext buildableContext) {
    buildableContext.recordArtifact(args.getOutput());
    return ImmutableList.of(
      new MkdirStep(args.getOutput().getParent()),
      new OCamlDebugLauncherStep(args)
    );
  }

  @Override
  public Path getPathToOutputFile() {
    return args.getOutput();
  }
}
