// 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.devtools.build.lib.analysis;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.vfs.Path;
import javax.annotation.Nullable;

/**
 * Represents the relevant directories for the server: the location of the embedded binaries and the
 * output directories.
 */
@Immutable
public final class ServerDirectories {
  public static final String EXECROOT = "execroot";

  /** Where Bazel gets unpacked. */
  private final Path installBase;
  /** The content hash of everything in installBase. */
  @Nullable private final HashCode installMD5;

  /** The root of the temp and output trees. */
  private final Path outputBase;

  /** Top-level user output directory; used, e.g., as default location for caches. */
  private final Path outputUserRoot;

  private final Path execRootBase;

  // TODO(bazel-team): Use a builder to simplify/unify these constructors. This makes it easier to
  // have sensible defaults, e.g. execRootBase = outputBase + "/execroot". Then reorder the fields
  // to be consistent throughout this class.

  public ServerDirectories(
      Path installBase,
      Path outputBase,
      Path outputUserRoot,
      Path execRootBase,
      @Nullable String installMD5) {
    this.installBase = installBase;
    this.installMD5 =
        Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5));
    this.outputBase = outputBase;
    this.outputUserRoot = outputUserRoot;
    this.execRootBase = execRootBase;
  }

  public ServerDirectories(Path installBase, Path outputBase, Path outputUserRoot) {
    this(
        // Some tests set installBase to null.
        // TODO(bazel-team): Be more consistent about whether nulls are permitted. (e.g. equals()
        // presently doesn't tolerate them for some fields). We should probably just disallow them.
        installBase, outputBase, outputUserRoot, outputBase.getRelative(EXECROOT), null);
  }

  private static HashCode checkMD5(HashCode hash) {
    Preconditions.checkArgument(
        hash.bits() == Hashing.md5().bits(), "Hash '%s' has %s bits", hash, hash.bits());
    return hash;
  }

  /** Returns the installation base directory. */
  public Path getInstallBase() {
    return installBase;
  }

  /**
   * Returns the MD5 content hash of the blaze binary (includes deploy JAR, embedded binaries, and
   * anything else that ends up in the install_base).
   */
  public HashCode getInstallMD5() {
    return installMD5;
  }

  /**
   * Returns the base of the output tree, which hosts all build and scratch output for a user and
   * workspace.
   */
  public Path getOutputBase() {
    return outputBase;
  }

  /**
   * Returns the root directory for user output. In particular default caches will be located here.
   */
  public Path getOutputUserRoot() {
    return outputUserRoot;
  }

  /**
   * Parent of all execution roots.
   *
   * <p>This is physically, always /outputbase/execroot, but might be virtualized.
   */
  public Path getExecRootBase() {
    return execRootBase;
  }

  /** Returns the installed embedded binaries directory, under the shared installBase location. */
  public Path getEmbeddedBinariesRoot() {
    return getEmbeddedBinariesRoot(installBase);
  }

  @VisibleForTesting
  public static Path getEmbeddedBinariesRoot(Path installBase) {
    return installBase;
  }
}
