#!/bin/bash
me=`basename "$0"`
echo
echo
echo
echo "Starting install..."
date
customDie() {
    cat <<END

ERROR:
$1


END
    exit 1
}

dest_programs="$HOME"
#NOTE: $HOME is still used further down, for $HOME/.* and $HOME/i_am_dedicated_minetest_server flag file (which can be empty)
#TODO: change $HOME/i_am_dedicated_minetest_server to $HOME/.config/EnlivenMinetest/i_am_dedicated_minetest_server or rc file
extracted_name=linux-minetest-kit
flag_dir_rel="$extracted_name/mtsrc"
flag_dir="`pwd`/$flag_dir_rel"
enable_client=false
custom_scripts_dir="$HOME"
custom_script_name="mts.sh"
if [ -f "$custom_scripts_dir/mts-CenterOfTheSun.sh" ]; then
    custom_script_name="mts-CenterOfTheSun.sh"
fi

scripting_rc_path=~/.config/EnlivenMinetest/scripting.rc

if [ -f ~/.config/EnlivenMinetest/scripting.rc ]; then
    echo "Running $scripting_rc_path..."
    source $scripting_rc_path
    # may contain any variables above, plus:
    # * enable_run_after_compile: if true, then run the server, such as
    #   ~/mts-CenterOfTheSun.sh
else
    echo "* skipping $scripting_rc_path (not present)"
    echo "  (can contain settings such as enable_run_after_compile)"
fi

pushd "$extracted_name"


extra_options=""
for var in "$@"
do
    if [ "@$var" = "@--client" ]; then
        enable_client=true
    elif [ "@$var" = "@--clean" ]; then
        enable_clean=true
    elif [ "@$var" = "@--noclean" ]; then
        enable_clean=false
    else
        customDie "Invalid argument: $var"
    fi
done

if [ -z "$enable_clean" ]; then
    enable_clean=true
fi

echo "enable_clean=\"$enable_clean\"..."

# flag_icon="$HOME/Desktop/org.minetest.minetest.desktop"
flag_client_dest_file="$dest_programs/minetest/bin/minetest"
flag_file="minetest/bin/minetestserver"
if [ -f "$flag_client_dest_file" ]; then
    enable_client=true
    echo "* automatically adding --client to compile since detected"
    echo "  '$flag_client_dest_file'"
    # echo "--press Ctrl C to cancel..."
    # sleep 2
fi
if [ "@$enable_client" = "@true" ]; then
    flag_file="minetest/bin/minetest"
    extra_options="--client"
fi
#if [ -f "$flag_file" ]; then
    #rm -f "$flag_file"
#fi
#if [ -f "$flag_file" ]; then
    #echo "ERROR: Nothing done since can't remove old '$flag_file'"
    #exit 1
#fi
enable_compile=true
if [ -d minetest ]; then
    enable_compile=false
    if [ "@$enable_client" = "@true" ]; then
        if [ ! -f minetest/bin/minetest ]; then
            enable_compile=true
            echo "* enabling compile (since no `pwd`/minetest/bin/minetest but client install is enabled)"
        fi
    fi
else
    echo "* enabling compile since missing `pwd`/minetest directory"
fi
if [ "@$enable_compile" = "@true" ]; then
    echo "* checking if the compile library script extracted the program source yet ($flag_dir)..."
    if [ ! -d "$flag_dir" ]; then
        cat <<END
ERROR: missing $flag_dir_rel
- If you do not have an extracted minetest source directory which
  is normally extracted by the library build script, you must add
  that--it can be automatically added by running:

  bash reset-minetest-install-source.sh


END
        exit 1
    fi

    start=`date +%s`
    if [ -f "mtcompile-program.pl" ]; then
        # perl mtcompile-program.pl build >& program.log
        echo "Compiling via perl (this may take a while--output redirected to `pwd`/program.log)..."
        perl mtcompile-program.pl build --server $extra_options >& program.log
    else
        # NOTE: no pl in $extracted_name, assuming bash:
        if [ -f mtcompile-program.sh ]; then
        echo "Compiling via bash (this may take a while--output redirected to `pwd`/program.log)..."
            bash -e mtcompile-program.sh build --server $extra_options >& program.log
        else
            echo
            echo "ERROR: Install cannot finish since there is no"
            echo " mtcompile-program.pl nor mtcompile-program.pl"
            echo " in the extracted $extracted_name directory."
            echo
            echo
        fi
    fi
    end=`date +%s`
    compile_time=$((end-start))
    echo "Compiling the program finished in $compile_time seconds."
else
    echo "* using existing minetest..."
fi
if [ ! -f "$flag_file" ]; then
    customDie "The build did not complete since '$flag_file' is missing."
