#!/usr/bin/env bash

# --- Helper functions ---
log() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
exists() { command -v "$1" >/dev/null 2>&1; }

# --- Defined Paths ---
PANAMA_PATH="$HOME/.local/share/Panama"
LOCAL_BIN_PATH="$HOME/.local/bin"

echo -e "\n--- Installing Repositories ---"
log "Installing RPM Fusion Free and Nonfree Repositories"
sudo dnf install -y https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm > /dev/null 2>&1
log "Enabling Fedora Cisco OpenH264 Repository"
sudo dnf config-manager setopt fedora-cisco-openh264.enabled=1
log "Installing RPM Fusion AppStream Metadata"
sudo dnf update @core -y > /dev/null 2>&1
sudo dnf install -y rpmfusion-\*-appstream-data > /dev/null 2>&1
log "Installing Terra Repository"
sudo dnf install -y --nogpgcheck --repofrompath 'terra,https://repos.fyralabs.com/terra$releasever' terra-release > /dev/null 2>&1

echo -e "\n--- Installing relevant packages ---"
log "Updating all packages. This may take a while"
sudo dnf update -y --refresh > /dev/null 2>&1

log "Updating core, multimedia, and sound-and-video groups"
sudo dnf4 groupupdate -y 'core' 'multimedia' 'sound-and-video' \
    --setop='install_weak_deps=False' \
    --exclude='PackageKit-gstreamer-plugin' \
    --allowerasing && sync > /dev/null 2>&1
log "Swapping ffmpeg-free for ffmpeg"
sudo dnf swap -y 'ffmpeg-free' 'ffmpeg' --allowerasing > /dev/null 2>&1
log "Swapping mesa-va-drivers for mesa-va-drivers-freeworld"
sudo dnf swap -y mesa-va-drivers mesa-va-drivers-freeworld > /dev/null 2>&1
log "Upgrading Multimedia group with optional packages"
sudo dnf4 group upgrade -y --with-optional Multimedia > /dev/null 2>&1
log "Installing GStreamer plugins (bad, good, base)"
sudo dnf install -y gstreamer1-plugins-{bad-\*,good-\*,base} \
    --exclude=gstreamer1-plugins-bad-free-devel > /dev/null 2>&1

# --- Install all initial packages ---
PACKAGES_FILE="$PANAMA_PATH/setup/packages/initial-packages"
if [[ -f "$PACKAGES_FILE" ]]; then
	INITIAL_PACKAGES=$(tr "\n" " " <"$PACKAGES_FILE")
	log "Installing Initial Packages"
  echo -e "Includes the following packages:"
  echo -e "$(<"$PACKAGES_FILE")"
	sudo dnf install -y "$INITIAL_PACKAGES" > /dev/null 2>&1
	log "Initial packages installed!"
else
	log "Package list was not in specified path: $PACKAGES_FILE"
fi

# --- Install oh-my-posh if not already installed. ---
mkdir -p "$LOCAL_BIN_PATH"
if [[ -x "$LOCAL_BIN_PATH/oh-my-posh" ]]; then
	log "oh-my-posh already installed at \"$LOCAL_BIN_PATH/oh-my-posh\""
else
	log "Installing oh-my-posh via curl..."
	curl -s https://ohmyposh.dev/install.sh | bash -s -- -d "$LOCAL_BIN_PATH" > /dev/null 2>&1
fi

# --- Install Development Packages needed for Neovim ---
DEV_FILE="$PANAMA_PATH/setup/packages/development-packages"
if [[ -f "$DEV_FILE" ]]; then
	DEV_PACKAGES=$(tr "\n" " " <"$DEV_FILE")
	log "Installing Development Packages. Mostly for Neovim."
  echo -e "Includes the following packages:"
  echo -e "$(<"$DEV_FILE")"
  sudo dnf install -y $DEV_PACKAGES > /dev/null 2>&1
	log "Development packages installed!"
else
	log "Package list was not in specified path: $DEV_FILE"
fi

# --- Install the Hyprland desktop ---
# Most of these live in the lionheartp/Hyprland COPR rather than Fedora proper.
HYPR_FILE="$PANAMA_PATH/setup/packages/hyprland-packages"
if [[ -f "$HYPR_FILE" ]]; then
	log "Enabling Hyprland COPR"
	sudo dnf copr enable -y lionheartp/Hyprland > /dev/null 2>&1
	HYPR_PACKAGES=$(tr "\n" " " <"$HYPR_FILE")
	log "Installing Hyprland desktop packages"
	echo -e "Includes the following packages:"
	echo -e "$(<"$HYPR_FILE")"
	sudo dnf install -y --setopt=install_weak_deps=False $HYPR_PACKAGES > /dev/null 2>&1
	log "Hyprland packages installed!"
else
	log "Package list was not in specified path: $HYPR_FILE"
fi

# --- Install Bun ---
if [[ -x "$HOME/.bun/bin/bun" ]]; then
  log "Bun already installed at \"$HOME/.bun/bin/bun\""
else
  log "Installing Bun via curl..."
  curl -fsSL https://bun.sh/install | bash > /dev/null 2>&1
fi
