#!/bin/bash
set -e
# This script configures X11 forwarding for Linux and macOS systems.
# It installs X11, Openbox (on Linux), and checks for XQuartz (on macOS).
# It also updates the sshd_config file to enable X11Forwarding and restarts the SSH service.

# Check if the script is running with root privileges
if [ "$EUID" -ne 0 ]; then
  echo "Error: This script requires root privileges. Please run it as a superuser"
  exit 1
fi

# Function to restart SSH service (Linux)
restart_ssh_linux() {
  if command -v service >/dev/null 2>&1; then
    sudo service ssh restart
  else
    sudo systemctl restart ssh
  fi
}

# Function to restart SSH service (macOS)
restart_ssh_macos() {
  launchctl stop com.openssh.sshd
  launchctl start com.openssh.sshd
}

update_x11_forwarding() {
  if grep -q "X11Forwarding yes" /etc/ssh/sshd_config; then
    echo "X11Forwarding is already set to 'yes' in ssh_config."
  else
    if [[ "$OSTYPE" == "linux-gnu" ]]; then
      # Linux: Use sed for Linux
      sudo sed -i 's/#\?X11Forwarding.*/X11Forwarding yes/' /etc/ssh/sshd_config
    elif [[ "$OSTYPE" == "darwin"* ]]; then
      # macOS: Use sed for macOS
      sudo sed -i -E 's/#X11Forwarding.*/X11Forwarding yes/' /etc/ssh/sshd_config
      restart_ssh_macos
    fi
    if [[ "$OSTYPE" == "linux-gnu" ]]; then
      restart_ssh_linux
    fi
  fi
}

# Determine the operating system
if [[ "$OSTYPE" == "linux-gnu" ]]; then
  # Linux
  if command -v startx >/dev/null 2>&1; then
    echo "X11 is already installed."
  else
    # Check which package manager is available
    if command -v apt-get >/dev/null 2>&1; then
      install_command="sudo apt-get update && sudo apt-get install xorg openbox"
    elif command -v dnf >/dev/null 2>&1; then
      install_command="sudo dnf install xorg-x11-server-Xorg openbox"
    else
      echo "Error: Unable to determine the package manager. Manual installation required."
      exit 1
    fi
  fi
  # Check if the installation command is defined
  if [ -n "$install_command" ]; then
    # Execute the installation command
    if $install_command; then
      echo "X11 and Openbox have been successfully installed."
    else
      echo "Error: Failed to install X11 and Openbox."
      exit 1
    fi
  else
    echo "Error: Unsupported package manager."
    exit 1
  fi

  # Call the function to update X11Forwarding
  update_x11_forwarding

  # Get the IP address of the host dynamically
  host_ip=$(hostname -I | awk '{print $1}')
  xhost + "$host_ip" && xhost + local:
  # Set the DISPLAY variable to the host IP
  export DISPLAY="$host_ip:0.0"
  echo "DISPLAY variable set to $DISPLAY"

elif [[ "$OSTYPE" == "darwin"* ]]; then
  # macOS
  if command -v xquartz >/dev/null 2>&1; then
    echo "XQuartz is already installed."
  else
    echo "Error: XQuartz is required for X11 forwarding on macOS. Please install XQuartz manually."
    exit 1
  fi

  # Call the function to update X11Forwarding
  update_x11_forwarding

  # Export the DISPLAY variable for macOS
  export DISPLAY=:0
  echo "DISPLAY variable set to $DISPLAY"
else
  echo "Error: Unsupported operating system."
  exit 1
fi