#!/usr/bin/env python3
# Copyright 2007 Charlie Shepherd

import os
import sys
from operator import attrgetter

try:
    from pkgcore.restrictions.boolean import OrRestriction
    from pkgcore.util import commandline
except ImportError:
    print('Cannot import pkgcore!', file=sys.stderr)
    print('Verify it is properly installed and/or PYTHONPATH is set correctly.', file=sys.stderr)
    if '--debug' not in sys.argv:
        print('Add --debug to the commandline for a traceback.', file=sys.stderr)
    else:
        raise
    sys.exit(1)

argparser = commandline.ArgumentParser(color=False, version=False)
argparser.add_argument(
    'target', nargs='+', help='target package atoms')
argparser.add_argument(
    '--repo', action=commandline.StoreRepoObject,
    help='repo to use (default from domain if omitted).')
argparser.add_argument(
    '--print_type', '-t', default="cpvstr",
    choices=("slotted_atom", "versioned_atom", "cpvstr"),
    help='''type of atom to output:
                'versioned_atom' : a valid versioned atom,
                'slotted_atom'   : a valid slotted atom,
                'cpvstr'         : the cpv of the package''')


@argparser.bind_final_check
def check_args(parser, namespace):
    domain = namespace.domain
    namespace.vdb = domain.all_installed_repos
    if not namespace.repo:
        # fallback to default repo
        namespace.repo = namespace.config.get_default('repo')

    namespace.restrict = OrRestriction(
        *commandline.convert_to_restrict(namespace.target))
    namespace.outputter = attrgetter(namespace.print_type)


@argparser.bind_main_func
def main(options, out, err):
    repo = options.repo
    for built in options.vdb.itermatch(options.restrict):
        current = repo.match(built.unversioned_atom)
        if current:
            current = current[0]
            oldflags = built.iuse & built.use
            newflags = current.iuse & built.use
            if (newflags != oldflags) or (current.iuse ^ built.iuse):
                changed_flags = (oldflags ^ newflags) | (current.iuse ^ built.iuse)
                if options.verbosity > 0:
                    out.write(
                        "package %s, %d flags have changed:\n\t%s" %
                        (current.unversioned_atom, len(changed_flags), ' '.join(changed_flags)))
                else:
                    out.write(options.outputter(current))
            else:
                if options.verbosity > 0:
                    out.write("%s is the same as it was before" % current.cpvstr)


if __name__ == '__main__':
    tool = commandline.Tool(argparser)
    sys.exit(tool())
