#!/usr/bin/env python

from distutils.core import setup, Extension
from distutils import log

import os
import subprocess
import sipdistutils
import sipconfig

cfg = sipconfig.Configuration()
pyqt_sip_dir = cfg.default_sip_dir
for p in (os.path.join(pyqt_sip_dir, "PyQt5"),
          os.path.join(pyqt_sip_dir, "PyQt5-3"),
          os.path.join(pyqt_sip_dir, "PyQt4"),
          pyqt_sip_dir,
          os.path.join(cfg.default_mod_dir, "PyQt5", "bindings")):
    if os.path.exists(os.path.join(p, "QtCore", "QtCoremod.sip")):
        pyqt_sip_dir = p
        break

try:
    import PyQt5
    PyQt_Version = 'PyQt5'
except:
    PyQt_Version = 'PyQt4'


include_dirs = ['src']


class build_pyqt_ext(sipdistutils.build_ext):
    description = "Build a qhexedit PyQt extension."

    user_options = sipdistutils.build_ext.user_options + [(
        "required",
        None,
        "qhexedit is required (failure to build will raise an error)"
    )]

    boolean_options = sipdistutils.build_ext.boolean_options + ["required"]

    def initialize_options(self):
        sipdistutils.build_ext.initialize_options(self)
        self.required = False

    def finalize_options(self):
        if PyQt_Version == 'PyQt5':
            from PyQt5.QtCore import PYQT_CONFIGURATION
        else:
            from PyQt4.QtCore import PYQT_CONFIGURATION
        sipdistutils.build_ext.finalize_options(self)
        self.sip_opts = self.sip_opts + PYQT_CONFIGURATION['sip_flags'].split()
        self.sip_opts.append('-I%s/%s' % (pyqt_sip_dir, PyQt_Version))
        if self.required is not None:
            self.required = True

    def build_extension(self, ext):
        cppsources = (s for s in ext.sources if s.endswith(".cpp"))
        if not os.path.exists(self.build_temp):
            os.makedirs(self.build_temp)
        for source in cppsources:
            header = source.replace(".cpp", ".h")
            if os.path.exists(header):
                moc_file = os.path.basename(header).replace(".h", ".moc")
                call_arg = (
                    "moc",
                    "-o",
                    os.path.join(self.build_temp, moc_file),
                    header
                )
                log.info("Calling: " + " ".join(call_arg))
                try:
                    subprocess.call(call_arg)
                except OSError:
                    raise OSError(
                        "Could not locate 'moc' executable."
                    )
        sipdistutils.build_ext.build_extension(self, ext)

    def run(self):
        try:
            sipdistutils.build_ext.run(self)
        except Exception as ex:
            if self.required:
                raise
            else:
                log.info("Could not build qhexedit extension (%r)\n"
                         "Skipping." % ex)

    # For sipdistutils to find PyQt's .sip files
    def _sip_sipfiles_dir(self):
        return pyqt_sip_dir


# Used Qt libs
if PyQt_Version == 'PyQt5':
    qt_libs = ["QtCore", "QtGui", "QtWidgets"]
else:
    qt_libs = ["QtCore", "QtGui"]


if cfg.qt_framework:
    for lib in qt_libs:
        include_dirs += [os.path.join(cfg.qt_lib_dir,
                                      lib + ".framework", "Headers")]
else:
    if PyQt_Version == 'PyQt5':
        for qt_inc_dir in ('/usr/include/qt', '/usr/include/x86_64-linux-gnu/qt5'):
            include_dirs.append(qt_inc_dir)
            include_dirs += [os.path.join(qt_inc_dir, lib) for lib in qt_libs]
        libraries = ["Qt5" + lib[2:] for lib in qt_libs]
    else:
        for qt_inc_dir in ('/usr/include/qt', '/usr/include/qt4'):
            include_dirs.append(qt_inc_dir)
            include_dirs += [os.path.join(qt_inc_dir, lib) for lib in qt_libs]
        libraries = ["Qt" + lib[2:] for lib in qt_libs]

libraries.append("qhexedit")

dirname = os.path.dirname(__file__)

setup(
    name='QHexEdit',
    version='0.8.9',
    ext_modules=[
        Extension(
            "qhexedit",
            sources=[
                os.path.join(dirname, "src/qhexedit.sip"),
            ],
            include_dirs=include_dirs,
            libraries=libraries,
        )
    ],
    cmdclass={"build_ext": build_pyqt_ext},
)