#!/usr/bin/env python3

# Allow execution from anywhere
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import argparse
import re
import subprocess

from devscripts.tomlparse import parse_toml
from devscripts.utils import read_file


def parse_args():
    parser = argparse.ArgumentParser(description='Install dependencies for yt-dlp')
    parser.add_argument(
        'input', nargs='?', metavar='TOMLFILE', default='pyproject.toml', help='Input file (default: %(default)s)')
    parser.add_argument(
        '-e', '--exclude', metavar='REQUIREMENT', action='append', help='Exclude a required dependency')
    parser.add_argument(
        '-i', '--include', metavar='GROUP', action='append', help='Include an optional dependency group')
    parser.add_argument(
        '-o', '--only-optional', action='store_true', help='Only install optional dependencies')
    parser.add_argument(
        '-p', '--print', action='store_true', help='Only print a requirements.txt to stdout')
    parser.add_argument(
        '-u', '--user', action='store_true', help='Install with pip as --user')
    return parser.parse_args()


def main():
    args = parse_args()
    toml_data = parse_toml(read_file(args.input))
    deps = toml_data['project']['dependencies']
    targets = deps.copy() if not args.only_optional else []

    for exclude in args.exclude or []:
        for dep in deps:
            simplified_dep = re.match(r'[\w-]+', dep)[0]
            if dep in targets and (exclude.lower() == simplified_dep.lower() or exclude == dep):
                targets.remove(dep)

    optional_deps = toml_data['project']['optional-dependencies']
    for include in args.include or []:
        group = optional_deps.get(include)
        if group:
            targets.extend(group)

    if args.print:
        for target in targets:
            print(target)
        return

    pip_args = [sys.executable, '-m', 'pip', 'install', '-U']
    if args.user:
        pip_args.append('--user')
    pip_args.extend(targets)

    return subprocess.call(pip_args)


if __name__ == '__main__':
    sys.exit(main())