#!/bin/bash

# Get an application setting
#
# usage: ynh_app_setting_get --app=app --key=key
# | arg: -a, --app=     - the application id
# | arg: -k, --key=     - the setting to get
#
# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_get() {
    local _globalapp=${app-:}
    # Declare an array to define the options of this helper.
    local legacy_args=ak
    local -A args_array=([a]=app= [k]=key=)
    local app
    local key
    # Manage arguments with getopts
    ynh_handle_getopts_args "$@"
    app="${app:-$_globalapp}"

    if [[ $key =~ (unprotected|protected|skipped)_ ]]; then
        yunohost app setting $app $key
    else
        ynh_app_setting "get" "$app" "$key"
    fi
}

# Set an application setting
#
# usage: ynh_app_setting_set --app=app --key=key --value=value
# | arg: -a, --app=     - the application id
# | arg: -k, --key=     - the setting name to set
# | arg: -v, --value=   - the setting value to set
#
# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_set() {
    local _globalapp=${app-:}
    # Declare an array to define the options of this helper.
    local legacy_args=akv
    local -A args_array=([a]=app= [k]=key= [v]=value=)
    local app
    local key
    local value
    # Manage arguments with getopts
    ynh_handle_getopts_args "$@"
    app="${app:-$_globalapp}"

    if [[ $key =~ (unprotected|protected|skipped)_ ]]; then
        yunohost app setting $app $key -v $value
    else
        ynh_app_setting "set" "$app" "$key" "$value"
    fi
}

# Delete an application setting
#
# usage: ynh_app_setting_delete --app=app --key=key
# | arg: -a, --app=     - the application id
# | arg: -k, --key=     - the setting to delete
#
# Requires YunoHost version 2.2.4 or higher.
ynh_app_setting_delete() {
    local _globalapp=${app-:}
    # Declare an array to define the options of this helper.
    local legacy_args=ak
    local -A args_array=([a]=app= [k]=key=)
    local app
    local key
    # Manage arguments with getopts
    ynh_handle_getopts_args "$@"
    app="${app:-$_globalapp}"

    if [[ "$key" =~ (unprotected|skipped|protected)_ ]]; then
        yunohost app setting $app $key -d
    else
        ynh_app_setting "delete" "$app" "$key"
    fi
}

# Small "hard-coded" interface to avoid calling "yunohost app" directly each
# time dealing with a setting is needed (which may be so slow on ARM boards)
#
# [internal]
#
ynh_app_setting() {
    set +o xtrace # set +x
    ACTION="$1" APP="$2" KEY="$3" VALUE="${4:-}" python3 - <<EOF
import os, yaml, sys
app, action = os.environ['APP'], os.environ['ACTION'].lower()
key, value = os.environ['KEY'], os.environ.get('VALUE', None)
setting_file = "/etc/yunohost/apps/%s/settings.yml" % app
assert os.path.exists(setting_file), "Setting file %s does not exists ?" % setting_file
with open(setting_file) as f:
    settings = yaml.safe_load(f)
if action == "get":
    if key in settings:
        print(settings[key])
else:
    if action == "delete":
        if key in settings:
            del settings[key]
    elif action == "set":
        if key in ['redirected_urls', 'redirected_regex']:
            value = yaml.safe_load(value)
        settings[key] = value
    else:
        raise ValueError("action should either be get, set or delete")
    with open(setting_file, "w") as f:
        yaml.safe_dump(settings, f, default_flow_style=False)
EOF
    set -o xtrace # set -x
}

# Check availability of a web path
#
# usage: ynh_webpath_available --domain=domain --path_url=path
# | arg: -d, --domain=      - the domain/host of the url
# | arg: -p, --path_url=    - the web path to check the availability of
#
# example: ynh_webpath_available --domain=some.domain.tld --path_url=/coffee
#
# Requires YunoHost version 2.6.4 or higher.
ynh_webpath_available() {
    # Declare an array to define the options of this helper.
    local legacy_args=dp
    local -A args_array=([d]=domain= [p]=path_url=)
    local domain
    local path_url
    # Manage arguments with getopts
    ynh_handle_getopts_args "$@"

    yunohost domain url-available $domain $path_url
}

# Register/book a web path for an app
#
# usage: ynh_webpath_register --app=app --domain=domain --path_url=path
# | arg: -a, --app=         - the app for which the domain should be registered
# | arg: -d, --domain=      - the domain/host of the web path
# | arg: -p, --path_url=    - the web path to be registered
#
# example: ynh_webpath_register --app=wordpress --domain=some.domain.tld --path_url=/coffee
#
# Requires YunoHost version 2.6.4 or higher.
ynh_webpath_register() {
    # Declare an array to define the options of this helper.
    local legacy_args=adp
    local -A args_array=([a]=app= [d]=domain= [p]=path_url=)
    local app
    local domain
    local path_url
    # Manage arguments with getopts
    ynh_handle_getopts_args "$@"

    yunohost app register-url $app $domain $path_url
}
