#!/bin/sh

. alterator-sh-functions
. shell-config

ALTCONFDIR=/etc/alterator/sysconfig/
KBDDIR=$ALTCONFDIR/kbd
GKBDDIR=$ALTCONFDIR/gnome-kbd
CONFIGDIR=/etc/sysconfig/
KBD_CONFIG=/etc/sysconfig/keyboard
SYSKEYTABLE=setsyskeytable
VCONSOLE_CONF=/etc/vconsole.conf
XKB_CONFIG=/etc/X11/xinit/Xkbmap
X11_KEYBOARD_CONF="/etc/X11/xorg.conf.d/00-keyboard.conf"
LOCALECTL=/usr/bin/localectl

i18n_conf="/etc/sysconfig/i18n"
langmap_conf="/etc/sysconfig/langmap"
rpm_conf="/etc/rpm/macros"
localectl_conf="/etc/locale.conf"
slideshow_conf='/etc/alterator/slideshow.conf'

langlist="/etc/alterator/sysconfig/lang/langlist"
po_charset="UTF-8"

default_kbd(){
	local in_language="$1"
	shell_config_get "$KBDDIR/kbdlist" ${in_language%%;*} '[[:space:]]\+'
}

# sysconfig-language stuff

write_locale(){
	local l="$1";shift
	[ "$l" != "POSIX" ] && [ "${l: -3}" != '_RU' -o "${l:0:3}" = "ru_" ] &&
		echo "$l.$po_charset" || echo "$l"
}

write_locale_conf(){
	local lang="$1";shift
	if [ -e "$localectl_conf" ]; then
		# Replace old value of LANG variable with new or append it
		sed -i "/^LANG=/{h;s/=.*/=$lang/};\${x;/^$/{s//LANG=$lang/;H};x}" "$localectl_conf"
	else
		printf 'LANG=%s\n' "$lang">"$localectl_conf"
	fi
}

write_gnome_kbd(){
	local path_gkb switch_forward switch_backward
	local dconf_config dconf_gdm_config
	[ -f /usr/share/wayland-sessions/gnome.desktop ] || return 0
	dconf_config=/etc/dconf/db/local.d/01-gnome-keymap
	dconf_gdm_config=/etc/dconf/db/gdm.d/01-gnome-keymap
	rm -f "$dconf_config"
	path_gkb="$GKBDDIR/$1.gkb"
	[ -s "$path_gkb" ] || return 0
	switch_forward="$(head -n 1 "$path_gkb")"
	mkdir -p /etc/dconf/db/local.d
	cat > "$dconf_config" <<EOF
[org/gnome/desktop/wm/keybindings]
switch-input-source=[`echo $switch_forward`, '<Super>space', 'XF86Keyboard']
EOF
	[ ! -d /etc/dconf/db/gdm.d ] || cp "$dconf_config" "$dconf_gdm_config"
	dconf update
	# cleanup unneeded xkb opts
	sed -i '/Option "XkbOptions"/d' "$X11_KEYBOARD_CONF"
}

