import logging
from pathlib import Path

try:
    import tomllib
except ModuleNotFoundError:
    import tomli as tomllib

logger = logging.getLogger(__name__)

configuration = {}


def get_configpath():
    for pn in (
        Path.home() / '.config' / 'vm-compact',
        Path.home() / 'Documents' / 'Voicemeeter' / 'vm-compact',
        Path.cwd() / '_internal' / 'configs',
        Path.cwd() / 'configs',
    ):
        if pn.exists():
            return pn


if configpath := get_configpath():
    filepaths = list(configpath.glob('*.toml'))
    if any(f.stem in ('app', 'vban') for f in filepaths):
        configs = {}
        for filepath in filepaths:
            filename = filepath.with_suffix('').stem
            if filename in ('app', 'vban'):
                try:
                    with open(filepath, 'rb') as f:
                        configs[filename] = tomllib.load(f)
                    logger.info(f'configuration: {filename} loaded into memory')
                except tomllib.TOMLDecodeError:
                    logger.error(f'Invalid TOML config: configs/{filename.stem}')
        configuration |= configs

_defaults = {
    'configs': {
        'config': None,
    },
    'theme': {
        'enabled': True,
        'mode': 'light',
    },
    'extends': {
        'extended': True,
        'extends_horizontal': True,
    },
    'channel': {
        'width': 80,
        'height': 130,
        'xpadding': 3,
    },
    'mwscroll_step': {
        'size': 3,
    },
    'submixes': {
        'default': 0,
    },
    'navigation': {'show': False},
}


if 'app' in configuration:
    for key in _defaults:
        if key in configuration['app']:
            configuration['app'][key] = _defaults[key] | configuration['app'][key]
        else:
            configuration['app'][key] = _defaults[key]
else:
    configuration['app'] = _defaults


def get_configuration(key):
    if key in configuration:
        return configuration[key]


def loader(kind_id, target):
    configs = {'reset': target.configs['reset']}
    if configpath := get_configpath():
        userconfigpath = configpath / kind_id
        if userconfigpath.exists():
            filepaths = list(userconfigpath.glob('*.toml'))
            for filepath in filepaths:
                identifier = filepath.with_suffix('').stem
                try:
                    with open(filepath, 'rb') as f:
                        configs[identifier] = tomllib.load(f)
                    logger.info(f'loader: {identifier} loaded into memory')
                except tomllib.TOMLDecodeError:
                    logger.error(f'Invalid TOML config: configs/{filename.stem}')

    target.configs = configs
    return target.configs
