#!/bin/sh

po_domain="alterator-rd"
alterator_api_version=1

. alterator-sh-functions
. shell-config
. shell-quote

# Include modules

# Common settings
readonly LOG="/tmp/alterator-rd.log"
readonly RD_CONFIG_DIR="/etc/alterator-rd/"
readonly RD_USERS_CFG_DIR="$RD_CONFIG_DIR/users/"
readonly RD_GROUP="users"
readonly RD_PROTO="tigervnc"

# Module specific
readonly TIGERVNC_OPTS_SINGLE="server displaynum password"
readonly TIGERVNC_OPTS_LISTS="desktopsize color_level compresslevel qualitylevel"
readonly TIGERVNC_OPTS_BOOL="shared viewonly fullscreen sendclipboard acceptclipboard uselocalcursor sendprimary"

tigervnc_list_qualitylevel() {
    write_enum_item "1" "1 (poor)"
    write_enum_item "2" "2"
    write_enum_item "3" "3"
    write_enum_item "4" "4"
    write_enum_item "5" "5"
    write_enum_item "6" "6"
    write_enum_item "7" "7"
    write_enum_item "8" "8 (default)"
    write_enum_item "9" "9 (best)"
}

tigervnc_list_compresslevel() {
    write_enum_item "1" "1 (fast)"
    write_enum_item "2" "2"
    write_enum_item "3" "3"
    write_enum_item "4" "4"
    write_enum_item "5" "5"
    write_enum_item "6" "6 (default)"
    write_enum_item "7" "7"
    write_enum_item "8" "8"
    write_enum_item "9" "9 (best)"
}

tigervnc_list_color_level() {
    write_enum_item "all" "All available colors"
    write_enum_item "2" "Medium (256 colors)"
    write_enum_item "1" "Low (64 colors)"
    write_enum_item "0" "Very low (8 colors)"
}

tigervnc_list_desktopsize() {
    write_enum_item "remote" "Remote geometry"
    write_enum_item "640x480" "640x480"
    write_enum_item "800x600" "800x600"
    write_enum_item "1024x768" "1024x768"
    write_enum_item "1152x864" "1280x720"
    write_enum_item "1280x800" "1280x800"
    write_enum_item "1280x1024" "1280x1024"
    write_enum_item "1360x768" "1360x768"
    write_enum_item "1366x768" "1366x768"
    write_enum_item "1440x900" "1440x900"
    write_enum_item "1600x1200" "1600x1200"
    write_enum_item "1680x1050" "1680x1050"
    write_enum_item "1920x1080" "1920x1080"
}

# List avail profiles
list_profiles()
{
    local name=
    local protocol=
    find "$RD_CONFIG_DIR" -maxdepth 1 -type f |
    while read file; do
        name="$(basename "$file")"
        eval protocol="$(shell_config_get "$file" PROTOCOL)"
        if [ -n "$name" -a -n "$protocol" -a "$protocol" = "$RD_PROTO" ]; then
            write_enum_item "$name" "$name"
        fi
    done
}

# Main loop
on_message() {
    case "$in_action" in
        #########
        # tigervnc
        #########
        tigervnc)
            local tigervnc_profile_name="${in_tigervnc_profile_name}"
            case "$in__objects" in
                list_qualitylevel)
                    tigervnc_list_qualitylevel
                    ;;
                list_compresslevel)
                    tigervnc_list_compresslevel
                    ;;
                list_color_level)
                    tigervnc_list_color_level
                    ;;
                list_desktopsize)
                    tigervnc_list_desktopsize
                    ;;
                read)
                    # Check that profile name supplied
                    if [ -z "$in_tigervnc_profile_name" ]; then
                        write_error "Can't read profile settings."
                        return 1
                    fi
                    local profile_file="$RD_CONFIG_DIR/$in_tigervnc_profile_name"

                    # Check profile name already exists
                    if ! [ -f "$profile_file" ]; then
                        write_error "Profile doesn't exists. ($in_tigervnc_profile_name)"
                        return 1
                    fi

                    write_string_param "profile_type" "tigervnc"
                    write_string_param "tigervnc_profile_name" "$in_tigervnc_profile_name"

                    # Read options
                    for option in $TIGERVNC_OPTS_SINGLE $TIGERVNC_OPTS_LISTS; do
                        option_upper="$(echo "$option" | tr '[:lower:]' '[:upper:]')"
                        eval value="$(shell_config_get "$profile_file" "$option_upper")"
                        if [ -n "$value" ]; then
                            write_string_param "tigervnc_$option" "$value"
                        fi
                    done
                   
                    # Read bool options
                    for option in $TIGERVNC_OPTS_BOOL; do
                        local optionU="$(echo "$option" | tr '[:lower:]' '[:upper:]')"
                        eval value="$(shell_config_get "$profile_file" "$optionU")"
                        if [ "$value" = "yes" ]; then
                            write_bool_param "tigervnc_$option" 1
                        elif [ "$value" = "no" ]; then
                            write_bool_param "tigervnc_$option" 0
                        fi
                    done
                    ;;
                write)
                    # Check that profile name supplied
                    if [ -z "$in_avail_profiles" ]; then
                        write_error "Can't update profile settings."
                        return 1
                    fi
                    local profile_file="$RD_CONFIG_DIR/$in_avail_profiles"

                    # Check profile name already exists
                    if ! [ -f "$profile_file" ]; then
                        write_error "Profile doesn't exists. ($in_avail_profiles)"
                        return 1
                    fi
                    
                    shell_config_set "$profile_file" "PROTOCOL" "\"$RD_PROTO\""

                    # Fill parameters
                    for i in $TIGERVNC_OPTS_SINGLE $TIGERVNC_OPTS_LISTS;do 
                        eval "value=\$in_tigervnc_$i"
                        option="$(echo "$i" | tr '[:lower:]' '[:upper:]')"
                        if [ -n "$value" ]; then
                            shell_config_set "$profile_file" "$option" "\"$(quote_shell "$value")\""
                        else
                            shell_config_set "$profile_file" "$option" ''
                        fi
                    done

                    # Fill bool parameters
                    for i in $TIGERVNC_OPTS_BOOL;do 
                        eval "value=\$in_tigervnc_$i"
                        option="$(echo "$i" | tr '[:lower:]' '[:upper:]')"
                        if [ "$value" = "#t" ]; then
                            shell_config_set "$profile_file" "$option" "\"$(quote_shell "yes")\""
                        else
                            shell_config_set "$profile_file" "$option" "\"$(quote_shell "no")\""
                        fi
                    done
                    ;;
            esac
            ;;
        list)
            case "${in__objects##*/}" in
                avail_profiles) list_profiles;;
                             *) :;;
            esac
            ;;
    esac
}

message_loop
