/*
 * Copyright 2016 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.idea.blaze.base.run;

import com.google.idea.blaze.base.model.primitives.Label;
import com.google.idea.blaze.base.model.primitives.TargetExpression;
import com.google.idea.blaze.base.settings.Blaze;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import java.util.Arrays;

/**
 * Utility class for creating Blaze configuration names of the form "{build system name} {command
 * name} {target string}", where each component is optional.
 */
public class BlazeConfigurationNameBuilder {
  private String buildSystemName;
  private String commandName;
  private String targetString;

  public BlazeConfigurationNameBuilder() {}

  /**
   * Use the passed {@code configuration} to initialize the build system name, command name, and
   * target string. If the configuration's command name is null, this will default to "command". If
   * the configuration's target is null, target string will also be null.
   */
  public BlazeConfigurationNameBuilder(BlazeCommandRunConfiguration configuration) {
    setBuildSystemName(configuration.getProject());

    String commandName = configuration.getHandler().getCommandName();
    setCommandName((commandName == null) ? "command" : commandName);

    TargetExpression targetExpression = configuration.getTarget();
    if (targetExpression != null) {
      setTargetString(targetExpression);
    }
  }

  /**
   * Sets the build system name to the name of the build system used by {@code project}, e.g.
   * "Blaze" or "Bazel".
   */
  public BlazeConfigurationNameBuilder setBuildSystemName(Project project) {
    buildSystemName = Blaze.buildSystemName(project);
    return this;
  }

  /** Sets the command name to {@code commandName}. */
  public BlazeConfigurationNameBuilder setCommandName(String commandName) {
    this.commandName = commandName;
    return this;
  }

  /** Sets the target string to {@code targetString}. */
  public BlazeConfigurationNameBuilder setTargetString(String targetString) {
    this.targetString = targetString;
    return this;
  }

  /**
   * Sets the target string to a string of the form "{package}:{target}", where 'target' is {@code
   * label}'s target, and the 'package' is the containing package. For example, the {@link Label}
   * "//javatests/com/google/foo/bar/baz:FooTest" will set the target string to "baz:FooTest".
   */
  public BlazeConfigurationNameBuilder setTargetString(Label label) {
    this.targetString =
        String.format("%s:%s", getImmediatePackage(label), label.targetName().toString());
    return this;
  }

  /**
   * If {@code targetExpression} is a {@link Label}, this is equivalent to {@link
   * #setTargetString(Label)}. Otherwise, the target string is set to the string value of {@code
   * targetExpression}.
   */
  public BlazeConfigurationNameBuilder setTargetString(TargetExpression targetExpression) {
    if (targetExpression instanceof Label) {
      return setTargetString((Label) targetExpression);
    }
    return setTargetString(targetExpression.toString());
  }

  /**
   * Get the portion of a label between the colon and the preceding slash. Example:
   * "//javatests/com/google/foo/bar/baz:FooTest" -> "baz".
   */
  private static String getImmediatePackage(Label label) {
    String labelString = label.toString();
    int colonIndex = labelString.lastIndexOf(':');
    assert colonIndex >= 0;
    int slashIndex = labelString.lastIndexOf('/', colonIndex);
    assert slashIndex >= 0;
    return labelString.substring(slashIndex + 1, colonIndex);
  }

  /**
   * Builds a name of the form "{build system name} {command name} {target string}". Any null
   * components are omitted, and there is always one space inserted between each included component.
   */
  public String build() {
    // Use this instead of String.join to omit null terms.
    return StringUtil.join(Arrays.asList(buildSystemName, commandName, targetString), " ");
  }
}
