#!/usr/bin/env bash

DEST=${1:-/etc/skel}
GHOSTTY_HOME=${DEST}/.config/ghostty
ALIASES_D="${DEST}/.zsh_aliases.d"
ALIAS_FILE="${ALIASES_D}/003_ghostty.zsh"

sudo apt update
sudo apt install ghostty

# https://ghostty.org/docs/config/reference

mkdir -p "${GHOSTTY_HOME}"

# https://gist.githubusercontent.com/adibhanna/c552c452fb244b3b721e3c2432e85cde/raw/a7540b1bfe1d653df303ed2aecf943bc15515752/config
# https://www.youtube.com/watch?v=jWuQxU4bDeU&t=7s
conf_print_ghostty_config() {
  cat <<EOF
font-family = BerkeleyMono Nerd Font
#font-family = Iosevka Nerd Font
# font-family = SFMono Nerd Font 
font-size = 20
theme = GruvboxDarkHard
shell-integration-features = no-cursor,sudo,no-title
cursor-style = block
adjust-cell-height = 35%
# background-opacity = 0.96

mouse-hide-while-typing = true
mouse-scroll-multiplier = 2

window-padding-balance = true 
window-save-state = always
macos-titlebar-style=transparent
window-colorspace = "display-p3"
background = 1C2021
# foreground = d4be98

# keybindings
keybind = cmd+s>r=reload_config
keybind = cmd+s>x=close_surface

keybind = cmd+s>n=new_window

# tabs 
keybind = cmd+s>c=new_tab
keybind = cmd+s>shift+l=next_tab
keybind = cmd+s>shift+h=previous_tab
keybind = cmd+s>comma=move_tab:-1
keybind = cmd+s>period=move_tab:1

# quick tab switch
keybind = cmd+s>1=goto_tab:1
keybind = cmd+s>2=goto_tab:2
keybind = cmd+s>3=goto_tab:3
keybind = cmd+s>4=goto_tab:4
keybind = cmd+s>5=goto_tab:5
keybind = cmd+s>6=goto_tab:6
keybind = cmd+s>7=goto_tab:7
keybind = cmd+s>8=goto_tab:8
keybind = cmd+s>9=goto_tab:9

# split
keybind = cmd+s>\=new_split:right
keybind = cmd+s>-=new_split:down

keybind = cmd+s>j=goto_split:bottom
keybind = cmd+s>k=goto_split:top
keybind = cmd+s>h=goto_split:left
keybind = cmd+s>l=goto_split:right

keybind = cmd+s>z=toggle_split_zoom

keybind = cmd+s>e=equalize_splits

# other
copy-on-select = clipboard
EOF
}
conf_print_ghostty_config | tee "${GHOSTTY_HOME}/config.yaml"

# OpenGL detection → decide if we force software rendering
# Necessary is opengl is <=3.2
should_use_software() {
  local es_version=""

  # local gl_version=""
  #  if command -v glxinfo >/dev/null 2>&1; then
  #    gl_version=$(glxinfo | grep -i "OpenGL version string" | head -n 1 | awk -F: '{print $2}')
  #    if [[ "$gl_version" =~ ^([4-9]\.|3\.[3-9]) ]]; then
  #      return 1 # hardware ok
  #    fi
  #  fi
  local max_core
  max_core=$(glxinfo -B 2>/dev/null | grep "Max core profile" | awk '{print $5}')
  printf "max_core:  %s\n" "${max_core}"
  if [[ "$max_core" =~ ^([4-9]\.|3\.[3-9]) ]]; then
    return 1 # Hardware supports OpenGL 3.2+
  fi

  if command -v eglinfo >/dev/null 2>&1; then
    es_version=$(eglinfo -B 2>/dev/null | grep -i "OpenGL ES profile version" | head -n 1 | grep -oE '[0-9]+\.[0-9]+' || true)
    printf "es_version  %s\n" "${es_version}"
    if [[ "$es_version" =~ ^[3-9]\. ]]; then
      return 1 # GLES 3+ usually good enough
    fi
  fi

  return 0 # force software
}

conf_print_ghostty_desktop() {
  cat <<EOF
[Desktop Entry]
Version=1.0
Name=Ghostty
Type=Application
Comment=A terminal emulator
TryExec=/usr/bin/ghostty
Exec=env LIBGL_ALWAYS_SOFTWARE=1 /usr/bin/ghostty --gtk-single-instance=true
Icon=com.mitchellh.ghostty
Categories=System;TerminalEmulator;
Keywords=terminal;tty;pty;
StartupNotify=true
StartupWMClass=com.mitchellh.ghostty
Terminal=false
Actions=new-window;
X-GNOME-UsesNotifications=true
X-TerminalArgExec=-e
X-TerminalArgTitle=--title=
X-TerminalArgAppId=--class=
X-TerminalArgDir=--working-directory=
X-TerminalArgHold=--wait-after-command
DBusActivatable=true
X-KDE-Shortcuts=Ctrl+Alt+T

[Desktop Action new-window]
Name=New Window
Exec=env LIBGL_ALWAYS_SOFTWARE=1 /usr/bin/ghostty --gtk-single-instance=true

[Desktop Action preferences]
Name=Preferences
Exec=env LIBGL_ALWAYS_SOFTWARE=1 /usr/bin/ghostty +edit-config --gtk-single-instance=true --preferences
EOF
}

conf_print_ghostty_alias_hw() {
  cat <<'EOF' | tee "${ALIAS_FILE}" >/dev/null
# kitty → hardware rendering (OpenGL ≥3.3 detected)
alias ghostty="ghostty"
EOF
}

conf_print_ghostty_alias_sw() {
  cat <<'EOF' | tee "${ALIAS_FILE}" >/dev/null
# ghostty → software rendering (old/weak OpenGL)
alias ghostty="LIBGL_ALWAYS_SOFTWARE=1 ghostty"
EOF
}

# We now use the adapted desktop file
conf_print_ghostty_wrapper() {
  mkdir -p /usr/local/bin/
  cat >/usr/local/bin/ghostty-wrapper <<'EOF'
#!/bin/sh
export LIBGL_ALWAYS_SOFTWARE=1
exec /usr/bin/ghostty "$@"
EOF
}
#  conf_print_ghostty_wrapper
#  sudo chmod +x "/usr/local/bin/ghostty-wrapper"

if should_use_software; then
  conf_print_ghostty_alias_sw
  echo "# Forced software rendering due to insufficient OpenGL support" | tee -a "${ALIAS_FILE}" >/dev/null

  # For xfce4 that ignores user aliases
  conf_print_ghostty_desktop | tee "${DEST}/.local/share/applications/com.mitchellh.ghostty.desktop" >/dev/null
  update-desktop-database "${DEST}/.local/share/applications"

  # Add to alternatives and select default
  #sudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator /usr/local/bin/ghostty-wrapper 60
  sudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator /usr/bin/ghostty 60
  sudo update-alternatives --config x-terminal-emulator

else
  conf_print_ghostty_alias_hw

  echo "# Using hardware rendering" | tee -a "${ALIAS_FILE}" >/dev/null
  sudo update-alternatives --config x-terminal-emulator
fi

ghostty +validate-config
