import os
import sys
import subprocess


def configuration(parent_package='',top_path=None):
    from numpy.distutils.misc_util import Configuration
    from scipy._build_utils.compiler_helper import set_cxx_flags_hook
    from scipy._build_utils import numpy_nodepr_api
    config = Configuration('sparse',parent_package,top_path)

    config.add_data_dir('tests')

    config.add_subpackage('linalg')
    config.add_subpackage('csgraph')

    config.add_extension('_csparsetools',
                         sources=['_csparsetools.c'])

    def get_sparsetools_sources(ext, build_dir):
        # Defer generation of source files
        subprocess.check_call([sys.executable,
                               os.path.join(os.path.dirname(__file__),
                                            '_generate_sparsetools.py'),
                               '--no-force'])
        return []

    depends = ['sparsetools_impl.h',
               'bsr_impl.h',
               'csc_impl.h',
               'csr_impl.h',
               'other_impl.h',
               'bool_ops.h',
               'bsr.h',
               'complex_ops.h',
               'coo.h',
               'csc.h',
               'csgraph.h',
               'csr.h',
               'dense.h',
               'dia.h',
               'sparsetools.h',
               'util.h']
    depends = [os.path.join('sparsetools', hdr) for hdr in depends],
    sparsetools = config.add_extension('_sparsetools',
                         define_macros=[('__STDC_FORMAT_MACROS', 1)] + numpy_nodepr_api['define_macros'],
                         depends=depends,
                         include_dirs=['sparsetools'],
                         sources=[os.path.join('sparsetools', 'sparsetools.cxx'),
                                  os.path.join('sparsetools', 'csr.cxx'),
                                  os.path.join('sparsetools', 'csc.cxx'),
                                  os.path.join('sparsetools', 'bsr.cxx'),
                                  os.path.join('sparsetools', 'other.cxx'),
                                  get_sparsetools_sources]
                         )
    sparsetools._pre_build_hook = set_cxx_flags_hook

    return config


if __name__ == '__main__':
    from numpy.distutils.core import setup
    setup(**configuration(top_path='').todict())
