#!/usr/bin/env bash
set -euo pipefail

usage() {
    echo "Usage: install-fish [--uninstall]"
}

repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
rc_file="$repo_dir/fish/rc.fish"
config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/fish"
config_file="$config_dir/config.fish"

escaped_rc_file="${rc_file//\\/\\\\}"
escaped_rc_file="${escaped_rc_file//\"/\\\"}"
source_line="source \"$escaped_rc_file\""
legacy_source_line="source $rc_file"

install_fish_rc() {
    if [[ ! -f "$rc_file" ]]; then
        echo "Fish rc not found: $rc_file" >&2
        exit 1
    fi

    mkdir -p "$config_dir"
    touch "$config_file"

    if grep -Fxq "$source_line" "$config_file" || grep -Fxq "$legacy_source_line" "$config_file"; then
        echo "Already installed in $config_file"
        return
    fi

    if [[ -s "$config_file" && $(tail -c 1 "$config_file") != "" ]]; then
        printf '\n' >>"$config_file"
    fi

    printf '%s\n' "$source_line" >>"$config_file"
    echo "Installed fish rc in $config_file"
}

uninstall_fish_rc() {
    if [[ ! -f "$config_file" ]]; then
        echo "Fish rc is not installed in $config_file"
        return
    fi

    if ! grep -Fxq "$source_line" "$config_file" && ! grep -Fxq "$legacy_source_line" "$config_file"; then
        echo "Fish rc is not installed in $config_file"
        return
    fi

    tmp_file="$(mktemp)"
    grep -Fxv "$source_line" "$config_file" | grep -Fxv "$legacy_source_line" >"$tmp_file" || true
    mv "$tmp_file" "$config_file"
    echo "Uninstalled fish rc from $config_file"
}

case "${1:-}" in
    "")
        install_fish_rc
        ;;
    --uninstall)
        uninstall_fish_rc
        ;;
    -h | --help)
        usage
        ;;
    *)
        usage >&2
        exit 1
        ;;
esac
