#!/usr/bin/python3

import argparse
import re


DEPENDENCIES = {
    "compat": (
        "python3-pyqt5",
        "python3-pyqt6",
        [
            "python3-pyside6.qtgui",
            "python3-pyside6.qtopengl",
            "python3-pyside6.qtwidgets",
        ],
    ),
    "Qsci": ("python3-pyqt5.qsci", "python3-pyqt6.qsci", None),
    "Qt3DAnimation": (None, None, "python3-pyside6.qt3danimation"),
    "Qt3DCore": (None, None, "python3-pyside6.qt3dcore"),
    "Qt3DExtras": (None, None, "python3-pyside6.qt3dextras"),
    "Qt3DInput": (None, None, "python3-pyside6.qt3dinput"),
    "Qt3DLogic": (None, None, "python3-pyside6.qt3dlogic"),
    "Qt3DRender": (None, None, "python3-pyside6.qt3drender"),
    "QtAxContainer": (None, None, None),
    "QtBluetooth": (
        "python3-pyqt5.qtbluetooth",
        "python3-pyqt6.qtbluetooth",
        "python3-pyside6.qtbluetooth",
    ),
    "QtCharts": (
        "python3-pyqt5.qtchart",
        "python3-pyqt6.qtcharts",
        "python3-pyside6.qtcharts",
    ),
    "QtConcurrent": (None, None, "python3-pyside6.qtconcurrent"),
    "QtCore": (
        "python3-pyqt5",
        "python3-pyqt6",
        ["python3-pyside6.qtcore", "python3-pyside6.qtgui"],
    ),
    "QtDataVisualization": (None, None, "python3-pyside6.qtdatavisualization"),
    "QtDBus": ("python3-pyqt5", "python3-pyqt6", "python3-pyside6.qtdbus"),
    "QtDesigner": (
        "python3-pyqt5",
        "python3-pyqt6.qtdesigner",
        "python3-pyside6.qtdesigner",
    ),
    "QtGui": (
        "python3-pyqt5",
        "python3-pyqt6",
        [
            "python3-pyside6.qtgui",
            "python3-pyside6.qtopengl",
            "python3-pyside6.qtwidgets",
        ],
    ),
    "QtHelp": (
        "python3-pyqt5",
        "python3-pyqt6.qthelp",
        "python3-pyside6.qthelp",
    ),
    "QtLocation": ("python3-pyqt5.qtpositioning", None, None),
    "QtMacExtras": (None, None, None),
    "QtMultimedia": (
        "python3-pyqt5.qtmultimedia",
        "python3-pyqt6.qtmultimedia",
        "python3-pyside6.qtmultimedia",
    ),
    "QtMultimediaWidgets": (
        "python3-pyqt5.qtmultimedia",
        "python3-pyqt6.qtmultimedia",
        "python3-pyside6.qtmultimediawidgets",
    ),
    "QtNetworkAuth": (None, None, "python3-pyside6.qtnetworkauth"),
    "QtNetwork": (
        "python3-pyqt5",
        "python3-pyqt6",
        "python3-pyside6.qtnetwork",
    ),
    "QtNfc": (
        "python3-pyqt5.qtnfc",
        "python3-pyqt6.qtnfc",
        "python3-pyside6.qtnfc",
    ),
    "QtOpenGL": (
        ["python3-pyqt5", "python3-pyqt5.qtopengl"],
        "python3-pyqt6",
        ["python3-pyside6.qtopengl", "python3-pyside6.qtgui"],
    ),
    "QtOpenGLWidgets": (
        None,
        "python3-pyqt6",
        "python3-pyside6.qtopenglwidgets",
    ),
    "QtPdf": (None, "python3-pyqt6.qtpdf", "python3-pyside6.qtpdf"),
    "QtPdfWidgets": (
        None,
        "python3-pyqt6.qtpdf",
        "python3-pyside6.qtpdfwidgets",
    ),
    "QtPositioning": (
        "python3-pyqt5.qtpositioning",
        "python3-pyqt6.qtpositioning",
        "python3-pyside6.qtpositioning",
    ),
    "QtPrintSupport": (
        "python3-pyqt5",
        "python3-pyqt6",
        "python3-pyside6.qtprintsupport",
    ),
    "QtPurchasing": (None, None, None),
    "QtQml": (
        "python3-pyqt5.qtquick",
        "python3-pyqt6.qtqml",
        "python3-pyside6.qtqml",
    ),
    "QtQuick3D": (
        None,
        "python3-pyqt6.qtquick3d",
        "python3-pyside6.qtquick3d",
    ),
    "QtQuickControls2": (None, None, "python3-pyside6.qtquickcontrols2"),
    "QtQuick": (
        "python3-pyqt5.qtquick",
        "python3-pyqt6.qtquick",
        "python3-pyside6.qtquick",
    ),
    "QtQuickWidgets": (
        "python3-pyqt5.qtquick",
        "python3-pyqt6.qtquick",
        "python3-pyside6.qtquickwidgets",
    ),
    "QtRemoteObjects": (
        "python3-pyqt5.qtremoteobjects",
        "python3-pyqt6.qtremoteobjects",
        "python3-pyside6.qtremoteobjects",
    ),
    "QtScxml": (None, None, "python3-pyside6.qtscxml"),
    "QtSensors": (
        "python3-pyqt5.qtsensors",
        "python3-pyqt6.qtsensors",
        "python3-pyside6.qtsensors",
    ),
    "QtSerialPort": (
        "python3-pyqt5.qtserialport",
        "python3-pyqt6.qtserialport",
        "python3-pyside6.qtserialport",
    ),
    "QtSql": ("python3-pyqt5.qtsql", "python3-pyqt6", "python3-pyside6.qtsql"),
    "QtStateMachine": (None, None, "python3-pyside6.qtstatemachine"),
    "QtSvg": (
        "python3-pyqt5.qtsvg",
        "python3-pyqt6.qtsvg",
        "python3-pyside6.qtsvg",
    ),
    "QtSvgWidgets": (
        None,
        "python3-pyqt6.qtsvg",
        "python3-pyside6.qtsvgwidgets",
    ),
    "QtTest": ("python3-pyqt5", "python3-pyqt6", "python3-pyside6.qttest"),
    "QtTextToSpeech": ("python3-pyqt5.qttexttospeech", None, None),
    "QtUiTools": (None, None, "python3-pyside6.qtuitools"),
    "QtWebChannel": (
        "python3-pyqt5.qtwebchannel",
        "python3-pyqt6.qtwebchannel",
        "python3-pyside6.qtwebchannel",
    ),
    "QtWebEngineCore": (
        "python3-pyqt5.qtwebengine",
        "python3-pyqt6.qtwebengine",
        "python3-pyside6.qtwebenginecore",
    ),
    "QtWebEngine": ("python3-pyqt5.qtwebengine", None, None),
    "QtWebEngineQuick": (
        None,
        "python3-pyqt6.qtwebengine",
        "python3-pyside6.qtwebenginequick",
    ),
    "QtWebEngineWidgets": (
        "python3-pyqt5.qtwebengine",
        "python3-pyqt6.qtwebengine",
        [
            "python3-pyside6.qtwebenginecore",
            "python3-pyside6.qtwebenginewidgets",
        ],
    ),
    "QtWebSockets": (
        "python3-pyqt5.qtwebsockets",
        "python3-pyqt6.qtwebsockets",
        "python3-pyside6.qtwebsockets",
    ),
    "QtWidgets": (
        "python3-pyqt5",
        "python3-pyqt6",
        [
            "python3-pyside6.qtgui",
            "python3-pyside6.qtopengl",
            "python3-pyside6.qtwidgets",
        ],
    ),
    "QtWinExtras": (None, None, None),
    "QtX11Extras": ("python3-pyqt5.qtx11extras", None, None),
    "QtXmlPatterns": ("python3-pyqt5.qtxmlpatterns", None, None),
    "QtXml": ("python3-pyqt5", "python3-pyqt6", "python3-pyside6.qtxml"),
    "uic": ("python3-pyqt5", "pyqt6-dev-tools", "python3-pyside6.qtuitools"),
}

