# -*- coding: utf-8 -*-

""" Global configuration variables. The approach is adapted
 from Numba's config.py
"""
import os

FFT_CACHE_NB = 32
"""
Number of VkFFTApp to cache through the pyvkfft.fft interface
This must be modified *before* importing pyvkfft.fft.
"""

USE_LUT = None
"""
Force using a LUT for single-precision transforms ?
If None, this will be activated automatically for some GPU (Intel).

Use only to improve the accuracy by a factor 3 or 4.

If useLUT is passed directly to a VkFFTApp, this is ignored

Valid values: either None or 1
"""

WARN_OPENCL_QUEUE_MISMATCH = True
"""
Emit warning it the queue is different in the application and the array
"""


def process_environ(environ):
    """Process environment variables and load defaults as needed"""
    if "PYVKFFT_FFT_CACHE_NB" in environ:
        FFT_CACHE_NB = eval(environ["PYVKFFT_FFT_CACHE_NB"])
    else:
        FFT_CACHE_NB = 32

    if "PYVKFFT_USE_LUT" in environ:
        USE_LUT = eval(environ["PYVKFFT_USE_LUT"])
    else:
        USE_LUT = None

    if "PYVKFFT_WARN_OPENCL_QUEUE_MISMATCH" in environ:
        WARN_OPENCL_QUEUE_MISMATCH = eval(environ["PYVKFFT_WARN_OPENCL_QUEUE_MISMATCH"])

    # Inject values into the module globals
    for name, value in locals().copy().items():
        if name.isupper():
            globals()[name] = value


class _EnvReloader(object):

    def __init__(self):
        self.reset()
        self.old_environ = {}

    def reset(self):
        self.old_environ = {}
        self.update(force=True)

    def update(self, force=False):
        new_environ = {}

        for name, value in os.environ.items():
            if name.startswith('PYVKFFT_'):
                print(name, value)
                new_environ[name] = value
        if force or self.old_environ != new_environ:
            process_environ(new_environ)
            self.old_environ = new_environ


_env_reloader = _EnvReloader()


def _reload_config():
    """
    Reload the configuration from environment variables, if necessary.
    """
    _env_reloader.update()
