#include "cconfig/cconfig-util.h"

#include "asio/config-asio.h"

#include "util/log.h"

#define ASIOHOOK_CONFIG_IO_FORCE_ASIO_KEY "asio.force_asio"
#define ASIOHOOK_CONFIG_IO_FORCE_WASAPI_KEY "asio.force_wasapi"
#define ASIOHOOK_CONFIG_IO_ASIO_DEVICE_NAME_KEY "asio.device_name"

#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE false
#define ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE false
#define ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE "XONAR SOUND CARD(64)"

void asiohook_config_init(struct cconfig *config)
{
    cconfig_util_set_bool(
        config,
        ASIOHOOK_CONFIG_IO_FORCE_ASIO_KEY,
        ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE,
        "Force ASIO audio mode/device (if applicable)");

    cconfig_util_set_bool(
        config,
        ASIOHOOK_CONFIG_IO_FORCE_WASAPI_KEY,
        ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE,
        "Force WASAPI audio mode (if applicable)");

    cconfig_util_set_str(
        config,
        ASIOHOOK_CONFIG_IO_ASIO_DEVICE_NAME_KEY,
        ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE,
        "The ASIO device name to use");
}

void asiohook_config_asio_get(
    struct asiohook_config_asio *config_asio, struct cconfig *config)
{
    if (!cconfig_util_get_bool(
            config,
            ASIOHOOK_CONFIG_IO_FORCE_ASIO_KEY,
            &config_asio->force_asio,
            ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE)) {
        log_warning(
            "Invalid value for key '%s' specified, fallback "
            "to default '%d'",
            ASIOHOOK_CONFIG_IO_FORCE_ASIO_KEY,
            ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_ASIO_VALUE);
    }
    if (!cconfig_util_get_bool(
            config,
            ASIOHOOK_CONFIG_IO_FORCE_WASAPI_KEY,
            &config_asio->force_wasapi,
            ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE)) {
        log_warning(
            "Invalid value for key '%s' specified, fallback "
            "to default '%d'",
            ASIOHOOK_CONFIG_IO_FORCE_WASAPI_KEY,
            ASIOHOOK_CONFIG_IO_DEFAULT_FORCE_WASAPI_VALUE);
    }

    if (!cconfig_util_get_str(
            config,
            ASIOHOOK_CONFIG_IO_ASIO_DEVICE_NAME_KEY,
            config_asio->replacement_name,
            sizeof(config_asio->replacement_name) - 1,
            ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE)) {
        log_warning(
            "Invalid value for key '%s' specified, fallback "
            "to default '%s'",
            ASIOHOOK_CONFIG_IO_ASIO_DEVICE_NAME_KEY,
            ASIOHOOK_CONFIG_IO_DEFAULT_ASIO_DEVICE_NAME_VALUE);
    }
}
