#!/bin/bash

### Manage Stardew Valley mods

# Use nginx-style mods-available and mods-enabled folders.

# game_dir="${HOME}/.local/share/Steam/steamapps/common/Stardew Valley"
game_dir="${HOME}/sdv-manager-test"
mods_available_dir="${game_dir}/mods-available"
mods_enabled_dir="${game_dir}/mods-enabled"
declare -A mod_state

function get_mod_state {
    for available_mod_dir in "$mods_available_dir"/*; do
        available_mod_name="$(basename "$available_mod_dir")"
        mod_state[$available_mod_name]='disabled'
    done

    # TODO: Probably remove broken links and untracked files.
    for enabled_mod_dir in "$mods_enabled_dir"/*; do
        enabled_mod_name="$(basename "$enabled_mod_dir")"
        # xargs sometimes gets a broken pipe signal here. It's harmless but annoying.
        if echo "${!mod_state[@]}" | xargs -n1 2>/dev/null | grep -q "$enabled_mod_name"; then
            mod_state[$enabled_mod_name]='enabled'
        fi
    done
}

function mod_is_available {
    mod_name="$1"
    get_mod_state
    if [[ $mod_name == '' ]]; then
        echo "Mod name not given."
    elif echo "${!mod_state[@]}" | xargs -n1 2>/dev/null | grep -q "$mod_name"; then
        return 0
    else
        return 1
    fi
}

case "$1" in
    'list')
        # TODO: Make this printing prettier.
        echo 'Listing available mods.'
        get_mod_state
        for mod in "${!mod_state[@]}"; do
            echo "$mod --- ${mod_state[$mod]}"
        done
        ;;
    'install')
        echo 'Implement install.'
        # Check if $2 is an existing directory
        # If it is, check if a mod with the same name is already installed.
        # If not, copy the directory to mods-available
        ;;
    'enable')
        mod_name="$2"
        if mod_is_available "$mod_name"; then
            if [[ ${mod_state[$mod_name]} == 'disabled' ]]; then
                echo "Enabling $mod_name."
                ln -s "${mods_available_dir}/${mod_name}" "${mods_enabled_dir}/${mod_name}"
            else
                echo "Mod $mod_name is already enabled."
            fi
        fi
        ;;
    'disable')
        mod_name="$2"
        if mod_is_available "$mod_name"; then
            if [[ ${mod_state[$mod_name]} == 'enabled' ]]; then
                echo "Disabling $mod_name."
                rm "${mods_enabled_dir}/${mod_name}"
            else
                echo "Mod $mod_name is already disabled."
            fi
        fi
        ;;
    'init')
        # TODO: This needs to be a lot more careful. Cases to handle:
        #   sdv-manager is already set up
        echo "Initializing sdv-manager at ${game_dir}."
        SMAPI_mods_dir="${game_dir}/Mods"
        
        mkdir -p "$mods_available_dir" "$mods_enabled_dir"

        for mod_dir in "${SMAPI_mods_dir}"/*; do
            mod_name="$(basename "$mod_dir")"
            echo "$mod_dir"
            echo "$mod_name"
            mv "${mod_dir}" "$mods_available_dir"
            ln -s "${mods_available_dir}/${mod_name}" "${mods_enabled_dir}"
        done

        rmdir "${SMAPI_mods_dir}"
        ln -s "${game_dir}/mods-enabled" "${SMAPI_mods_dir}"
        ;;
    *)
        echo "$1 is not a recognized command."
        echo "Available commands are enable, disable, install, and init."
        ;;
esac
