#!/usr/bin/env bash
                                                                                                                                                                          

help() {
    echo "${0##*/}"
    echo "Released under the terms of the GPL license."
    echo -e "This is a Stormux project: https://stormux.org\n"
    echo -e "Usage:\n"
    echo "With no arguments, open ${0##*/}."
    for i in "${!command[@]}" ; do
        echo "-${i/:/ <parameter>}: ${command[${i}]}"
    done | sort
    exit 0
}

# Function to check if a file is an IWAD
is_iwad() {
    local file="$1"
    if [[ -f "$file" ]]; then
        # Extract the first four bytes and check if they match the IWAD signature
        if hexdump -n 4 -e '4/1 "%02X"' "$file" | grep -q '^49574144$'; then
            return 0
        else
            return 1
        fi
    fi
    return 1
}

                                                                                                                                                                          
declare -A command=(
    [c:]="gzdoom configuration file to be used. Default: ${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
    [h]="This help screen."
)
configFile="${configfile:-${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini}"


# Convert the keys of the associative array to a format usable by getopts
args="${!command[*]}"
args="${args//[[:space:]]/}"
while getopts "${args}" i 2> /dev/null ; do
    case "$i" in
        c) configFile="${OPTARG}" ;;
        h) help ;;
        *) continue ;;
    esac
done

# Extract the Path= lines from the [IWADSearch.Directories] section
mapfile -t wadPaths < <(sed -n "/^\[IWADSearch.Directories\]/,/^\[/{/Path=/p;}" "$configFile" | cut -d '=' -f 2)
declare -a wadList
# Loop through each path in wadPaths and find WAD files
for i in "${wadPaths[@]}"; do
    # Use find and append results to wadList array
    if [[ -d "$i" ]]; then
        while IFS= read -r -d $'\0' wad; do
            is_iwad "$wad" && wadList+=("$wad")
        done < <(find "$i" -follow -maxdepth 1 -type f -iname '*.wad' -print0)
    fi
done

# Set up the menu
declare -a wadMenu
for path in "${wadList[@]}" ; do
    title="${path##*/}"
    title="${title%.*}"
    wadMenu+=("${title}" "${path}")
done
# Run yad to display the dialog
iwad=$(yad --list \
    --title="Yadoom" \
    --text="Select an Iwad" \
    --column="Iwad" \
    --column="Path" \
    --button="Launch:0" \
    --button="Close:1" \
    --hide-column=2 \
    --search-column=1 \
    --skip-taskbar \
    "${wadMenu[@]}")
yadCode="$?"
[[ ${yadCode} -eq 0 ]] || exit 0
iwad="${iwad#*|}"
iwad="${iwad%|}"
gzdoom "$@" -iwad "${iwad}"