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

import static com.facebook.buck.util.BuckConstant.BUILD_RULES_FILE_NAME;

import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.util.ExceptionWithHumanReadableMessage;

@SuppressWarnings("serial")
public class NoSuchBuildTargetException extends Exception
    implements ExceptionWithHumanReadableMessage {

  private NoSuchBuildTargetException(String message) {
    super(message);
  }

  /**
   * @param directoryPath missing directory
   * @param buildTargetName missing build target name
   * @param parseContext the context used when attempting to resolve the build target
   */
  static NoSuchBuildTargetException createForMissingDirectory(String directoryPath,
      String buildTargetName,
      ParseContext parseContext) {
    String message = String.format("No directory %s when resolving target %s",
        directoryPath,
        makeTargetDescription(buildTargetName, parseContext));
    return new NoSuchBuildTargetException(message);
  }

  /**
   * @param buildFilePath missing build file
   * @param buildTargetName missing build target name
   * @param parseContext the context used when attempting to resolve the build target
   */
  static NoSuchBuildTargetException createForMissingBuildFile(String buildFilePath,
      String buildTargetName,
      ParseContext parseContext) {
    String message = String.format("No %s file %s when resolving target %s",
        BUILD_RULES_FILE_NAME,
        buildFilePath,
        makeTargetDescription(buildTargetName, parseContext));
    return new NoSuchBuildTargetException(message);
  }

  /**
   * @param buildTarget the failing {@link com.facebook.buck.model.BuildTarget}
   */
  static NoSuchBuildTargetException createForMissingBuildRule(BuildTarget buildTarget,
      ParseContext parseContext) {
    String message = String.format("No rule found when resolving target %s",
        makeTargetDescription(buildTarget.getFullyQualifiedName(), parseContext));

    return new NoSuchBuildTargetException(message);
  }

  @Override
  public String getHumanReadableErrorMessage() {
    return getMessage();
  }

  /**
   * @return description of the target name and context being parsed when an error was encountered.
   *     Examples are ":azzetz in build file //first-party/orca/orcaapp/BUCK" and
   *     "//first-party/orca/orcaapp:mezzenger in context FULLY_QUALIFIED"
   */
  private static String makeTargetDescription(String buildTargetName, ParseContext parseContext) {
    String location = parseContext.getType().name();
    if (parseContext.getType() == ParseContext.Type.BUILD_FILE) {
      return String.format("%s in build file %s%s",
          buildTargetName,
          parseContext.getBaseNameWithSlash(),
          BUILD_RULES_FILE_NAME);
    } else {
      return String.format("%s in context %s", buildTargetName, location);
    }
  }
}
