#!/usr/bin/env bash
# ----------------------------------------------------------------------------
# Replicate my GNOME setup on a fresh Fedora 43+ install.
#
#   - Dash to Panel (with my exact panel layout, sizing, transparency, colors)
#   - ArcMenu (Fedora-logo button, Super_L hotkey)
#   - Tiling Shell (custom 5-tile layout, gaps, Super-arrow keybinds)
#   - Dark mode (Adwaita-dark + prefer-dark color scheme)
#
# Usage on the target machine (inside a GNOME session):
#
#     curl -fsSL https://gist.githubusercontent.com/<USER>/<ID>/raw/setup-gnome-fedora.sh -o setup.sh
#     less setup.sh           # always inspect a script before piping it to bash
#     bash setup.sh
#
# Or in one shot (skip the inspection step at your own peril):
#
#     curl -fsSL https://gist.githubusercontent.com/<USER>/<ID>/raw/setup-gnome-fedora.sh | bash
#
# After the script finishes, log out and back in. The extensions need a fresh
# shell to load. Idempotent — safe to re-run.
#
# Requires: Fedora 43+ with GNOME, internet, sudo.
# ----------------------------------------------------------------------------

set -euo pipefail

log()  { printf '\033[1;34m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m!! \033[0m %s\n' "$*"; }
die()  { printf '\033[1;31mxx \033[0m %s\n' "$*" >&2; exit 1; }

command -v gnome-shell >/dev/null || die "gnome-shell not found. This script targets GNOME."
[[ -r /etc/fedora-release ]] || warn "Not Fedora? Some steps (dnf-automatic) may fail."

WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT

# ----- Embedded dconf snapshots ---------------------------------------------

cat > "$WORK/dash-to-panel.dconf" <<'DCONF_D2P'
[/]
animate-appicon-hover-animation-extent={'RIPPLE': 4, 'PLANK': 4, 'SIMPLE': 1}
appicon-margin=4
appicon-padding=4
appicon-style='NORMAL'
dot-position='BOTTOM'
extension-version=73
global-border-radius=4
hotkeys-overlay-combo='TEMPORARILY'
isolate-workspaces=false
leftbox-padding=-1
panel-anchors='{"__MONITOR_ID__":"MIDDLE"}'
panel-element-positions='{"__MONITOR_ID__":[{"element":"showAppsButton","visible":false,"position":"stackedTL"},{"element":"leftBox","visible":true,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"stackedTL"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"activitiesButton","visible":true,"position":"stackedTL"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":false,"position":"stackedBR"}]}'
panel-lengths='{"__MONITOR_ID__":100}'
panel-positions='{}'
panel-side-margins=4
panel-side-padding=2
panel-sizes='{"__MONITOR_ID__":42}'
panel-top-bottom-margins=4
panel-top-bottom-padding=2
prefs-opened=false
show-activities-button=true
show-apps-icon-file=''
show-favorites=true
show-favorites-all-monitors=true
show-running-apps=true
status-icon-padding=0
trans-bg-color='#13111c'
trans-gradient-bottom-color='#986a44'
trans-gradient-top-color='#f6d32d'
trans-gradient-top-opacity=0.14999999999999999
trans-panel-opacity=0.75
trans-use-border=false
trans-use-custom-bg=true
trans-use-custom-gradient=false
trans-use-custom-opacity=true
trans-use-dynamic-opacity=false
tray-padding=4
tray-size=0
window-preview-title-position='TOP'
DCONF_D2P

cat > "$WORK/arcmenu.dconf" <<'DCONF_ARC'
[/]
arcmenu-hotkey=['Super_L']
arcmenu-hotkey-overlay-key-enabled=true
hide-overview-on-startup=true
hotkey-open-primary-monitor=false
menu-button-icon='fedora-logo-sprite'
menu-button-icon-size=27
prefs-visible-page=0
recently-installed-apps=['calf.desktop']
search-entry-border-radius=(true, 25)
update-notifier-project-version=71
DCONF_ARC

