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

# Copyright 2015, 2016 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.

"""Global configuration module"""

import sys
import json
import os.path

# --------------------------------------------------------------------
# public interface

def load(*files, strict=False):
    """Load JSON configuration files"""
    configfiles = files or _default_configs
    for conf in configfiles:
        try:
            path = os.path.expanduser(os.path.expandvars(conf))
            with open(path) as file:
                confdict = json.load(file)
            _config.update(confdict)
        except FileNotFoundError:
            if strict:
                raise
            continue
        except ValueError as exception:
            print("Error while loading '", path, "':", sep="", file=sys.stderr)
            print(exception, file=sys.stderr)

def clear():
    """Reset configuration to en empty state"""
    globals()["_config"] = {}

def get(keys, default=None):
    """Get the value of property 'key' or a default-value if it doenst exist"""
    conf = _config
    try:
        for k in keys:
            conf = conf[k]
        return conf
    except (KeyError, AttributeError):
        return default

def interpolate(keys, default=None):
    """Interpolate the value of 'key'"""
    conf = _config
    try:
        for k in keys:
            default = conf.get(keys[-1], default)
            conf = conf[k]
        return conf
    except (KeyError, AttributeError):
        return default

def set(keys, value):
    """Set the value of property 'key' for this session"""
    conf = _config
    for k in keys[:-1]:
        try:
            conf = conf[k]
        except KeyError:
            temp = {}
            conf[k] = temp
            conf = temp
    conf[keys[-1]] = value

def setdefault(keys, value):
    """Set the value of property 'key' if it doesn't exist"""
    conf = _config
    for k in keys[:-1]:
        try:
            conf = conf[k]
        except KeyError:
            temp = {}
            conf[k] = temp
            conf = temp
    return conf.setdefault(keys[-1], value)


# --------------------------------------------------------------------
# internals

_config = {}

if os.name == "nt":
    _default_configs = [
        r"~\.config\gallery-dl\config.json",
        r"%USERPROFILE%\gallery-dl\config.json",
        r"~\.gallery-dl.conf",
        r"%USERPROFILE%\gallery-dl.conf",
    ]
else:
    _default_configs = [
        "/etc/gallery-dl.conf",
        "${HOME}/.config/gallery/config.json",
        "${HOME}/.config/gallery-dl/config.json",
        "${HOME}/.gallery-dl.conf",
    ]
