# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Package Info (CPV) parsing."""

import collections
import functools
from pathlib import Path
import re
import string
from typing import Union

from chromite.utils import pms


# Define data structures for holding PV and CPV objects.
_PV_FIELDS = ["pv", "package", "version", "version_no_rev", "rev"]
PV = collections.namedtuple("PV", _PV_FIELDS)
# See ebuild(5) man page for the field specs these fields are based on.
# Notably, cpv does not include the revision, cpf does.
_CPV_FIELDS = ["category", "cp", "cpv", "cpf"] + _PV_FIELDS
CPV = collections.namedtuple("CPV", _CPV_FIELDS)

# Package matching regexp, as dictated by package manager specification:
# https://www.gentoo.org/proj/en/qa/pms.xml
_pkg = r"(?P<package>[\w+][\w+-]*)"
_ver = (
    r"(?P<version>"
    r"(?P<version_no_rev>(\d+)((\.\d+)*)([a-z]?)"
    r"((_(pre|p|beta|alpha|rc)\d*)*))"
    r"(-(?P<rev>r(\d+)))?)"
)
_pvr_re = re.compile(r"^(?P<pv>%s-%s)$" % (_pkg, _ver), re.VERBOSE)


class Error(Exception):
    """Base error class for the module."""


class InvalidComparisonTypeError(Error, TypeError):
    """Known class compared to an unknown type that cannot be resolved."""


class ParseTypeError(Error, TypeError):
    """Attempted parse of a type that could not be handled."""


def _SplitPV(pv, strict=True):
    """Takes a PV value and splits it into individual components.

    Deprecated, use parse() instead.

    Args:
        pv: Package name and version.
        strict: If True, returns None if version or package name is missing.
            Otherwise, only package name is mandatory.

    Returns:
        A collection with named members:
            pv, package, version, version_no_rev, rev
    """
    m = _pvr_re.match(pv)

    if m is None and strict:
        return None

    if m is None:
        return PV(
            **{
                "pv": None,
                "package": pv,
                "version": None,
                "version_no_rev": None,
                "rev": None,
            }
        )

    return PV(**m.groupdict())


def SplitCPV(cpv, strict=True):
    """Splits a CPV value into components.

    Deprecated, use parse() instead.

    Args:
        cpv: Category, package name, and version of a package.
        strict: If True, returns None if any of the components is missing.
            Otherwise, only package name is mandatory.

    Returns:
        A collection with named members:
            category, pv, package, version, version_no_rev, rev
    """
    chunks = cpv.split("/")
    if len(chunks) > 2:
        raise ValueError("Unexpected package format %s" % cpv)
    if len(chunks) == 1:
        category = None
    else:
        category = chunks[0]

    m = _SplitPV(chunks[-1], strict=strict)
    if strict and (category is None or m is None):
        return None

    # Gather parts and build each field. See ebuild(5) man page for spec.
    cp_fields = (category, m.package)
    cp = "%s/%s" % cp_fields if all(cp_fields) else None

    cpv_fields = (cp, m.version_no_rev)
    real_cpv = "%s-%s" % cpv_fields if all(cpv_fields) else None

    cpf_fields = (real_cpv, m.rev)
    cpf = "%s-%s" % cpf_fields if all(cpf_fields) else real_cpv

    return CPV(category=category, cp=cp, cpv=real_cpv, cpf=cpf, **m._asdict())


def parse(cpv: Union[str, Path, CPV, "PackageInfo"]):
    """Parse a package to a PackageInfo object.

    Args:
        cpv: Any package type. This function can parse strings, translate CPVs
            to a PackageInfo instance, and will simply return the argument if
            given a PackageInfo instance.  If given a Path, this will treat the
            path as the path to an ebuild.

    Returns:
        PackageInfo
    """
    if isinstance(cpv, Path):
        if not cpv.suffix == ".ebuild":
            raise ParseTypeError(f"{cpv} must be a path to an ebuild")
        cpv = f"{cpv.parent.parent.name}/{cpv.stem}"
    if isinstance(cpv, PackageInfo):
        return cpv
    elif isinstance(cpv, CPV):
        parsed = cpv
    elif isinstance(cpv, str):
        parsed = SplitCPV(cpv, strict=False)
    else:
        raise ParseTypeError(f"Unable to parse type: {type(cpv)}")

    # Temporary measure. SplitCPV parses X-r1 with the revision as r1.
    # Once the SplitCPV function has been fully deprecated we can switch
    # the regex to exclude the r from what it parses as the revision instead.
    # TODO: Change the regex to parse the revision without the r.
    revision = parsed.rev.replace("r", "") if parsed.rev else None
    return PackageInfo(
        category=parsed.category,
        package=parsed.package,
        version=parsed.version_no_rev,
        revision=revision,
    )


