#!/bin/sh

alterator_api_version=1

module_dir="/usr/share/alterator/applications"
section_dir="/usr/share/alterator/desktop-directories"
module_skip_list_file="/etc/alterator/menu/module-skip-list"
module_order_list_file="/etc/alterator/menu/module-order-list"
module_expert_list_file="/etc/alterator/menu/module-expert-list"
section_order_list_file="/etc/alterator/menu/section-order-list"

. alterator-sh-functions
. shell-config

make_sorted_list()
{
    local file="$1";shift
    local dir="$1";shift
    local ext="$1";shift

    sed "s/.*/$(quote_sed_regexp "$dir")\/&$(quote_sed_regexp "$ext")/" "$file"|
	while read f; do
	    [ ! -f "$f" ] || echo "$f"
	done
}

make_unsorted_list()
{
    local lst="$1";shift
    local dir="$1";shift
    local ext="$1";shift

    local sorted_list=" $(echo "$lst"|tr '\n' ' ') "
    find "$dir" -type f -name "*$ext"|
	while read f; do
	    [ -z "${sorted_list##* $f *}" ] || echo "$f"
	done
}

# <path1>:<path2> <file> -> <readable path><file>
print_first_readable(){
  local IFS=":"
  for d in $1; do
    if [ -f "$d$2" ]; then
      echo -n "$d$2"
      return
    fi
  done
}

print_sections()
{
    local IFS='	'
    while read -r category icon name comment; do
	write_table_item \
	    category "$category" \
	    icon "$icon" \
	    name "$name" \
	    comment "$comment"
    done
}

list_sections()
{
    local sorted_list="$(make_sorted_list "$section_order_list_file" "$section_dir" ".directory")"
    alterator-dump-desktop \
	-v lang="$in_language" \
	-v out="X-Alterator-Category;Icon;Name;Comment" \
	-v def="X-Alterator-System;altlinux;noname;" \
	$sorted_list \
	$(make_unsorted_list "$sorted_list" "$section_dir" ".directory") |
	print_sections
}

print_modules()
{
    local expert_mode="$1"
    local IFS='	'

    local module_skip_list=" $([ ! -s "$module_skip_list_file" ] || tr '\n' ' ' <"$module_skip_list_file") "
    local module_expert_list=" $([ ! -s "$module_expert_list_file" ] || tr '\n' ' ' <"$module_expert_list_file") "

    while read ui uri help category desktopfile name; do
	[ "$in_ui" = "all" ] || [ "$ui" = "all" ] || [ "$ui" = "${in_ui:-all}" ] || continue;

	desktopfile="${desktopfile##*/}"
	desktopfile="${desktopfile%%.desktop}"

	[ -n "${module_skip_list##* $desktopfile *}" ] || continue
	[ "$expert_mode" != "0" -o -n "${module_expert_list##* $desktopfile *}" ] || continue

	write_table_item \
	    uri "$uri" \
	    help "$help" \
	    category "$category" \
	    desktopfile "$desktopfile" \
	    name "$name" \
	    ui "$ui"
    done
}

list_modules()
{
    local expert_mode="$1"
    local sorted_list="$(make_sorted_list "$module_order_list_file" "$module_dir" ".desktop")"

    alterator-dump-desktop \
	-v lang="$in_language" \
	-v out="X-Alterator-UI;X-Alterator-URI;X-Alterator-Help;Categories;Filename;Name" \
	-v def="all;/notfound;notfound;X-Alterator-Other;notfound;noname" \
	$sorted_list \
	$(make_unsorted_list "$sorted_list" "$module_dir" ".desktop") |
	print_modules "$expert_mode"
}

read_module()
{
    local fname="$(print_first_readable "$ALTERATOR_DATADIR" "/applications/$in_desktopfile.desktop")"
    local IFS='	'

    [ ! -f "$fname" ] ||
    alterator-dump-desktop \
	-v lang="$in_language" \
	-v out="X-Alterator-UI;X-Alterator-URI;X-Alterator-Help;Name" \
	-v def="all;/notfound;notfound;" \
	$fname|
	(read ui uri help name;
	    [ "$in_ui" = "all" ] || [ "$ui" = "all" ] || [ "$ui" = "${in_ui:-all}" ] || return;
	    write_string_param uri "$uri"
	    write_string_param help "$help"
	    write_string_param name "$name")
}

###FIXME: alterator_api_version = 1
on_message()
{
	case "$in_action" in
	    read)
		read_module
		;;
	    list)
		case "$in__objects" in
		    avail_sections)
			list_sections
			;;
		    avail_modules)
			list_modules "${in_expert_mode:-0}"
			;;
		    expert_modules)
			write_enum<"$module_expert_list_file"
			;;
		esac
		;;
	esac
}

message_loop
