import os
import re
import warnings

from clearml_agent.definitions import PIP_EXTRA_INDICES

from .requirement import Requirement


def parse(reqstr, cwd=None):
    """
    Parse a requirements file into a list of Requirements

    See: pip/req.py:parse_requirements()

    :param reqstr: a string or file like object containing requirements
    :param cwd: Optional current working dir for -r file.txt loading
    :returns: a *generator* of Requirement objects
    """
    filename = getattr(reqstr, 'name', None)
    try:
        # Python 2.x compatibility
        if not isinstance(reqstr, basestring):  # noqa
            reqstr = reqstr.read()
    except NameError:
        # Python 3.x only
        if not isinstance(reqstr, str):
            reqstr = reqstr.read()

    for line in reqstr.splitlines():
        line = line.strip()
        if line == '':
            continue
        elif not line or line.startswith('#'):
            # comments are lines that start with # only
            continue
        elif line.startswith('-r ') or line.startswith('--requirement '):
            _, new_filename = line.split()
            new_file_path = os.path.join(
                os.path.dirname(filename or '.') if filename or not cwd else cwd, new_filename)
            if not os.path.exists(new_file_path):
                continue
            with open(new_file_path) as f:
                for requirement in parse(f):
                    yield requirement
        elif line.startswith('-f') or line.startswith('--find-links') or \
                line.startswith('-i') or line.startswith('--index-url') or \
                line.startswith('--no-index'):
            warnings.warn('Private repos not supported. Skipping.')
        elif line.startswith('--extra-index-url'):
            extra_index = line[len('--extra-index-url'):].strip()
            extra_index = re.sub(r"\s+#.*$", "", extra_index)  # strip comments
            if extra_index and extra_index not in PIP_EXTRA_INDICES:
                PIP_EXTRA_INDICES.append(extra_index)
                print(f"appended {extra_index} to list of extra pip indices")
            continue
        elif line.startswith('-Z') or line.startswith('--always-unzip'):
            warnings.warn('Unused option --always-unzip. Skipping.')
            continue
        else:
            yield Requirement.parse(line)