# Copyright 2018 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.

"""Bazel Path APIs for the Android rules."""

load("//rules:visibility.bzl", "PROJECT_VISIBILITY")

visibility(PROJECT_VISIBILITY)

# TODO(djwhang): Get the path separator in a platform agnostic manner.
_PATH_SEP = "/"
_TEST_SRCDIR = "${TEST_SRCDIR}"

def _is_absolute(path):
    # TODO(djwhang): This is not cross platform safe. Windows absolute paths
    # do not start with "//", rather "C:\".
    return path.startswith(_PATH_SEP)

def _split(path):
    return path.split(_PATH_SEP)

def _join(path_segments):
    return _PATH_SEP.join(path_segments)

def _normalize_path(path, posix = False):
    return _PATH_SEP.join(
        _normalize_path_fragments(
            path.split(_PATH_SEP),
            posix = posix,
        ),
    )

def _normalize_path_fragments(path_fragments, posix = False):
    normalized_path_fragments = []
    for idx, fragment in enumerate(path_fragments):
        if not fragment and idx > 0:
            continue
        if fragment == ".":
            continue
        if fragment == ".." and not posix:
            if normalized_path_fragments:
                last = normalized_path_fragments.pop()
                if last == ".." or last == "":
                    normalized_path_fragments.append(last)
                else:
                    continue
        normalized_path_fragments.append(fragment)
    if len(normalized_path_fragments) == 1 and not normalized_path_fragments[0]:
        normalized_path_fragments.append("")
    return normalized_path_fragments

def _relative_path(path1, path2):
    if not path1 or _is_absolute(path2):
        return path2

    path1_fragments = _normalize_path_fragments(_split(path1))
    path2_fragments = _normalize_path_fragments(_split(path2))
    path1_idx = len(path1_fragments)  # index move backwards
    path2_idx = -1
    for idx, fragment in enumerate(path2_fragments):
        if fragment == "..":
            path1_idx -= 1
        else:
            path2_idx = idx
            break

    relative_path_fragments = []
    if path1_idx >= 0:
        relative_path_fragments.extend(path1_fragments[:path1_idx])
    if path2_idx >= 0:
        relative_path_fragments.extend(path2_fragments[path2_idx:])
    return _join(_normalize_path_fragments(relative_path_fragments))

def _make_test_srcdir_path(ctx, *path_fragments):
    """Creates a filepath relative to TEST_SRCDIR.

    Args:
        ctx: Starlark context.
        *path_fragments: Directories/file to join into a single path.
    Returns:
        A filepath that's spearated by the host's filepath separator.
    """
    fragments = [_TEST_SRCDIR, ctx.workspace_name]
    for path_fragment in path_fragments:
        fragments += _normalize_path_fragments(_split(path_fragment))
    return _join(fragments)

path = struct(
    is_absolute = _is_absolute,
    join = _join,
    normalize = _normalize_path,
    relative = _relative_path,
    split = _split,
    make_test_srcdir_path = _make_test_srcdir_path,
)
