#!/bin/bash

# Log file path
LOG_FILE="/var/log/px-install.log"

# Redirect all command outputs to the log file, but not echo statements
exec > >(tee -a "$LOG_FILE") 2>/dev/null
echo "INSTALLATION HAS BEGUN @ $(date)"
PX_USER=px_user
PX_USER_HOME=/home/$PX_USER
ROOT_PATH=$PX_USER_HOME/proxidize-manager
VENV_PATH=$ROOT_PATH/venv
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
ECR_URL="public.ecr.aws/k1h7j3d6"
BUCKET_URL="https://proxidize-manager-binaries.s3.amazonaws.com"
VERSION="latest"
DEVICE_LOCAL_IP=$(ip route get 1.2.3.4 2>/dev/null | awk '{print $7}' | tr -d '\n')
OS_VERSION=$(lsb_release -r | awk '{print $2}')
DISALLOWED_HOSTNAMES="proxidize-box|tx6|alx2|alx4|alx-2-0-microserver|arm64|arm-64"

# CHECK IF DEVICE HOSTNAME IS DISALLOWED
if hostname | grep -iE "$DISALLOWED_HOSTNAMES" >/dev/null; then
  echo "UNSUPPORTED DEVICE."
  exit 1
fi

if [ $# -gt 0 ]; then
  VERSION=$1
fi

# Check if running as root
if [ "$(id -u)" -ne 0 ]; then
  echo "The installation script must be run as root" >&2
  exit 1
fi

# Check if unsupported OS
if [[ "$(lsb_release -is 2>/dev/null)" == "Debian" ]] && [[ "$(lsb_release -rs 2>/dev/null)" == "11" ]]; then
  echo "UNSUPPORTED OS. EXITING" >&2
  exit 0
fi

# Cd into /home/
cd /home/

# Create a user called px_user and add them to sudoers
if ! id "$PX_USER" &>/dev/null; then
  echo "Creating user $PX_USER..."
  useradd -m -s /bin/bash $PX_USER
  echo "$PX_USER ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers
fi

# Check if the user is in the systemd-journal group, add if not
if ! id -nG "$PX_USER" | grep -qw "systemd-journal"; then
  echo "Adding $PX_USER to systemd-journal group..."
  usermod -aG systemd-journal "$PX_USER"
fi

if [ "$OS_VERSION" == "20.04" ]; then
  apt update >>$LOG_FILE 2>&1
  apt install -y systemd-container >>$LOG_FILE 2>&1
fi

sudo loginctl enable-linger $PX_USER

echo "UPDATING PACKAGE LIST..."
apt -y update >>$LOG_FILE 2>&1

echo "INSTALLING SYSTEM DEPENDENCIES..."
apt install -y curl >>$LOG_FILE 2>&1

echo "Installing storage layer..." >>$LOG_FILE 2>&1
apt install -y fuse-overlayfs >>$LOG_FILE 2>&1

echo "Installing uidmap..." >>$LOG_FILE 2>&1
apt-get install -y uidmap >>$LOG_FILE 2>&1

if ! apt-cache search podman | grep "podman" >>$LOG_FILE 2>&1; then
  # Function to extract the missing key from the error message
  extract_key() {
    error_message=$1
    echo "$error_message" | grep -oP '(?<=NO_PUBKEY\s)[A-F0-9]{16}' | head -n 1
  }
  echo "Podman not found in the default repositories. Adding the backports repository..."
  sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
  echo "Updating package list after adding backports repository..."
  error_output=$(sudo apt-get update 2>&1)
  key=$(extract_key "$error_output" | awk "{print $1}")
  # Check if the key was found
  if [ -n "$key" ]; then
    echo "Missing GPG key found: $key"
    # Add the missing GPG key
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys "$key" >>$LOG_FILE 2>&1
    apt update >>$LOG_FILE 2>&1
    apt install -y podman >>$LOG_FILE 2>&1

  fi

fi

echo "Instaling container runtime..." >>$LOG_FILE 2>&1
apt install -y podman >>$LOG_FILE 2>&1

echo "Instaling container manager..." >>$LOG_FILE 2>&1
apt install -y podman-compose >>$LOG_FILE 2>&1

echo "Installing python3..." >>$LOG_FILE 2>&1
apt install -y python3 python3-pip python3-venv >>$LOG_FILE 2>&1

echo "Instaling reverse proxy..." >>$LOG_FILE 2>&1
apt install -y nginx >>$LOG_FILE 2>&1

echo "Instaling vpn..." >>$LOG_FILE 2>&1
apt install -y wireguard >>$LOG_FILE 2>&1

echo "Installing dns server" >>$LOG_FILE 2>&1
apt install -y resolvconf >>$LOG_FILE 2>&1

echo "nameserver 8.8.8.8" >/etc/resolvconf/resolv.conf.d/head
resolvconf -u >>$LOG_FILE 2>&1

# Remove old PX installation
echo "UNINSTALLING OLD INSTALLATION..."
curl -fsSL pxfile.com/uninstall | bash >>$LOG_FILE 2>&1

# Create working directory
mkdir -p $ROOT_PATH
chown $PX_USER:$PX_USER $ROOT_PATH

# Check if the virtual environment exists
if [ ! -d "$VENV_PATH" ]; then
  echo "CREATING ENVIRONMENT..."
  DEB_PYTHON_INSTALL_LAYOUT='deb'
  sudo -u $PX_USER python3 -m venv $VENV_PATH >>$LOG_FILE 2>&1
fi

# Activate the virtual environment
source $VENV_PATH/bin/activate >>$LOG_FILE 2>&1

pip install podman-compose==1.0.6 >>$LOG_FILE 2>&1

containers_cfg="[containers]
log_size_max=1048576
"

containers_storage_cfg="[storage]
driver=\"overlay\"
[storage.options.overlay]
mount_program=\"/usr/bin/fuse-overlayfs\"
"

compose_env="COMPOSE_PROJECT_DIR=/home/px_user/proxidize-manager
COMPOSE_FILE=/home/px_user/proxidize-manager/compose.yaml
COMPOSE_PATH_SEPARATOR=:
COMPOSE_PROJECT_NAME=proxidize-manager
"

sudo -u $PX_USER mkdir -p $PX_USER_HOME/.config/containers/
sudo -u $PX_USER mkdir -p $PX_USER_HOME/.config/containers/compose/projects/
sudo -u $PX_USER mkdir -p $PX_USER_HOME/.config/systemd/user/default.target.wants

sudo -u $PX_USER echo "$containers_cfg" >$PX_USER_HOME/.config/containers/containers.conf
sudo -u $PX_USER echo "$containers_storage_cfg" >$PX_USER_HOME/.config/containers/storage.conf
sudo -u $PX_USER echo "$compose_env" >$PX_USER_HOME/.config/containers/compose/projects/proxidize-manager.env
sudo chown -R $PX_USER:$PX_USER $PX_USER_HOME

echo "INSTALLING PROXIDIZE. VERSION: $VERSION."
sudo -u $PX_USER podman pull $ECR_URL/proxidize-manager:$VERSION-$ARCH >>$LOG_FILE 2>&1
sudo -u $PX_USER podman pull $ECR_URL/proxidize-db:$VERSION-$ARCH >>$LOG_FILE 2>&1
sudo -u $PX_USER podman pull $ECR_URL/proxidize-cache:$VERSION-$ARCH >>$LOG_FILE 2>&1
sudo -u $PX_USER podman pull $ECR_URL/proxidize-pools:$VERSION-$ARCH >>$LOG_FILE 2>&1

sudo -u $PX_USER podman tag $ECR_URL/proxidize-manager:$VERSION-$ARCH $ECR_URL/proxidize-manager:live >>$LOG_FILE 2>&1
sudo -u $PX_USER podman tag $ECR_URL/proxidize-db:$VERSION-$ARCH $ECR_URL/proxidize-db:live >>$LOG_FILE 2>&1
sudo -u $PX_USER podman tag $ECR_URL/proxidize-cache:$VERSION-$ARCH $ECR_URL/proxidize-cache:live >>$LOG_FILE 2>&1
sudo -u $PX_USER podman tag $ECR_URL/proxidize-pools:$VERSION-$ARCH $ECR_URL/proxidize-pools:live >>$LOG_FILE 2>&1

systemctl daemon-reload
systemctl stop proxidize-outpost.service

echo "INSTALLING PROXIDIZE DEPENDENCIES..."
curl $BUCKET_URL/$VERSION-$ARCH/proxidize-outpost -s -o /usr/bin/proxidize >>$LOG_FILE 2>&1
chmod 711 /usr/bin/proxidize
proxidize completion bash >/etc/bash_completion.d/proxidize
sudo proxidize write-config -o >>$LOG_FILE 2>&1
sudo -u $PX_USER proxidize merge-config >>$LOG_FILE 2>&1
cp /etc/systemd/user/podman-compose@.service $PX_USER_HOME/.config/systemd/user/default.target.wants >>$LOG_FILE 2>&1
chown -R $PX_USER:$PX_USER $PX_USER_HOME/.config/systemd/user/default.target.wants

echo "INSTALLING LOCAL APP..."
mkdir -p /var/www/frontend
curl $BUCKET_URL/latest/frontend.zip -s -o /tmp/frontend.zip >>$LOG_FILE 2>&1
unzip -o /tmp/frontend.zip -d /var/www/frontend >>$LOG_FILE 2>&1
chown -R www-data:www-data /var/www/frontend
rm /tmp/frontend.zip

sudo -u $PX_USER curl $BUCKET_URL/$ARCH/rs -s -o $ROOT_PATH/rs >>$LOG_FILE 2>&1
chmod +x $ROOT_PATH/rs

systemctl daemon-reload
systemctl enable --now proxidize-outpost.service

systemctl enable --now nginx
nginx -s reload

echo "CREATING NECESSARY DIRECTORIES..."
sudo -u $PX_USER mkdir -p $ROOT_PATH/logs
chmod -R 777 $ROOT_PATH/logs
sudo -u $PX_USER mkdir -p $ROOT_PATH/proxies
chmod -R 777 $ROOT_PATH/proxies
sudo -u $PX_USER mkdir -p $ROOT_PATH/media
chmod -R 777 $ROOT_PATH/media

/usr/bin/proxidize run-server -u

# Disabling ssh via root
SSHD_CONFIG="/etc/ssh/sshd_config"

CHECK_ROOT_SSH() {
  grep -E "^PermitRootLogin\s+yes" $SSHD_CONFIG
}

DISABLE_ROOT_SSH() {
  echo "Disabling root SSH login..."
  sed -i 's/^PermitRootLogin\s\+yes/PermitRootLogin no/' $SSHD_CONFIG

  # Check if 'PermitRootLogin' was not present, and append the directive
  if ! grep -q "^PermitRootLogin" $SSHD_CONFIG; then
    echo "PermitRootLogin no" >>$SSHD_CONFIG
  fi

  systemctl restart sshd >>$LOG_FILE 2>&1

}

apt install -y dhcpcd5 >>$LOG_FILE 2>&1
dhcpcd -n >>$LOG_FILE 2>&1

if CHECK_ROOT_SSH; then
  DISABLE_ROOT_SSH
fi

echo "STARTING UP SERVICES..."
while true; do
  if curl -s -m 5 "localhost:65000/accounts/api/eula/" >/dev/null; then
    break
  fi
done
echo "INSTALLATION COMPLETE @ $(date)"
echo "YOUR DEVICE LOCAL IP IS: $DEVICE_LOCAL_IP, PLEASE OPEN YOUR BROWSER AND ACCESS THE IP TO START THE ONBOARDING PROCESS."

exit 0