/*
 * Copyright 2017 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.idea.blaze.aspect;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo.ArtifactLocation;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;

/** Parses an {@link ArtifactLocation} from a comma-separate list of string-encoded fields. */
@VisibleForTesting
public final class ArtifactLocationParser {
  private ArtifactLocationParser() {}

  private static final Splitter SPLITTER = Splitter.on(',');

  @VisibleForTesting
  static final String INVALID_FORMAT =
      "Expected format rootExecutionPathFragment,relPath,isExternal";

  private static Path getPath(String pathString) {
    return FileSystems.getDefault().getPath(pathString);
  }

  /** Parse a colon-separated list of string-encoded {@link ArtifactLocation}s. */
  static List<ArtifactLocation> parseList(String input) {
    ImmutableList.Builder<ArtifactLocation> builder = ImmutableList.builder();
    for (String piece : input.split(":")) {
      if (!piece.isEmpty()) {
        builder.add(parse(piece));
      }
    }
    return builder.build();
  }

  /** Parse an {@link ArtifactLocation} from a comma-separate list of string-encoded fields. */
  static ArtifactLocation parse(String input) {
    Iterator<String> values = SPLITTER.split(input).iterator();
    try {
      Path rootExecutionPathFragment = getPath(values.next());
      Path relPath = getPath(values.next());
      boolean isExternal = values.next().equals("1");
      if (values.hasNext()) {
        throw new IllegalArgumentException(INVALID_FORMAT);
      }

      boolean isSource = rootExecutionPathFragment.toString().isEmpty();
      return ArtifactLocation.newBuilder()
          .setRootExecutionPathFragment(rootExecutionPathFragment.toString())
          .setRelativePath(relPath.toString())
          .setIsSource(isSource)
          .setIsExternal(isExternal)
          .build();

    } catch (NoSuchElementException e) {
      throw new IllegalArgumentException(INVALID_FORMAT);
    }
  }
}
