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

BASE_URL="https://stoat.joahs.net"
INSTALL_DIR="${HOME}/.local/bin"
DATA_DIR="${HOME}/.local/share/stoat_client"
DESKTOP_FILE="${HOME}/.local/share/applications/stoat-client.desktop"
VERSION_URL="${BASE_URL}/version.txt"
UPDATE_URL="${BASE_URL}/update.txt"
BINARY_URL="https://storage.re-bl.net/api/download?id=8a0f0b21-63b9-4615-b9be-51f23dcf1707&filename=stoat_client&ext=.stoat_client"
INSTALLER_URL="${BASE_URL}/stoat_installer"

LOCAL_VERSION_FILE="${DATA_DIR}/version.txt"

LOCAL_VERSION_FILE="${DATA_DIR}/version.txt"

log_info() { echo "[INFO] $1"; }
log_warn() { echo "[WARN] $1"; }
log_error() { echo "[ERROR] $1"; }

download_file() {
    local url="$1"
    local dest="$2"
    if command -v curl >/dev/null 2>&1; then
        curl -fsSL --retry 3 --retry-delay 2 "$url" -o "$dest"
    elif command -v wget >/dev/null 2>&1; then
        wget -q --tries=3 --wait=2 "$url" -O "$dest"
    else
        log_error "Neither curl nor wget found."
        return 1
    fi
}

needs_update() {
    if [ ! -f "${INSTALL_DIR}/stoat_client" ]; then
        return 0
    fi
    if [ ! -f "$LOCAL_VERSION_FILE" ]; then
        return 0
    fi
    local remote_version
    remote_version=$(download_file "$VERSION_URL" /dev/stdout 2>/dev/null || echo "")
    if [ -z "$remote_version" ]; then
        log_warn "Could not fetch remote version. Skipping update check."
        return 1
    fi
    local local_version
    local_version=$(cat "$LOCAL_VERSION_FILE" 2>/dev/null || echo "")
    if [ "$remote_version" != "$local_version" ]; then
        return 0
    fi
    return 1
}

install_binary() {
    log_info "Installing StoatClient..."
    mkdir -p "$INSTALL_DIR"
    mkdir -p "$DATA_DIR"
    mkdir -p "$DATA_DIR/avatars"

    if ! download_file "$BINARY_URL" "${INSTALL_DIR}/stoat_client"; then
        log_error "Failed to download binary."
        return 1
    fi

    chmod +x "${INSTALL_DIR}/stoat_client"
    log_info "Binary installed to ${INSTALL_DIR}/stoat_client"

    if download_file "$VERSION_URL" "$LOCAL_VERSION_FILE" 2>/dev/null; then
        log_info "Version file downloaded."
    else
        log_warn "Could not download version file."
    fi

    if download_file "$UPDATE_URL" "${DATA_DIR}/update.txt" 2>/dev/null; then
        log_info "Update notes downloaded."
    else
        log_warn "Could not download update notes."
    fi

    return 0
}

create_desktop_entry() {
    mkdir -p "$(dirname "$DESKTOP_FILE")"
    cat > "$DESKTOP_FILE" <<EOF
[Desktop Entry]
Type=Application
Name=Stoat Client
Comment=Revolt chat client
Exec=${INSTALL_DIR}/stoat_client
Icon=utilities-terminal
Terminal=false
Categories=Network;Chat;
EOF
    chmod 644 "$DESKTOP_FILE"
    log_info "Desktop entry created at ${DESKTOP_FILE}"
}

main() {
    log_info "Starting StoatClient installer..."

    if needs_update; then
        log_info "New version available or first install. Downloading..."
        install_binary && create_desktop_entry
        log_info "Installation complete!"
    else
        log_info "Stoat Client is already up to date."
    fi

    log_info "Launch from your application menu or run: ${INSTALL_DIR}/stoat_client"
}

main "$@"