parser = argparse.ArgumentParser(
    prog="qtpy-get-dependencies",
    description="List Debian package dependencies for a set of QtPy modules",
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
    "--pyqt5", action="store_true", help="Give PyQt5 dependencies (default)"
)
group.add_argument(
    "--pyqt6", action="store_true", help="Give PyQt6 dependencies"
)
group.add_argument(
    "--pyside6", action="store_true", help="Give PySide 6 dependencies"
)
parser.add_argument("--version", action="version", version="2.4.2")
parser.add_argument(
    "modules",
    nargs="+",
    metavar="module",
    help="Name of qtpy module imported",
)
args = parser.parse_args()

if args.pyqt6:
    dpos = 1
    dependencies = set(["python3-pyqt6"])
elif args.pyside6:
    dpos = 2
    dependencies = set(
        [
            "python3-pyside6.qtcore",
            "python3-pyside6.qtgui",
            "python3-pyside6.qtopengl",
            "python3-pyside6.qtwidgets",
        ]
    )
else:
    args.pyqt5 = True  # in case was not specified on command line
    dpos = 0
    dependencies = set(["python3-pyqt5"])

unrecognised = set()
unsupported = set()
constants = set()
constant_re = re.compile("[A-Z0-9_]*$")

for module in args.modules:
    modulebase = module.removeprefix("qtpy.")
    if modulebase in DEPENDENCIES:
        dep = DEPENDENCIES[modulebase][dpos]
        if not dep:
            unsupported.add(module)
        elif isinstance(dep, list):
            dependencies |= set(dep)
        else:
            dependencies.add(dep)
    elif constant_re.match(modulebase) or modulebase == "__version__":
        constants.add(module)
    else:
        unrecognised.add(module)

print("** Dependencies:")
print(", ".join(sorted(dependencies)))
if constants:
    print("** Appear to be qtpy constants:")
    print(", ".join(sorted(constants)))
if unrecognised:
    print("** Unrecognised imports:")
    print(", ".join(sorted(unrecognised)))
if unsupported:
    print("** Unsupported imports:")
    print(", ".join(sorted(unsupported)))