write_keymap(){
	local in_layout in_language language layout variant options path path_kbd
	in_language="$1"
	in_layout="$2"
	language="${in_language%%;*}"
	if [ -n "$in_layout" ]; then
		path="$KBDDIR/$language/$in_layout"
		path_kbd="$path.kbd"
		layout=`shell_config_get "$path.xkb" "-layout" "[[:space:]]" | awk '$1=$1' 2>/dev/null`
		options=`shell_config_get "$path.xkb" "-option" "[[:space:]]" | awk '$1=$1' 2>/dev/null`
		variant=`shell_config_get "$path.xkb" "-variant" "[[:space:]]" | awk '$1=$1' 2>/dev/null` ||:
	fi
	# update x11 keyboard mapping
	/usr/bin/setxkbmap -option ""
	[ -z "$path" ] || /usr/bin/setxkbmap `cat "$path.xkb"`
	# cleanup unused Xkbmap config
	install -Dpm644 /dev/null "$XKB_CONFIG"
	# create X11 keyboard config
	[ -n "$layout" ] || layout='us'
	[ -n "$variant" ] || variant="$(echo "$layout" | sed 's/[^,]//g')"
	cat > "$destdir/$X11_KEYBOARD_CONF" << EOF
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
	Option "XkbLayout" "$layout"
	Option "XkbVariant" "$variant"
	Option "XkbOptions" "$options"
EndSection
EOF
	[ ! -f "$CONFIGDIR/consolefont" ] ||
		shell_config_set "$CONFIGDIR/consolefont" SYSFONT UniCyr_8x16
	# update console keyboard mapping
	[ -n "$path_kbd" ] || path_kbd='/dev/null'
	install -Dpm644 "$path_kbd" "$KBD_CONFIG" &&
		which "$SYSKEYTABLE" >/dev/null 2>&1 && "$SYSKEYTABLE" >&2
	if [ -f "$VCONSOLE_CONF" ]; then
		sed -i '/^KEYMAP/d' "$VCONSOLE_CONF"
	else
		shell_config_set "$VCONSOLE_CONF" FONT UniCyr_8x16
	fi
	[ -s "$path_kbd" ] && sed "s/KEYTABLE=/KEYMAP=/" "$path.kbd" >> "$VCONSOLE_CONF"
        # update GNOME keyboard mapping
        write_gnome_kbd "$in_layout"
}

write_language(){
	local in_lang="$1"
	local in_language="$2"
	mkdir -p -- "${langmap_conf%/*}"
	mkdir -p -- "${rpm_conf%/*}"

	local firstlang="${in_lang%%;*}"

	[ ! -f "$i18n_conf" ] || printf 'LANG=%s\n' "$(write_locale "$firstlang")">"$i18n_conf"

	local lang=$(write_locale "$firstlang")

	if [ -x "$LOCALECTL" ]; then
		$LOCALECTL set-locale LANG=$lang || write_locale_conf "$lang"
	else
		write_locale_conf "$lang"
	fi

	if echo "$in_language" | grep -Fqs ';'; then
		[ ! -f "$i18n_conf" ] || printf 'SUPPORTED=%s\n' "$(write_language "$in_language")">>"$i18n_conf"
		printf '%s\n' "$(write_language "$in_language")">"$langmap_conf"
	else
		[ ! -f "$i18n_conf" ] || printf 'SUPPORTED=%s\n' "$(write_locale "$firstlang")">>"$i18n_conf"
	fi

	# Show Russian labels when a program has not yet been translated to the language of small nation of Russia
	if [ "${lang: -3}" = '_RU' ] && [ "${lang:0:3}" != "ru_" ]; then
		shell_config_set "$localectl_conf" LANGUAGE "$lang:ru"
		echo "$lang:ru" > "$langmap_conf"
		if [ -f "$i18n_conf" ]; then
			echo "LANGUAGE=$lang:ru" >> "$i18n_conf"
			subst "s/^SUPPORTED=.*$/SUPPORTED=$lang:ru_RU.UTF-8/" "$i18n_conf"
		fi
	else
		shell_config_del "$localectl_conf" LANGUAGE
		rm -f "$langmap_conf"
	fi

	sed 's,^%_install_langs[[:space:]].*,%_install_langs all,' -i "$rpm_conf"

	if [ -f "$slideshow_conf" ]; then
		# Setup slideshow for selected language
		local sl_lang="${firstlang%%_*}"
		url="$(shell_config_get "$slideshow_conf" url)"
		# Reset url to default in case it was already localized
		# by installer-feature-slideshow
		url="${url%-*}"
			# Use English slideshow as default
			[ -d "$url-$sl_lang" ] || sl_lang='en'
		# Setup proper localized slideshow
		if [ -n "$sl_lang" ] && [ -n "$url" ] && [ -d "$url-$sl_lang" ]; then
			shell_config_set "$slideshow_conf" url "$url-$sl_lang"
		fi
	fi
}
