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

"""Parse and compare Android revision strings."""

# TODO(katre): support preview versions.
AndroidRevisionInfo = provider(
    "Information about Android revision specifications.",
    fields = {
        "major": "The major version number",
        "minor": "The minor version number, or 0 if unset.",
        "micro": "The micro version number, or 0 if unset.",
        "version": "The version string.",
        "dir": "The directory where the revision would exist in an Android SDK.",
    },
)

def is_android_revision(input):
    return all([c.isdigit() for c in input.strip().split(".")])

def parse_android_revision(input):
    """Parse and Android revision string and return an AndroidRevisionInfo.

    Args:
      input: The raw revision string to parse.

    Returns:
      An AndroidRevisionInfo provider representing the input.
    """
    if not is_android_revision(input):
        fail("Invalid Android revision %s" % input)
    parts = input.strip().split(".")

    major = int(parts[0]) if len(parts) >= 1 else 0
    minor = int(parts[1]) if len(parts) >= 2 else 0
    micro = int(parts[2]) if len(parts) >= 3 else 0

    return AndroidRevisionInfo(
        version = input,
        dir = input,
        major = major,
        minor = minor,
        micro = micro,
    )

def _compare_android_revision_field(first, second, name):
    first_val = getattr(first, name)
    second_val = getattr(second, name)
    if first_val > second_val:
        return first
    elif first_val < second_val:
        return second
    return None

def compare_android_revisions(first, second):
    """Compares two AndroidRevisionInfo providers and returns the one with the highest version.

    Args:
      first: The first revision to compare.
      second: The first revision to compare.

    Returns:
      The revision with the higher version number, or the first if they are equal.
    """
    if first == None and second == None:
        return None
    if first != None and second == None:
        return first
    if first == None and second != None:
        return second
    highest = _compare_android_revision_field(first, second, "major")
    if highest != None:
        return highest
    highest = _compare_android_revision_field(first, second, "minor")
    if highest != None:
        return highest
    highest = _compare_android_revision_field(first, second, "micro")
    if highest != None:
        return highest
    return first
