#!/usr/bin/env python3

"""Utility to generate DEPEND data for ebuilds
"""

import distutils.core
import sys
import re

import os
import tomli

__author__ = "Anton Bolshakov"
__license__ = "GPL-3"
__email__ = "blshkv@pentoo.ch"

#FIXME: missing deps if platform_system is specified, see:
#dev-python/libsast
#requires: dev-python/tomli

def portage_mapping(search):
    mapping =  {
        "dev-python/androguard": "dev-util/androguard",
        "dev-python/async_timeout": "dev-python/async-timeout",
        "dev-python/Brotli": "app-arch/brotli[python]",
        "dev-python/bs4": "dev-python/beautifulsoup4",
        "dev-python/capstone": "dev-libs/capstone[python]",
        "dev-python/colored_traceback": "dev-python/colored-traceback",
        "dev-python/Django": "dev-python/django",
        "dev-python/geographiclib": "sci-geosciences/GeographicLib[python]",
        "dev-python/editorconfig": "dev-python/editorconfig-core-py",
        "dev-python/flask-BabelEx": "dev-python/flask-babelex",
        "dev-python/flask_caching": "dev-python/flask-caching",
        "dev-python/Flask": "dev-python/flask",
        "dev-python/flask-Login": "dev-python/flask-login",
        "dev-python/flask-Mail": "dev-python/flask-mail",
        "dev-python/flask-Principal": "dev-python/flask-principal",
        "dev-python/flask-SocketIO": "dev-python/flask-socketio",
        "dev-python/flask-WTF": "dev-python/flask-wtf",
        "dev-python/frida": "dev-python/frida-python",
        "dev-python/importlib-metadata": "dev-python/importlib-metadata",
        "dev-python/iptools": "dev-python/python-iptools",
        "dev-python/IPy": "dev-python/ipy",
        "dev-python/jinja2": "dev-python/jinja",
        "dev-python/lief": "dev-util/lief",
        "dev-python/magic_filter": "dev-python/magic-filter",
        "dev-python/Markdown": "dev-python/markdown",
        "dev-python/openstep-parser": "dev-python/openstep_parser",
        "dev-python/Pillow": "dev-python/pillow",
        "dev-python/protobuf": "dev-python/protobuf-python",
        "dev-python/pjsip": "net-libs/pjproject",
        "dev-python/protego": "dev-python/Protego",
        "dev-python/psycopg2-binary": "dev-python/psycopg",
        "dev-python/psycopg2": "dev-python/psycopg",
        "dev-python/pycrypto": "dev-python/pycryptodome",
        "dev-python/pycryptodomedomex": "dev-python/pycryptodome",
        "dev-python/Pygments": "dev-python/pygments",
        "dev-python/PyGObject": "dev-python/pygobject",
        "dev-python/PyJWT": "dev-python/pyjwt",
        "dev-python/PyMySQL": "dev-python/pymysql",
        "dev-python/pyOpenSSL": "dev-python/pyopenssl",
        "dev-python/pypykatz": "app-exploits/pypykatz",
        "dev-python/pysocks": "dev-python/PySocks",
        "dev-python/pyVNC": "dev-python/pyvnc",
        "dev-python/PyYAML": "dev-python/pyyaml",
        "dev-python/redis": "dev-python/redis-py",
        "dev-python/ropgadget": "app-exploits/ropgadget",
        "dev-python/ruamel.yaml": "dev-python/ruamel-yaml",
        "dev-python/scapy": "net-analyzer/scapy",
        "dev-python/SQLAlchemy": "dev-python/sqlalchemy",
        "dev-python/sqlalchemy-Utc": "dev-python/sqlalchemy_utc",
        "dev-python/tls-parser": "dev-python/tls_parser",
        "dev-python/tornado": "www-servers/tornado",
        "dev-python/typing_extensions": "dev-python/typing-extensions",
        "dev-python/Twisted": "dev-python/twisted",
        "dev-python/unicorn": "dev-util/unicorn[python]",
        "dev-python/wordcloud": "media-gfx/word_cloud",
        "dev-python/zope.interface": "dev-python/zope-interface"
    }

    for key in mapping:
        search = search.replace(key, mapping[key])
    return search

def pyproject_toml():
    try:
        with open('./pyproject.toml', 'rb') as f:
            dependencies = tomli.load(f)['tool']['poetry']['dependencies']
    except FileNotFoundError:
        return 1
    #Debug
    #print(dependencies )  # List of static requirements
    for key, value in dependencies.items():
        if key == "python":
            continue
        #if value is {'git': 'https://github.com/BC-SECURITY/pyVNC.git'}
        if type(value) is dict:
            value="9999"
        if value == "*":
            print("\t"+portage_mapping("dev-python/" +key))
        else:
            print("\t>="+portage_mapping("dev-python/" + key + '-' + value.replace('^','')))

def distutils_setup():
    try:
        setup = distutils.core.run_setup("./setup.py")
    except FileNotFoundError:
        print("setup.py not found")
        return 1

    if not hasattr(setup, 'install_requires') or len(setup.install_requires)==0:
        print("RDEPEND=\"\"")
        sys.exit(1)
    #Debug:
    #print(setup.install_requires)

    print("RDEPEND=\"")

    for i in setup.install_requires:
        #match: my-na.me<5.0.0,>=4.0.0
        #and match: my-na.me
        pattern = '([-.\w]+)(>=|>|==|=<|<)?([\d.]+)?(,)?(>=|>|==|=<|<)?([\d.]+)?'
        match = re.search(pattern, i)
#        if match:
#          print("Match:", match.group(1), match.group(2), match.group(3), match.group(4), match.group(5), match.group(6))
#          print("Match0:", match.group(0) )
#        else:
#          print("pattern not found")
        if match.group(2) == ">=" or match.group(2) == "==":
          print("\t>="+portage_mapping("dev-python/"+match.group(1))+"-"+ match.group(3)+"[${PYTHON_USEDEP}]")
        elif match.group(5) == ">=" or match.group(5) == "==":
          print("\t>="+portage_mapping("dev-python/"+match.group(1))+"-"+ match.group(6)+"[${PYTHON_USEDEP}]")
        elif match.group(1):
          print("\t"+portage_mapping("dev-python/"+match.group(1)+"[${PYTHON_USEDEP}]"))
        else:
          print("Error: fail to detect dependency name")
          sys.exit(1)

    print("\"")

def main():
    if pyproject_toml():
        distutils_setup()

if __name__ == '__main__':
    main()
