/*
 * Copyright 2013-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.rules;

import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;

import java.util.regex.Pattern;

/**
 * A typesafe representation of a SHA-1 hash. It is safer to pass this around than a {@link String}.
 */
public final class Sha1HashCode {

  /**
   * Takes a string and uses it to construct a {@link Sha1HashCode}.
   * <p>
   * Is likely particularly useful with {@link Optional#transform(Function)}.
   */
  public static final Function<String, Sha1HashCode> TO_SHA1 =
      new Function<String, Sha1HashCode>() {
        @Override
        public Sha1HashCode apply(String hash) {
          return new Sha1HashCode(hash);
        }
  };

  private static final Pattern SHA1_PATTERN = Pattern.compile("[a-f0-9]{40}");

  private final String hash;

  /**
   * @param hash Must be a 40-character string from the alphabet [a-f0-9].
   */
  public Sha1HashCode(String hash) {
    Preconditions.checkNotNull(hash);
    Preconditions.checkArgument(SHA1_PATTERN.matcher(hash).matches(),
        "Should be 40 lowercase hex chars: %s.",
        hash);
    this.hash = hash;
  }

  /**
   * @return the hash as a 40-character string from the alphabet [a-f0-9].
   */
  public String getHash() {
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof Sha1HashCode)) {
      return false;
    }

    Sha1HashCode that = (Sha1HashCode)obj;
    return Objects.equal(this.hash, that.hash);
  }

  @Override
  public int hashCode() {
    return Objects.hashCode(hash);
  }

  /** Same as {@link #getHash()}. */
  @Override
  public String toString() {
    return getHash();
  }
}
