/*
 * 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.step.fs;

import com.facebook.buck.step.Step;
import com.facebook.buck.step.ExecutionContext;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;

import java.io.File;
import java.io.IOException;

public class RmStep implements Step {

  private final String patternToDelete;
  private final boolean shouldForceDeletion;
  private final boolean shouldRecurse;

  public RmStep(String patternToDelete, boolean shouldForceDeletion) {
    this(patternToDelete, shouldForceDeletion, false /* shouldRecurse */);
  }

  public RmStep(String patternToDelete,
                boolean shouldForceDeletion,
                boolean shouldRecurse) {
    this.patternToDelete = Preconditions.checkNotNull(patternToDelete);
    this.shouldForceDeletion = shouldForceDeletion;
    this.shouldRecurse = shouldRecurse;
  }

  public ImmutableList<String> getShellCommand(ExecutionContext context) {
    ImmutableList.Builder<String> args = ImmutableList.builder();
    args.add("rm");

    if (shouldRecurse) {
      args.add("-r");
    }

    if (shouldForceDeletion) {
      args.add("-f");
    }

    Function<String, String> pathRelativizer = context.getProjectFilesystem().getPathRelativizer();
    args.add(pathRelativizer.apply(patternToDelete));

    return args.build();
  }

  @Override
  public String getShortName() {
    return "rm";
  }

  @Override
  public int execute(ExecutionContext context) {
    Function<String, String> pathRelativizer = context.getProjectFilesystem().getPathRelativizer();
    if (shouldRecurse) {
      // Delete a folder recursively
      try {
        context.getProjectFilesystem().rmdir(patternToDelete);
      } catch (IOException e) {
        if (shouldForceDeletion) {
          return 0;
        }
        e.printStackTrace(context.getStdErr());
        return 1;
      }
    } else {
      // Delete a single file
      File file = new File(pathRelativizer.apply(patternToDelete));
      if (!file.delete() && !shouldForceDeletion) {
        return 1;
      }
    }
    return 0;
  }

  @Override
  public String getDescription(ExecutionContext context) {
    return Joiner.on(" ").join(getShellCommand(context));
  }
}
