#!/bin/sh -pe
#
# update-langlist maintains the LANGUAGE priority list. It does so in
# a simplified manner, unlike the UI in language-selector-gnome for
# setting the user language which provides full control.

first_language=$1
homedir=$2
renewed_langlist=

[ -n "$first_language" -a -n "$homedir" ] || exit 1

is_valid_language() {
    case "$1" in
        ''|*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.@+-]*|*:*)
            return 1
            ;;
        *)
            return 0
            ;;
    esac
}

is_valid_language_list() {
    case "$1" in
        ''|*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.@:+-]*)
            return 1
            ;;
        *)
            return 0
            ;;
    esac
}

get_old_langlist() {
    if [ -r "$homedir/.pam_environment" ]; then
        while IFS= read -r line || [ -n "$line" ]; do
            if [ "$( printf '%s\n' "${line%%=*}" | sed -r 's/[[:space:]]+DEFAULT$//' )" = 'LANGUAGE' ]; then
                old_langlist=${line#*=}
                is_valid_language_list "$old_langlist" || old_langlist=
                break
            fi
        done < "$homedir/.pam_environment"
    fi
}

is_valid_language "$first_language" || exit 1

old_langlist=
english=true
if [ "${first_language%%[_@]*}" != 'en' ]; then
    get_old_langlist
    english=false
fi

if [ -n "$old_langlist" ] && ! $english; then
    renewed_langlist=$first_language
    old_ifs=$IFS
    IFS=:
    for lang in $old_langlist; do
        [ -n "$lang" ] || continue
        [ "$lang" = "$first_language" ] && continue
        renewed_langlist=$renewed_langlist:$lang
    done
    IFS=$old_ifs
else
    # build fresh list with 'en' as the last element
    # no other languages needed if English was selected
    renewed_langlist=$first_language
    [ "$first_language" != 'en' ] && renewed_langlist=$renewed_langlist:en
fi

printf '%s\n' "$renewed_langlist"

