# Copyright 2014-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import collections

from portage.versions import _pkg_str


pkg_desc_index_node = collections.namedtuple(
    "pkg_desc_index_node", ["cp", "cpv_list", "desc"]
)


class pkg_node(str):
    """
    A minimal package node class. For performance reasons, inputs
    are not validated.
    """

    def __init__(self, cp, version, repo=None):
        self.__dict__["cp"] = cp
        self.__dict__["repo"] = repo
        self.__dict__["version"] = version
        self.__dict__["build_time"] = None

    def __new__(cls, cp, version, repo=None):
        return str.__new__(cls, cp + "-" + version)

    def __setattr__(self, name, value):
        raise AttributeError(
            "pkg_node instances are immutable", self.__class__, name, value
        )


def pkg_desc_index_line_format(cp, pkgs, desc):
    return f"{cp} {' '.join(_pkg_str(cpv).version for cpv in pkgs)}: {desc}\n"


def pkg_desc_index_line_read(line, repo=None):
    try:
        pkgs, desc = line.split(":", 1)
    except ValueError:
        return None
    desc = desc.strip()

    try:
        cp, pkgs = pkgs.split(" ", 1)
    except ValueError:
        return None

    cp_list = []
    for ver in pkgs.split():
        cp_list.append(pkg_node(cp, ver, repo))

    return pkg_desc_index_node(cp, tuple(cp_list), desc)
