// Copyright 2012 Google Inc. 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.gitiles;

import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.io.Files;
import java.util.StringTokenizer;
import javax.annotation.Nullable;

/** Static utilities for dealing with pathnames. */
class PathUtil {
  private static final CharMatcher MATCHER = CharMatcher.is('/');
  static final Splitter SPLITTER = Splitter.on(MATCHER);

  static @Nullable String simplifyPathUpToRoot(String path, String root) {
    if (path.startsWith("/")) {
      return null;
    }

    root = Strings.nullToEmpty(root);
    // simplifyPath() normalizes "a/../../" to "a", so manually check whether
    // the path leads above the root.
    int depth = new StringTokenizer(root, "/").countTokens();
    for (String part : SPLITTER.split(path)) {
      if (part.equals("..")) {
        depth--;
        if (depth < 0) {
          return null;
        }
      } else if (!part.isEmpty() && !part.equals(".")) {
        depth++;
      }
    }

    String result = Files.simplifyPath(!root.isEmpty() ? root + "/" + path : path);
    return !result.equals(".") ? result : "";
  }

  static String basename(String path) {
    path = MATCHER.trimTrailingFrom(path);
    int slash = path.lastIndexOf('/');
    if (slash < 0) {
      return path;
    }
    return path.substring(slash + 1);
  }

  private PathUtil() {}
}
