#!/usr/bin/env python3


"""
This file is part of scripts.

scripts is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3.

scripts is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with scripts.  If not, see <https://www.gnu.org/licenses/>.

Original author: Maciej Barć <xgqt@riseup.net>
Copyright (c) 2020-2021, src_prepare group
Licensed under the GNU GPL v3 License

Install Ebuild Dependencies

This script is strictly for working with ebuild files.
In normal situaltion when we already have a repository (/var/db/repos/repo),
to emerge dependencies we would just do "emerge --oneshot --onlydeps PKG".
"""


import argparse
import sys
from subprocess import call


parser = argparse.ArgumentParser(
    description="Install Ebuild Dependencies",
    epilog="Copyright (c) 2020-2021, src_prepare group (License: GPLv3)"
)
parser.add_argument(
    "ebuild",
    nargs="*",
    type=str
)
args = parser.parse_args()


def pkg_name(pkg_str):
    """
    Parse string and return a pkg name.
    """

    # TODO: don't strip but force

    # Strip required use
    proper = pkg_str.split("[")[0]

    # Strip conditional use
    for i in ["$", "DEPEND", "||", "!", "?", "(", ")"]:
        if i in proper:
            proper = ""

    return proper


def ebuild_deps(ebuild_file):
    """
    Returns dependencies from a ebuild file.
    """

    deps = []
    adddeps = False

    with open(ebuild_file) as ebuild:
        for line in ebuild.read().splitlines():

            # TODO: Find a better way to find the depend "block"
            if "DEPEND" in line:
                adddeps = True

            elif adddeps:
                # TODO: Find a better pkg match method
                if "/" in line:
                    deps.append(
                        pkg_name(line.strip())
                    )
                elif "\"" in line:
                    adddeps = False

    return deps


def main():
    """
    The main function.
    """
    print("Ebuilds:", args.ebuild)

    if args.ebuild == []:
        print("[ERROR]: No ebuilds given")
        sys.exit(1)

    all_deps = []

    for ebuild in args.ebuild:
        all_deps += ebuild_deps(ebuild)

    print("Dependencies:", all_deps)

    # TODO: Maybe use Portage API
    call(
        [
            "emerge",
            "--autounmask",
            "--noreplace",
            "--oneshot"
        ]
        +
        list(filter(None, all_deps))
    )


if __name__ == "__main__":
    main()