# 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
