#!/bin/bash
# Add-ons server static web generation (addons.wesnoth.org)

die() { printf '%s\n' "$*" >&2; exit 1; }
[ $# -eq 1 ] || die "Syntax: $0 <addon server version>"

version=$1

addon_files=$HOME/WWW/html/files/addons/$version
addon_cache=$HOME/addons-unpacked/$version
addon_list=$HOME/WWW/html/addons/$version
#deleted_addons=/backup/deleted-addons/$version
deleted_addons=$HOME/deleted-addons/$version
url=https://files.wesnoth.org/addons/$version/
manager=$HOME/source/$version/data/tools/wesnoth_addon_manager
campaignd_host="192.168.1.20"
#campaignd_host="add-ons.wesnoth.org"
options=(-a "$campaignd_host" --port "$version".x)


case $version in
1.2)    cd "$HOME/source/1.4" || exit
        manager=utils/campaigns_client.py;;
1.4)    cd "$HOME/source/1.4" || exit
        manager=utils/campaigns_client.py;;
1.8)    options+=(--port 1.8.x);;
1.9)    options+=(--port 1.9.x --datadir "$HOME/source/1.10")
        manager=$HOME/source/master/data/tools/wesnoth_addon_manager;;
1.14)   options+=(--port 1.14.x --datadir "$HOME/source/$version");;
trunk)  options=(--port trunk --verbose)
        manager=$HOME/source/master/data/tools/wesnoth_addon_manager;;
*)      [[ -d "$HOME/source/$version" ]] && options+=(--port "$version".x --datadir "$HOME/source/$version")
        manager=$HOME/source/master/data/tools/wesnoth_addon_manager;;
esac

mkdir -p "$addon_files" "$addon_list" || exit

# delete unpacked files without tar archive so it gets regenerated
[[ -d $addon_cache ]] && for file in "$addon_cache"/*;
do
        addon=$(basename "${file%.cfg}")
        [[ -e $addon_files/$addon.tar.bz2 ]] || rm -rfv "$file";
done

"$manager" "${options[@]}" --download='.*' -c "$addon_cache" --html="$addon_list" --url="$url" --tar="$addon_files" || exit

# improve parsing for newer manager versions
ifs=$IFS
[[ $manager = $HOME/source/master/data/tools/wesnoth_addon_manager ]] && ifs=$'\t'
# add addons to an associative array for easy existence check
declare -A addons
while IFS=$ifs read -r type addon rest
do
        [[ $addon ]] && addons[$addon]=1
done < <("$manager" "${options[@]}" --list 2> /dev/null | sed 1d) # ignore header

# debug
#(cd "$addon_files" && printf '%s\n' * | sort > "$HOME/log/addon-files-list-$version")
#printf '%s\n' "${!addons[@]}" | sort > "$HOME/log/addon-names-list-$version"

mkdir -p "$deleted_addons"
((${#addons[@]} > 0)) || exit 0
# move deleted addons
for file in "$addon_files"/*.tar.bz2;
do
        addon=$(basename "${file%.tar.bz2}")
        if [[ $addon && ${addons[$addon]} != 1 ]]
        then
                # ignore addons with spaces since the list output the addon names are checked against is space separated
                if [[ $IFS = $ifs && $addon = *\ * ]]
                then
                        echo "Skipping deletion for $addon"
                        continue
                fi
                echo "Archiving files for deleted add-on $addon..."
                mv "$file" "$deleted_addons/";
                rm -rf "$addon_cache/$addon";
                rm -f  "$addon_cache/$addon.cfg";
        fi
done
