// 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.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.vfs.Path;
import java.util.Objects;
import javax.annotation.Nullable;

/**
 * Represents the relevant directories for the server: the location of the embedded binaries
 * and the output directories.
 */
@AutoCodec
@Immutable
public final class ServerDirectories {
  /** Top-level user output directory; used, e.g., as default location for caches. */
  private final Path outputUserRoot;
  /** Where Blaze 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;

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

  @AutoCodec.Instantiator
  ServerDirectories(Path installBase, Path outputBase, Path outputUserRoot, HashCode installMD5) {
    this.outputUserRoot = outputUserRoot;
    this.installBase = installBase;
    this.outputBase = outputBase;
    this.installMD5 = installMD5;
  }

  public ServerDirectories(Path installBase, Path outputBase, Path outputUserRoot) {
    this(installBase, outputBase, outputUserRoot, (HashCode) 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 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;
  }

  /** 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.getChild("_embedded_binaries");
  }

  /**
   * 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;
  }

  @Override
  public int hashCode() {
    return Objects.hash(installBase, installMD5, outputBase, outputUserRoot);
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (!(obj instanceof ServerDirectories)) {
      return false;
    }
    ServerDirectories that = (ServerDirectories) obj;
    return this.installBase.equals(that.installBase)
        && Objects.equals(this.installMD5, that.installMD5)
        && this.outputBase.equals(that.outputBase)
        && this.outputUserRoot.equals(that.outputUserRoot);
  }
}
