/*
 * 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 com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetPattern;
import com.facebook.buck.model.ImmediateDirectoryBuildTargetPattern;
import com.facebook.buck.model.SingletonBuildTargetPattern;
import com.facebook.buck.model.SubdirectoryBuildTargetPattern;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.base.Preconditions;

public class BuildTargetPatternParser {

  public static final String VISIBILITY_PUBLIC = "PUBLIC";
  private static final String BUILD_RULE_PREFIX = "//";
  private static final String WILDCARD_BUILD_RULE_SUFFIX = "...";
  private static final String BUILD_RULE_SEPARATOR = ":";

  private BuildTargetParser buildTargetParser;

  public BuildTargetPatternParser(ProjectFilesystem projectFilesystem) {
    buildTargetParser = new BuildTargetParser(projectFilesystem);
  }

  /**
   * 1. //src/com/facebook/buck/cli:cli will be convert to a single build target
   * 2. //src/com/facebook/buck/cli: will match all in the same directory.
   * 3. //src/com/facebook/buck/cli/... will match all in or under that directory.
   * For case 2 and 3, parseContext is expected to be {@link ParseContext#forVisibilityArgument()}.
   */
  public BuildTargetPattern parse(
      String buildTargetPattern,
      ParseContext parseContext) throws NoSuchBuildTargetException {

    Preconditions.checkNotNull(buildTargetPattern);

    if (buildTargetPattern.equals(VISIBILITY_PUBLIC)) {
      if (parseContext.getType() != ParseContext.Type.VISIBILITY) {
        throw new BuildTargetParseException(
            String.format("%s not supported in the parse context", VISIBILITY_PUBLIC));
      } else {
        return BuildTargetPattern.MATCH_ALL;
      }
    }

    Preconditions.checkArgument(buildTargetPattern.startsWith(BUILD_RULE_PREFIX),
        "buildTargetPattern must start with //");
    Preconditions.checkNotNull(parseContext);

    if (buildTargetPattern.endsWith(WILDCARD_BUILD_RULE_SUFFIX)) {
      if (parseContext.getType() != ParseContext.Type.VISIBILITY) {
        throw new BuildTargetParseException(
            String.format("%s cannot end with ...", buildTargetPattern));
      } else {
        if (buildTargetPattern.contains(BUILD_RULE_SEPARATOR)) {
          throw new BuildTargetParseException(String.format(
              "%s cannot contain colon", buildTargetPattern));
        }
        String basePathWithSlash = buildTargetPattern.substring(
            BUILD_RULE_PREFIX.length(),
            buildTargetPattern.length() - WILDCARD_BUILD_RULE_SUFFIX.length());
        return new SubdirectoryBuildTargetPattern(basePathWithSlash);
      }
    } else {
      BuildTarget target = buildTargetParser.parse(buildTargetPattern, parseContext);
      if (target.getShortName().isEmpty()) {
        return new ImmediateDirectoryBuildTargetPattern(target.getBasePathWithSlash());
      } else {
        return new SingletonBuildTargetPattern(target.getFullyQualifiedName());
      }
    }
  }
}
