#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Usage:
  pip-grep [-s] <reqfile> <package>...

Options:
  -h --help     Show this screen.
"""
import os
from docopt import docopt
import pip
from distutils.version import StrictVersion

pip_version = StrictVersion(pip.__version__)

if pip_version >= StrictVersion('19.3.0'):
    from pip._internal.req import parse_requirements
    from pip._internal.index import PackageFinder
    from pip._internal.models.search_scope import SearchScope
    from pip._internal.models.selection_prefs import SelectionPreferences
    from pip._internal.collector import LinkCollector
elif pip_version >= StrictVersion('19.2.0'):
    from pip._internal.req import parse_requirements
    from pip._internal.index import PackageFinder
    from pip._internal.models.search_scope import SearchScope
    from pip._internal.models.selection_prefs import SelectionPreferences
elif pip_version >= StrictVersion('18.1.0'):
    from pip._internal.req import parse_requirements
    from pip._internal.index import PackageFinder
else:
    from pip.req import parse_requirements
    from pip.index import PackageFinder

if pip_version >= StrictVersion('19.3.1'):
    from pip._internal.network.session import PipSession
    requests = PipSession()
else:
    from pip._vendor.requests import session
    requests = session()

class Requirements(object):
    def __init__(self, reqfile=None):
        super(Requirements, self).__init__()
        self.path = reqfile
        self.requirements = []

        if reqfile:
            self.load(reqfile)

    def __repr__(self):
        return '<Requirements \'{}\'>'.format(self.path)

    def load(self, reqfile):
        if not os.path.exists(reqfile):
            raise ValueError('The given requirements file does not exist.')

        if pip_version >= StrictVersion('19.3.1'):
            search_scope = SearchScope([], [])
            collector = LinkCollector(session=requests, search_scope=search_scope)
            selection_prefs = SelectionPreferences(allow_yanked=True)
            finder = PackageFinder.create(link_collector=collector, selection_prefs=selection_prefs)
        elif pip_version >= StrictVersion('19.2.0'):
            search_scope = SearchScope([], [])
            selection_prefs = SelectionPreferences(allow_yanked=True)
            finder = PackageFinder.create(session=requests, search_scope=search_scope, selection_prefs=selection_prefs)
        elif pip_version == StrictVersion('18.1.0'):
            finder = PackageFinder([], [], session=requests)
        else:
            finder = PackageFinder([], [], session=requests)

        for requirement in parse_requirements(reqfile, finder=finder, session=requests):
            if requirement.req:
                if not getattr(requirement.req, 'name', None):
                    # Prior to pip 8.1.2 the attribute `name` did not exist.
                    requirement.req.name = requirement.req.project_name
                self.requirements.append(requirement.req)


def grep(reqfile, packages, silent=False):
    try:
        r = Requirements(reqfile)
    except ValueError:
        if not silent:
            print('There was a problem loading the given requirement file.')
        exit(os.EX_NOINPUT)

    for req in r.requirements:
        if req.name in packages:
            if not silent:
                print('Package {} found!'.format(req.name))
            exit(0)

    if not silent:
        print('Not found.')

    exit(1)


def main():
    args = docopt(__doc__, version='pip-grep')

    kwargs = {'reqfile': args['<reqfile>'], 'packages': args['<package>'], 'silent': args['-s']}

    grep(**kwargs)


if __name__ == '__main__':
    main()
