#!/bin/bash

set -eu
set -o pipefail

our_links="/var/cache/ifcplugin-kostylen.links"

_check()
{
	if ! rpm -q ifcplugin &>/dev/null; then
		echo "ifcplugin от Госуслуг не установлен"
		return 1
	fi
}

_list_extensions()
{
	rpm -ql ifcplugin | grep -E '^/opt/google/chrome/extensions/.*\.json$' | awk -F'/' '{print $NF}'
}

_list_native_messaging_hosts()
{
	rpm -ql ifcplugin | grep -E '^/etc/opt/chrome/native-messaging-hosts/.*\.json$' | awk -F'/' '{print $NF}'
}

_mk_symlink()
{
	local target="$1"
	local linkname="$2"
	if ! test -f "$linkname"; then
		mkdir -p "$(dirname "$linkname")"
		ln -sf "$target" "$linkname"
		echo "$linkname" >> "$our_links"
	fi
}

# _cleanup вызывается и при обновлении пакета, и при полном удалении
_cleanup()
{
	test -f "$our_links" || return 0
	local tmp
	tmp="$(mktemp)"
	c=0
	# Созданные нами папки не вычищаем, т.к. логика получится слишком сложной:
	# учитывать созданные родительские папки, не стали ли папки принадлежать пакетам и т.д.
	while read -r line
	do
		if ! test -f "$(realpath "$line")"
		then
			unlink "$line" || :
		else
			echo "$line" >> "$tmp"
			c=$((c+1))
		fi
	done < "$our_links"
	if (( c == 0 ))
	then
		unlink "$our_links"
	else
		# cat, a не cp, чтобы права стали 644 (с учетом umask), а не 600
		cat "$tmp" > "$our_links"
	fi
}

# вызывается при полном удалении ifcplugin-kostylen и зачищает все созданные им костыли
_full_remove()
{
	test -f "$our_links" || return 0
	while read -r line
	do
		unlink "$line" || :
	done < "$our_links"
	unlink "$our_links"
}

_fix_extensions()
{
	local is_chromium_installed="$1"
	local is_yandex_installed="$2"
	while read -r line
	do
		test -n "$line" || continue
		if (( is_chromium_installed == 1 )); then
			_mk_symlink /opt/google/chrome/extensions/"$line" /usr/share/chromium/extensions/"$line"
		fi
		if (( is_yandex_installed == 1 )); then
			# этот путь посмотрели через strace
			_mk_symlink /opt/google/chrome/extensions/"$line" /usr/share/YandexBrowser/extensions/"$line"
		fi
	done < <(_list_extensions)
}

# Чтобы расширение не было отключено по умолчанию
# Скриншот: https://file-store.rosa.ru/download/c4006a90cbef62b036503dab321b303bd2a83c5d
_allow_manifest_v2()
{
	local is_chromium_installed="$1"
	(( is_chromium_installed != 1 )) && return 0
	# Скриптлет в КриптоПро cprocsp-pki-plugin-64*.rpm делает примерно это же,
	# но только для /etc/opt/chromium/policies/managed/policy.json.
	# Если файл уже существует (по умолчанию его нет), лучше не будем пытаться его править.
	test -f /etc/chromium/policies/managed/policy.json && return 0
	mkdir -p /etc/chromium/policies/managed/
	echo '{ "ExtensionManifestV2Availability": 2  }' > /etc/chromium/policies/managed/policy.json
}

_fix_messaging_hosts()
{
	local is_chromium_installed="$1"
	local is_yandex_installed="$2"
	while read -r line
	do
		test -n "$line" || continue
		# Яндекс Браузер тоже читает из /etc/chromium
		if (( is_chromium_installed == 1 )) || (( is_yandex_installed == 1 )); then
			_mk_symlink /etc/opt/chrome/native-messaging-hosts/"$line" /etc/chromium/native-messaging-hosts/"$line"
		fi
	done < <(_list_native_messaging_hosts)
}

_fix_config()
{
	local md5
	md5="$(md5sum /etc/ifc.cfg | awk '{print $1}')"
	local fix_required=0
	case "$md5" in
		"8c115211799826b582368a03b8438252" ) fix_required=1 ;;
	esac
	if (( fix_required == 0 )); then return 0; fi
	cat /etc/ifc.cfg.kostylen > /etc/ifc.cfg
}

_configure()
{
	_check || exit $?
	test -f /etc/ifc.cfg && _fix_config
	local is_chromium_installed=1
	local is_yandex_installed=1
	rpm -qa 'chromium-browser*' &>/dev/null || is_chromium_installed=0
	# разные варианты: yandex-browser, yandex-browser-stable, get-yandex-browser и др.
	rpm -qa '*yandex-browser*' &>/dev/null || is_yandex_installed=0
	_fix_extensions "$is_chromium_installed" "$is_yandex_installed"
	_fix_messaging_hosts "$is_chromium_installed" "$is_yandex_installed"
	_allow_manifest_v2 "$is_chromium_installed"
}

_main()
{
	case "${action:-}" in
		cleanup )
			_cleanup
		;;
		full-remove )
			_full_remove
		;;
		* )
			_cleanup
			_configure
		;;
	esac
}

_main "$@"