fi
dest_flag_file="$dest_programs/$flag_file"
if [ -f "$dest_flag_file" ]; then
    mv -f "$dest_flag_file" "$dest_flag_file.bak"
fi
if [ -f "$dest_flag_file" ]; then
    customDie "Install is incomplete because it can't move '$dest_flag_file'."
fi
if [ ! -d minetest ]; then
    customDie "Install is incomplete because `pwd`/minetest is missing."
fi
virtual_dest="$dest_programs/minetest"
link_target=`readlink $virtual_dest`
# install_dest="/tank/local/owner/minetest"
install_dest="$virtual_dest"
dest_official_game="$dest_programs/minetest/games/Bucket_Game"
dest_enliven="$dest_programs/minetest/games/ENLIVEN"
skins_dst="$dest_enliven/mods/codercore/coderskins/textures"
skins_bak="$HOME/Backup/ENLIVEN/mods/codercore/coderskins/textures"
official_game_mod_list="coderbuild codercore coderedit coderfood codermobs decorpack mtmachines"
if [ "@$enable_clean" = "@true" ]; then
    echo "* cleaning destination..."
    if [ -d "$dest_official_game" ]; then
        echo "  - erasing '$dest_official_game'..."
        rm -Rf "$dest_official_game"
    fi
    if [ -d "$dest_enliven" ]; then
        if [ -d "$skins_dst" ]; then
            echo "  - Backing up '$skins_dst' to '$skins_bak'..."
            if [ ! -d "$skins_bak" ]; then
                mkdir -p "$skins_bak" || customDie "* cannot create $skins_bak"
            fi
            rsync -rt "$skins_dst/" "$skins_bak"
        fi
        for var in $official_game_mod_list
        do
            echo "  - erasing '$dest_enliven/$var'..."
            rm -Rf "$dest_enliven/$var"
        done
    fi
fi
if [ ! -z "$link_target" ]; then
    install_dest="$link_target"
    echo "* detected that $virtual_dest is a symlink to $link_target"
    echo "  (redirecting rsync to prevent symlink to dir conversion: installing to $install_dest"
    echo "   and recreating symlink '$virtual_dest' pointing to '$install_dest')..."
    rsync -rt "minetest/" "$install_dest" || customDie "Cannot rsync files from installer data `pwd`/minetest/ to $install_dest"
    if [ ! -d "$dest_programs/minetest" ]; then
        echo "* creating link to $install_dest directory as $dest_programs/minetest..."
        ln -s "$install_dest" "$dest_programs/minetest"
    fi
else
    echo "Installing minetest directory to '$dest_programs'..."
    rsync -rt minetest/ $install_dest || customDie "Cannot rsync files from installer data `pwd`/minetest/ to $install_dest"
fi
if [ ! -f "$dest_flag_file" ]; then
    customDie "ERROR: not complete--couldn't install binary as '$dest_flag_file'"
fi

flag_dir="$dest_official_game"
if [ ! -d "$flag_dir" ]; then
    customDie "ERROR: missing $flag_dir"
fi
if [ ! -d "$dest_programs/minetest/games/ENLIVEN" ]; then
    echo "Copying $flag_dir to $dest_programs/minetest/games/ENLIVEN..."
    cp -R "$flag_dir" "$dest_programs/minetest/games/ENLIVEN"
    echo "name = ENLIVEN" > "$dest_programs/minetest/games/ENLIVEN/game.conf"
else

    for mod_name in $official_game_mod_list
    do
        echo "  - updating $mod_name..."
        rsync -rt --delete "$flag_dir/mods/$mod_name" "$dest_programs/minetest/games/ENLIVEN/mods"
    done
    # cp -f "$flag_dir/mods/LICENSE" "$dest_programs/minetest/games/ENLIVEN/mods/LICENSE"
    if [ -d "$skins_bak" ]; then
        echo "  - restoring skins from '$skins_bak'..."
        rsync -rt "$skins_bak/" "$skins_dst"
    fi
fi
popd

pushd ..
src="patches/subgame/menu"
dst="$dest_programs/minetest/games/ENLIVEN/menu"
echo "updating '$dst' from '$src/'..."
rsync -rt "$src/" "$dst"

src="patches/Bucket_Game-patched"
dst="$dest_programs/minetest/games/ENLIVEN"
echo "updating '$dst' from '$src/'..."
rsync -rt "$src/" "$dst"
if [ -d "$dst/mods/coderfood/food_basic/etc" ]; then
  rm -Rf "$dst/mods/coderfood/food_basic/etc"
fi

# Bucket_Game doesn't come with a minetest.conf, only minetest.conf.example* files
# if [ ! -f "$dest_programs/minetest/minetest.Bucket_Game-example.conf" ]; then
#     cp -f "$dest_programs/minetest/minetest.conf" "$dest_programs/minetest/minetest.Bucket_Game-example.conf"
# fi

