# Licensed under a 3-clause BSD style license - see PYFITS.rst

import os
import sys
from collections import defaultdict
from glob import glob

import numpy
from setuptools import Extension

from extension_helpers import get_compiler, pkg_config


def _get_compression_extension():
    debug = "--debug" in sys.argv

    cfg = defaultdict(list)
    cfg["include_dirs"].append(numpy.get_include())
    cfg["sources"].append(
        os.path.join(os.path.dirname(__file__), "src", "compressionmodule.c")
    )

    if int(os.environ.get("ASTROPY_USE_SYSTEM_CFITSIO", 0)) or int(
        os.environ.get("ASTROPY_USE_SYSTEM_ALL", 0)
    ):
        for k, v in pkg_config(["cfitsio"], ["cfitsio"]).items():
            cfg[k].extend(v)
    else:
        if get_compiler() == "msvc":
            # These come from the CFITSIO vcc makefile, except the last
            # which ensures on windows we do not include unistd.h (in regular
            # compilation of cfitsio, an empty file would be generated)
            cfg["extra_compile_args"].extend(
                [
                    "/D",
                    "WIN32",
                    "/D",
                    "_WINDOWS",
                    "/D",
                    "_MBCS",
                    "/D",
                    "_USRDLL",
                    "/D",
                    "_CRT_SECURE_NO_DEPRECATE",
                    "/D",
                    "YY_NO_UNISTD_H",
                ]
            )
        else:
            cfg["extra_compile_args"].extend(["-Wno-declaration-after-statement"])

            cfg["define_macros"].append(("HAVE_UNISTD_H", None))

            if not debug:
                # these switches are to silence warnings from compiling CFITSIO
                # For full silencing, some are added that only are used in
                # later versions of gcc (versions approximate; see #6474)
                cfg["extra_compile_args"].extend(
                    [
                        "-Wno-strict-prototypes",
                        "-Wno-unused",
                        "-Wno-uninitialized",
                        "-Wno-unused-result",  # gcc >~4.8
                        "-Wno-misleading-indentation",  # gcc >~7.2
                        "-Wno-format-overflow",  # gcc >~7.2
                    ]
                )

        cfitsio_lib_path = os.path.join("cextern", "cfitsio", "lib")
        cfitsio_zlib_path = os.path.join("cextern", "cfitsio", "zlib")
        cfitsio_files = glob(os.path.join(cfitsio_lib_path, "*.c"))
        cfitsio_zlib_files = glob(os.path.join(cfitsio_zlib_path, "*.c"))
        cfg["include_dirs"].append(cfitsio_lib_path)
        cfg["include_dirs"].append(cfitsio_zlib_path)
        cfg["sources"].extend(cfitsio_files)
        cfg["sources"].extend(cfitsio_zlib_files)

    return Extension("astropy.io.fits.compression", **cfg)


def get_extensions():
    return [_get_compression_extension()]
