from distutils.command.build import build
from distutils.extension import Extension
from subprocess import check_output

import numpy
from Cython.Distutils import build_ext
from setuptools import setup

extensions = [
    Extension(
        "cal_tools.cython.agipdalgs",
        ["cal_tools/cython/agipdalgs.pyx"],
        include_dirs=[numpy.get_include()],
        extra_compile_args=["-fopenmp", "-march=native"],
        extra_link_args=["-fopenmp"],
    ),
]


class PreInstallCommand(build):
    """Pre-installation for installation mode."""

    def run(self):
        version = check_output(["git", "describe", "--tag"]).decode("utf8")
        version = version.replace("\n", "")
        file = open("xfel_calibrate/VERSION.py", "w")
        file.write('__version__="{}"'.format(version))
        file.close()

        build.run(self)


from xfel_calibrate.notebooks import notebooks

data_files = []
for ctypes in notebooks.values():
    for nb in ctypes.values():
        data_files.append(nb["notebook"])
        data_files += nb.get("dep_notebooks", [])
        data_files += nb.get("pre_notebooks", [])

setup(
    name="European XFEL Offline Calibration",
    version="1.0",
    author="Steffen Hauf",
    author_email="steffen.hauf@xfel.eu",
    maintainer="EuXFEL Calibration Team",
    url="",
    description="",
    long_description="",
    long_description_content_type="text/markdown",
    # TODO: find licence, assuming this will be open sourced eventually
    license="(c) European XFEL GmbH 2018",
    packages=[
        "cal_tools",
        "xfel_calibrate",
    ],  # TODO: use setuptools.find_packages(), need to resolve issue
    package_dir={
        "cal_tools": "cal_tools/cal_tools",
        "xfel_calibrate": "xfel_calibrate",
        "xfel_calibrate.notebooks": "xfel_calibrate/notebooks",
    },
    package_data={
        "xfel_calibrate": [
            "bin/*.sh",
            "titlepage.tmpl",
            "xfel.pdf",
        ]
        + data_files
    },
    entry_points={
        "console_scripts": [
            "xfel-calibrate = xfel_calibrate.calibrate:run",
        ],
    },
    cmdclass={
        "build": PreInstallCommand,
        "build_ext": build_ext,
    },
    ext_modules=extensions,
    install_requires=[
        "iCalibrationDB @ git+ssh://git@git.xfel.eu:10022/detectors/cal_db_interactive.git@2.0.1", # noqa
        "nbparameterise @ git+ssh://git@git.xfel.eu:10022/detectors/nbparameterise.git@0.3", # noqa
        "XFELDetectorAnalysis @ git+ssh://git@git.xfel.eu:10022/karaboDevices/pyDetLib.git@2.5.6-2.10.0#subdirectory=lib", # noqa
        "Cython==0.29.21",
        "Jinja2==2.11.2",
        "astcheck==0.2.5",
        "astsearch==0.1.3",
        "dill==0.3.0",
        "extra_data==1.2.0",
        "extra_geom==1.1.1",
        "fabio==0.9.0",
        "gitpython==3.1.0",
        "h5py==2.10.0",
        "iminuit==1.3.8",
        "ipykernel==5.1.4",
        "ipyparallel==6.2.4",
        "ipython==7.12.0",
        "ipython_genutils==0.2.0",
        "jupyter-core==4.6.1",
        "jupyter_client==6.1.7",
        "jupyter_console==6.1.0",
        "karabo_data==0.7.0",
        "lxml==4.5.0",
        "metadata_client==3.0.8",
        "nbclient==0.5.1",
        "nbconvert==5.6.1",
        "nbformat==5.0.7",
        "notebook==6.1.5",
        "numpy==1.19.1",
        "prettytable==0.7.2",
        "princess==0.2",
        "pypandoc==1.4",
        "python-dateutil==2.8.1",
        "pyyaml==5.3",
        "pyzmq==19.0.0",
        "requests==2.22.0",
        "scikit-learn==0.22.2.post1",
        "sharedmem==0.3.8",
        "tabulate==0.8.6",
        "traitlets==4.3.3",
    ],
    extras_require={
        "docs": [
            "nbsphinx",
            "sphinx==1.8.5",
        ],
        "test": [
            "coverage",
            "nbval",
            "pytest-asyncio",
            "pytest-cov",
            "pytest>=5.4.0",
            "testpath",
            "unittest-xml-reporting==3.0.2",
        ],
        "dev": [
            "nbqa[toolchain]",
            "pre-commit",
        ],
    },
    python_requires=">=3.6",
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Environment :: Console",
        "Intended Audience :: Developers",
        "Intended Audience :: Science/Research",
        # "License :: OSI Approved :: BSD License",  # TODO: put license here
        "Operating System :: POSIX :: Linux",
        "Programming Language :: Python :: 3",
        "Topic :: Scientific/Engineering :: Information Analysis",
        "Topic :: Scientific/Engineering :: Physics",
    ],
)