client_example_dest="$dest_programs/minetest/minetest.ENLIVEN.client-example.conf"
# client conf writing only ever happens once, unless you manually delete $client_example_dest file:
if [ ! -f "$client_example_dest" ]; then
    if [ -f "$dest_programs/minetest/minetest.conf" ]; then
        echo "Backing up minetest.conf..."
        if [ ! -f "$dest_programs/minetest/minetest.conf.1st" ]; then
            cp -f "$dest_programs/minetest/minetest.conf" "$dest_programs/minetest/minetest.conf.1st"
        else
            cp -f "$dest_programs/minetest/minetest.conf" "$dest_programs/minetest/minetest.conf.bak"
        fi
    fi
    echo "Installing minetest.conf and ENLIVEN example conf files..."
    cp -f "patches/subgame/minetest.client-example.conf" "$dest_programs/minetest/minetest.conf"
    cp -f "patches/subgame/minetest.LAN-client-example.conf" "$dest_programs/minetest/minetest.ENLIVEN.LAN-client-example.conf"
    cp -f "patches/subgame/minetest.server-example.conf" "$dest_programs/minetest/minetest.ENLIVEN.server-example.conf"
    cp -f "patches/subgame/minetest.client-example.conf" "$client_example_dest"
fi
server_minetest_conf_dest="$dest_programs/minetest/games/ENLIVEN/minetest.conf"

if [ -f "$server_minetest_conf_dest" ]; then
    cat << END