cat > "$WORK/tilingshell.dconf" <<'DCONF_TS'
[/]
edge-tiling-mode='default'
inner-gaps=uint32 8
last-version-name-installed='17.3'
layouts-json='[{"id":"Layout 1","tiles":[{"x":0,"y":0,"width":0.22,"height":0.5,"groups":[1,2]},{"x":0,"y":0.5,"width":0.22,"height":0.5,"groups":[1,2]},{"x":0.22,"y":0,"width":0.56,"height":1,"groups":[2,3]},{"x":0.78,"y":0,"width":0.22,"height":0.5,"groups":[3,4]},{"x":0.78,"y":0.5,"width":0.22,"height":0.5,"groups":[3,4]}]},{"id":"Layout 2","tiles":[{"x":0,"y":0,"width":0.22,"height":1,"groups":[1]},{"x":0.22,"y":0,"width":0.56,"height":1,"groups":[1,2]},{"x":0.78,"y":0,"width":0.22,"height":1,"groups":[2]}]},{"id":"Layout 3","tiles":[{"x":0,"y":0,"width":0.33,"height":1,"groups":[1]},{"x":0.33,"y":0,"width":0.67,"height":1,"groups":[1]}]},{"id":"Layout 4","tiles":[{"x":0,"y":0,"width":0.67,"height":1,"groups":[1]},{"x":0.67,"y":0,"width":0.33,"height":1,"groups":[1]}]},{"id":"47940062","tiles":[{"x":0,"y":0,"width":0.3327991452991453,"height":1,"groups":[1]},{"x":0.3327991452991453,"y":0,"width":0.3344017094017094,"height":1,"groups":[2,1]},{"x":0.6672008547008547,"y":0,"width":0.3327991452991453,"height":1,"groups":[2]}]}]'
outer-gaps=uint32 4
overridden-settings="{\"org.gnome.mutter.keybindings\":{\"toggle-tiled-right\":\"['<Super>Right']\",\"toggle-tiled-left\":\"['<Super>Left']\"},\"org.gnome.desktop.wm.keybindings\":{\"maximize\":\"['<Super>Up']\",\"unmaximize\":\"['<Super>Down', '<Alt>F5']\"},\"org.gnome.mutter\":{\"edge-tiling\":\"true\"}}"
selected-layouts=[['Layout 4'], ['Layout 4']]
window-use-custom-border-color=false
DCONF_TS

# ----- 1. Prerequisites -----------------------------------------------------

log "Installing pipx + gnome-extensions-cli"
sudo dnf install -y pipx >/dev/null
pipx install --quiet --force gnome-extensions-cli --system-site-packages >/dev/null
export PATH="$HOME/.local/bin:$PATH"
command -v gext >/dev/null || die "gext not on PATH after pipx install."

# ----- 2. Install extensions ------------------------------------------------

# IDs from extensions.gnome.org URL slugs:
#   1160 = Dash to Panel
#   3628 = ArcMenu
#   7065 = Tiling Shell
EXT_IDS=(1160 3628 7065)
EXT_UUIDS=(
  "dash-to-panel@jderose9.github.com"
  "arcmenu@arcmenu.com"
  "tilingshell@ferrarodomenico.com"
)

for id in "${EXT_IDS[@]}"; do
  log "Installing extension $id"
  gext install "$id" || warn "gext install $id returned non-zero (may already be installed)."
done

# ----- 3. Detect target monitor ID ------------------------------------------

# Dash to Panel keys some settings to "<vendor>-<serial>" reported by Mutter.
detect_monitor_id() {
  busctl --user --json=short call \
    org.gnome.Mutter.DisplayConfig \
    /org/gnome/Mutter/DisplayConfig \
    org.gnome.Mutter.DisplayConfig \
    GetCurrentState 2>/dev/null \
  | python3 -c '
import sys, json
d = json.load(sys.stdin)
mons = d["data"][1]
if not mons:
    sys.exit(1)
_, vendor, _, serial = mons[0][0]
print(f"{vendor}-{serial}")
' 2>/dev/null
}

MONITOR_ID="$(detect_monitor_id || true)"
if [[ -z "${MONITOR_ID}" ]]; then
  warn "Could not detect monitor ID via Mutter DBus."
  warn "Dash to Panel will fall back to defaults — open its prefs to re-anchor."
  MONITOR_ID="UNKNOWN-0x0"
else
  log "Detected monitor ID: $MONITOR_ID"
fi

sed -i "s/__MONITOR_ID__/${MONITOR_ID}/g" "$WORK/dash-to-panel.dconf"

# ----- 4. Apply dconf settings ----------------------------------------------

log "Loading Dash to Panel settings"
dconf load /org/gnome/shell/extensions/dash-to-panel/ < "$WORK/dash-to-panel.dconf"

log "Loading ArcMenu settings"
dconf load /org/gnome/shell/extensions/arcmenu/ < "$WORK/arcmenu.dconf"

log "Loading Tiling Shell settings"
dconf load /org/gnome/shell/extensions/tilingshell/ < "$WORK/tilingshell.dconf"

# ----- 5. Enable extensions -------------------------------------------------

for uuid in "${EXT_UUIDS[@]}"; do
  log "Enabling $uuid"
  gnome-extensions enable "$uuid" \
    || warn "Couldn't enable $uuid yet — log out/in and re-run."
done

# ----- 6. Dark mode ---------------------------------------------------------

log "Enabling dark mode"
gsettings set org.gnome.desktop.interface gtk-theme    'Adwaita-dark'
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'

# ----- 7. Wallpaper ---------------------------------------------------------

log "Setting wallpaper"
gsettings set org.gnome.desktop.background picture-uri      'file:///usr/share/backgrounds/gnome/amber-l.jxl'
gsettings set org.gnome.desktop.background picture-uri-dark 'file:///usr/share/backgrounds/gnome/amber-d.jxl'
gsettings set org.gnome.desktop.background picture-options  'zoom'

# ----- Done -----------------------------------------------------------------

echo "Done."
