from distutils.core import setup, Extension
import os
import subprocess
import re
import sys

# TODO: write code to know exact parent directory of this file.
CWD = os.getcwd()

# binary_c must be installed.
binary_c_config = os.environ["BINARY_C"] + "/binary_c-config"

binary_c_incdirs = (
    subprocess.run([binary_c_config, "incdirs_list"], stdout=subprocess.PIPE)
    .stdout.decode("utf-8")
    .split()
)
binary_c_libdirs = (
    subprocess.run([binary_c_config, "libdirs_list"], stdout=subprocess.PIPE)
    .stdout.decode("utf-8")
    .split()
)
binary_c_cflags = (
    subprocess.run([binary_c_config, "cflags"], stdout=subprocess.PIPE)
    .stdout.decode("utf-8")
    .split()
)
# binary_c_cflags.remove('-fvisibility=hidden')
binary_c_libs = (
    subprocess.run([binary_c_config, "libs_list"], stdout=subprocess.PIPE)
    .stdout.decode("utf-8")
    .split()
)

# create list of tuples of defined macros
binary_c_define_macros = []
defines = (
    subprocess.run([binary_c_config, "define_macros"], stdout=subprocess.PIPE)
    .stdout.decode("utf-8")
    .split()
)
lone = re.compile("^-D(.+)$")
partner = re.compile("^-D(.+)=(.+)$")

for x in defines:
    y = partner.match(x)
    if y:
        binary_c_define_macros.extend([(y.group(1), y.group(2))])
    else:
        y = lone.match(x)
        if y:
            binary_c_define_macros.extend([(y.group(1), None)])
# add API header file
API_h = os.environ["BINARY_C"] + "/src/API/binary_c_API.h"
binary_c_define_macros.extend([("BINARY_C_API_H", API_h)])

setup(
    name="binary_c",
    version="1.0",
    description="This is a python API for binary_c by Rob Izzard and collaborators",
    author="Jeff Andrews and Robert Izzard and David Hendriks",
    author_email="andrews@physics.uoc.gr and r.izzard@surrey.ac.uk and rob.izzard@gmail.com and davidhendriks93@gmail.com",
    license="",
    ext_modules=[
        Extension(
            "binary_c",
            ["src/binary_c_python.c"],
            include_dirs=[
                os.environ["BINARY_C"] + "/src",
                os.environ["BINARY_C"] + "/src/API",
                "include",
            ]
            + binary_c_incdirs,
            libraries=["binary_c"] + binary_c_libs + ["binary_c_api"],
            library_dirs=[
                os.environ["BINARY_C"] + "/src",
                "./",
                os.path.join(CWD, "lib/"),
            ]
            + binary_c_libdirs,
            runtime_library_dirs=[
                os.environ["BINARY_C"] + "/src",
                "./",
                os.path.join(CWD, "lib/"),
            ]
            + binary_c_libdirs,
            define_macros=[] + binary_c_define_macros,
            extra_objects=[],
            extra_compile_args=[],
        )
    ],  # binary_c must be loaded
)