NOTE: minetest.org releases allow you to put a world.conf file in your
  world, so that is the file you should edit manually in your world
  --this installer overwrites $server_minetest_conf_dest and
  worlds/CenterOfTheSun settings (the author Poikilos' world).

END
fi
echo "Writing '$server_minetest_conf_dest'..."
cp -f "patches/subgame/minetest.server-example.conf" "$server_minetest_conf_dest"
echo "" >> "$server_minetest_conf_dest"
echo "# Added automatically by $me:" >> "$server_minetest_conf_dest"
if [ -f "$HOME/i_am_dedicated_minetest_server" ]; then
    echo "server_dedicated = true" >> "$server_minetest_conf_dest"
else
    echo "server_dedicated = false" >> "$server_minetest_conf_dest"
fi
echo "" >> "$server_minetest_conf_dest"
echo "" >> "$server_minetest_conf_dest"


world_override_src="overrides/worlds/CenterOfTheSun"
world_override_dst="$HOME/.minetest/worlds/CenterOfTheSun"
world_override_dst="$HOME/.minetest/worlds/CenterOfTheSun"
try_world_override_dst="$HOME/minetest/worlds/CenterOfTheSun"
if [ -d "$try_world_override_dst" ]; then
    world_override_dst="$try_world_override_dst"
fi
world_conf_src="$world_override_src/world.conf"
world_conf_dst="$world_override_dst/world.conf"
world_mt_src="$world_override_src/world.mt"
world_mt_dst="$world_override_dst/world.mt"
if [ -d "$world_override_dst" ]; then
    echo "You have the CenterOfTheSun world. Listing any changes..."
    if [ -f "$world_conf_src" ]; then
        if [ -f "$world_conf_dst" ]; then
            echo " * overwrite $world_conf_dst with $world_conf_src"
        else
            echo " * add the world.conf from $world_conf_src"
        fi
        cp -f "$world_conf_src" "$world_conf_dst"
    fi
fi


enable_clear_icon_cache=false
if [ "@$enable_client" = "@true" ]; then
    dest_icons=$HOME/.local/share/applications
    dest_icon=$dest_icons/org.minetest.minetest.desktop
    # if [ -f "$dest_icon" ]; then
        # comment since never fixes broken icon anyway
        # TODO: fixed bad cache even if icon was rewritten properly after written improperly
        # * not tried yet:
        #   * rm $HOME/.kde/share/config/kdeglobals
        # enable_clear_icon_cache=true
    # fi
    echo "Writing icon '$dest_icon'..."
    cat "patches/deploy-patched/misc/org.minetest.minetest.desktop" | grep -v Icon | grep -v Path | grep -v Exec > "$dest_icon"
    # Icon must be an absolute path (other variables use $HOME in
    # desktop file above), so exclude it above and rewrite it below:
    echo "Icon=$dest_programs/minetest/misc/minetest-xorg-icon-128.png" >> "$dest_icon"
    echo "Path=$dest_programs/minetest/bin" >> "$dest_icon"
    echo "Exec=$dest_programs/minetest/bin/minetest" >> "$dest_icon"
    if [ "@$enable_clear_icon_cache" = "@true" ]; then
        if [ -f "`command -v gnome-shell`" ]; then
            echo "Refreshing Gnome icons..."
            gnome-shell --replace & disown
            sleep 10
        fi
        if [ -f "$HOME/.cache/icon-cache.kcache" ]; then
            echo "clearing $HOME/.cache/icon-cache.kcache..."
            rm $HOME/.cache/icon-cache.kcache
        fi
        if [ -f "`command -v kquitapp5`" ]; then
            echo "Refreshing KDE icons..."
            if [ "`command -v kstart5`" ]; then
                kquitapp5 plasmashell && kstart5 plasmashell
            else
                kquitapp5 plasmashell && kstart plasmashell
            fi
            sleep 15
        fi
        if [ -f "`command -v xfce4-panel`" ]; then
            echo "Refreshing Xfce icons..."
            xfce4-panel -r && xfwm4 --replace
            sleep 5
        fi
        if [ -f "`command -v lxpanelctl`" ]; then
            echo "Refreshing LXDE icons..."
            lxpanelctl restart && openbox --restart
            sleep 5
        fi
    fi
fi

if [ -f $dest_programs/minetest/games/ENLIVEN/mods/codermobs/codermobs/animal_materials.lua ]; then
    if [ -d patches/mods-stopgap/animal_materials_legacy ]; then
        echo "* installing animal_materials_legacy (only needed for worlds created with old versions of Bucket_Game)"
        rsync -rt patches/mods-stopgap/animal_materials_legacy $dest_programs/minetest/games/ENLIVEN/mods/
    else
        echo "* MISSING patches/mods-stopgap/animal_materials"
    fi
else
    echo "* SKIPPING a stopgap mod since no animal_materials"
fi

if [ -f $dest_programs/minetest/games/ENLIVEN/mods/codermobs/codermobs/elk.lua ]; then
    if [ -d patches/mods-stopgap/elk_legacy ]; then
        echo "* installing elk_legacy (only needed for worlds created with old versions of Bucket_Game)"
        rsync -rt patches/mods-stopgap/elk_legacy $dest_programs/minetest/games/ENLIVEN/mods/
    else
        echo "* MISSING patches/mods-stopgap/elk_legacy"
    fi
else
    echo "* SKIPPING a stopgap mod since no elk.lua"
fi

if [ -d "$dest_programs/minetest/games/ENLIVEN/mods/coderbuild/nftools" ]; then
    if [ -d patches/mods-stopgap/nftools_legacy ]; then
        echo "* installing nftools_legacy (only needed for worlds created with old versions of Bucket_Game)"
        rsync -rt patches/mods-stopgap/nftools_legacy $dest_programs/minetest/games/ENLIVEN/mods/
    else
        echo "* MISSING patches/mods-stopgap/nftools_legacy"
    fi
else
    echo "* SKIPPING a stopgap mod since no nftools"
fi

popd
settings_dump="`pwd`/settings-dump.txt"
settings_types_list="`pwd`/settingtypes-list.txt"
#grep -r `pwd`/linux-minetest-kit/minetest/games/Bucket_Game -e "setting_get" > $settings_dump
pushd linux-minetest-kit/minetest/games
if [ ! -f "$settings_dump" ]; then
    echo "Creating $settings_dump..."
    grep -r Bucket_Game -e "setting_get" > $settings_dump
    grep -r Bucket_Game -e "minetest.settings:get" >> $settings_dump
else
    echo "* $settings_dump was already created"
fi
if [ ! -f "$settings_types_list" ]; then
    echo "Creating $settings_types_list..."
    find Bucket_Game -name "settingtypes.txt" > $settings_types_list
else
    echo "* $settings_types_list was already created"
fi
popd
echo "* finished compiling."
if [ "@$enable_run_after_compile" = "@true" ]; then
    echo "Trying to run minetest or other custom post-install script"
    echo "(enable_run_after_compile is true in '$scripting_rc_path')."
    if [ -d "$custom_scripts_dir" ]; then
        pushd "$custom_scripts_dir"
        if [ -f archive-minetestserver-debug.sh ]; then
            ./archive-minetestserver-debug.sh
            echo "NOTE: if you put archive-minetestserver-debug.sh"
            echo "  in `pwd`, it would run at this point if"
            echo "  marked executable."
        fi
        if [ -f "$custom_script_name" ]; then
            ./$custom_script_name
            echo "$custom_script_name finished (exit code $?)"
        else
            cat <<END
ERROR: enable_run_after_compile is true, but
  '$custom_script_name' is not in
  '$custom_scripts_dir'.
  Try setting custom_scripts_dir and custom_script_name in
  '$scripting_rc_path'
END
        fi
        popd
    else
        cat <<END
ERROR: enable_run_after_compile is true, but
  '$custom_scripts_dir'
  does not exist. Try setting custom_scripts_dir in
  '$scripting_rc_path'.
END
    fi
fi

echo
echo