class PackageInfo(object):
    """Read-only class to hold and format commonly used package information."""

    def __init__(
        self, category=None, package=None, version=None, revision=None
    ):
        # Private attributes to enforce read-only. Particularly to allow use of
        # lru_cache for formatting.
        self._category = category
        self._package = package
        self._version = str(version) if version is not None else None
        self._revision = int(revision) if revision else 0

    def __eq__(self, other):
        if not isinstance(other, PackageInfo):
            try:
                return self == parse(other)
            except ParseTypeError:
                return False

        # Simple comparisons for category, package, and revision. Do manual
        # revision comparison to avoid recursion with the LRU Cache when
        # comparing the `.vr`s.
        if (
            self.category != other.category
            or self.package != other.package
            or self.revision != other.revision
        ):
            # Early return to skip version logic when possible.
            return False

        if self.version and other.version:
            return pms.version_eq(self.version, other.version)
        else:
            return self.version == other.version

    def __ge__(self, other):
        return self == other or self > other

    def __gt__(self, other):
        if not isinstance(other, PackageInfo):
            raise InvalidComparisonTypeError(
                f"'>' not supported between '{type(self)}' and '{type(other)}'."
            )

        # Compare as much of the "category/package" as we have.
        if self.atom and other.atom and self.atom != other.atom:
            return self.atom > other.atom
        elif self.category != other.category:
            return self.category > other.category
        elif self.package != other.package:
            return self.package > other.package

        if self.vr and other.vr:
            # Both have versions, do full comparison.
            return pms.version_gt(self.vr, other.vr)
        else:
            # Simple compare since only one or neither has a version.
            return self.vr > other.vr

    def __le__(self, other):
        return self == other or self < other

    def __lt__(self, other):
        if isinstance(other, PackageInfo):
            # x < y == y > x, so just do that when we can.
            return other > self
        else:
            raise InvalidComparisonTypeError(
                f"'<' not supported between '{type(self)}' and '{type(other)}'."
            )

    def __hash__(self):
        return hash(
            (self._category, self._package, self._version, self._revision)
        )

    def __repr__(self):
        return f"PackageInfo<{str(self)}>"

    def __str__(self):
        return self.cpvr or self.atom

    @functools.lru_cache()
    def __format__(self, format_spec):
        """Formatter function.

        The format |spec| is a format string containing any combination of:
        {c}, {p}, {v}, or {r} for the package's category, package name, version,
        or revision, respectively, or any of the class' {attribute}s.
        e.g. {c}/{p} or {atom} for a package's atom (i.e.
        category/package_name).
        """
        fmtter = string.Formatter()
        base_dict = {
            "c": self.category,
            "p": self.package,
            "v": self.version,
            # Force 'r' to be None when we have 0 to avoid -r0 suffixes.
            "r": self.revision or None,
        }
        fields = (x for _, x, _, _ in fmtter.parse(format_spec) if x)
        # Setting base_dict.get(x) as the default value for getattr allows it to
        # fall back to valid, falsey values in the base_dict rather than
        # overwriting them with None, i.e. 0 for version or revision.
        fmt_dict = {x: getattr(self, x, base_dict.get(x)) for x in fields}

        # We can almost do `if all(fmt_dict.values()):` to just check for falsey
        # values here, but 0 is a valid version value.
        if any(v in ("", None) for v in fmt_dict.values()):
            return ""

        return format_spec.format(**fmt_dict)

    @property
    def category(self):
        return self._category

    @property
    def package(self):
        return self._package

    @property
    def version(self):
        return self._version

    @property
    def revision(self):
        return self._revision

    @property
    def cpv(self):
        return format(self, "{c}/{p}-{v}")

    @property
    def cpvr(self):
        return format(self, "{cpv}-r{r}") or self.cpv

    @property
    def cpf(self):
        """CPF is the portage name for cpvr, provided to simplify transition."""
        return self.cpvr

    @property
    def atom(self):
        return format(self, "{c}/{p}")

    @property
    def cp(self):
        return self.atom

    @property
    def pv(self):
        return format(self, "{p}-{v}")

    @property
    def pvr(self):
        """This is PF in Gentoo variable definitions.

        From Gentoo docs: PF - Full package name. e.g. 'vim-6.3-r1' or
            'vim-6.3'.
        """
        return format(self, "{pv}-r{r}") or self.pv

    @property
    def vr(self):
        """This is PVR in Gentoo variable definitions.

        From Gentoo docs: PVR - Package version and revision (if any). e.g.
            '6.3' or '6.3-r1'.
        """
        return format(self, "{v}-r{r}") or self.version

    @property
    def ebuild(self):
        return format(self, "{pvr}.ebuild")

    @property
    def relative_path(self):
        """Path of the ebuild relative to its overlay."""
        return format(self, "{c}/{p}/{ebuild}")

    def revision_bump(self):
        """Get a PackageInfo instance with an incremented revision."""
        return PackageInfo(
            self.category, self.package, self.version, self.revision + 1
        )

    def with_version(self, version):
        """Get a PackageInfo instance with the new, specified version."""
        return PackageInfo(self.category, self.package, version)

    def to_cpv(self):
        """Get a CPV instance of this PackageInfo.

        This method is provided only to allow compatibility with functions that
        have not yet been converted to use PackageInfo objects. This function
        will be removed when the CPV namedtuple is removed.
        """
        return SplitCPV(self.cpvr)
