#!/bin/bash

# Include external support functions
. /usr/share/dosis2/bin/shell-support-functions

enforce_root

# Logging function
log() {
  local msg="$1"
  local level="$2"
  echo "$(date '+%Y-%m-%d %H:%M:%S') [$level] $msg"
}

# Ensure a registration code is provided
if [ -z "$1" ]; then
  log "Error: No registration code provided. Usage: $0 <REG_CODE>" "ERROR"
  exit 1
fi

REG_CODE=$1

# Function to add 32-bit architecture
add_32bit_architecture() {
  log "Adding 32-bit architecture..." "INFO"
  if dpkg --add-architecture i386; then
    log "Successfully added 32-bit architecture." "INFO"
  else
    log "Error: Failed to add 32-bit architecture." "ERROR"
    exit 1
  fi
}

# Function to update package list
update_package_list() {
  log "Updating package list..." "INFO"
  if apt update > /dev/null 2>&1; then
    log "Package list updated." "INFO"
  else
    log "Error: Failed to update package list." "ERROR"
    exit 1
  fi
}

# Function to install required libraries
install_libraries() {
  log "Installing required 32-bit libraries..." "INFO"
  if apt install -y libc6:i386 libncurses5:i386 libstdc++6:i386 > /dev/null 2>&1; then
    log "Installed the following packages:\n - libc6:i386\n - libncurses5:i386\n - libstdc++6:i386" "INFO"
  else
    log "Error: Failed to install required libraries." "ERROR"
    exit 1
  fi
}

# Function to add user 'rss'
add_user() {
  log "Checking if user 'rss' exists..." "INFO"
  if id -u rss >/dev/null 2>&1; then
    log "User 'rss' already exists. Skipping creation." "INFO"
  else
    log "Adding new user 'rss'..." "INFO"
    if /usr/sbin/useradd -s /bin/bash -m rss; then
      log "User 'rss' added successfully." "INFO"
    else
      log "Error: Failed to add user 'rss'." "ERROR"
      exit 1
    fi
  fi
}

# Function to set password for 'rss'
set_password() {
  log "Setting password for user 'rss'..." "INFO"
  if echo 'rss:XQ^rG9yuDoQ$hK' | chpasswd; then
    log "Password set for user 'rss'." "INFO"
  else
    log "Error: Failed to set password for user 'rss'." "ERROR"
    exit 1
  fi
}

# Function to download required files
download_files() {
  log "Downloading required files..." "INFO"
  if wget -q -O /home/rss/rssclient.tar.gz https://manchac.s3.us-east-2.amazonaws.com/shares/rssclient.tar.gz && wget -q -O /home/rss/rssjava.tar.gz  https://manchac.s3.us-east-2.amazonaws.com/shares/rssjava.tar.gz; then
    log "Files downloaded successfully." "INFO"
  else
    log "Error: Failed to download files." "ERROR"
    exit 1
  fi
}

# Function to extract files
extract_files() {
  log "Extracting files..." "INFO"
  if gunzip -c /home/rss/rssclient.tar.gz | tar xvf - -C /home/rss && gunzip -c /home/rss/rssjava.tar.gz | tar xvf - -C /home/rss; then
    log "Files extracted successfully." "INFO"
  else
    log "Error: Failed to extract files." "ERROR"
    exit 1
  fi
}

# Function to create auto_install.properties file
create_properties_file() {
  log "Creating auto_install.properties file..." "INFO"
  if echo "autoRegCode=$REG_CODE" > /home/rss/slink/bin/auto_install.properties; then
    log "auto_install.properties file created successfully." "INFO"
  else
    log "Error: Failed to create auto_install.properties file." "ERROR"
    exit 1
  fi
}

# Function to change ownership
change_ownership() {
  log "Changing ownership of /home/rss/slink..." "INFO"
  if chown -R rss:rss /home/rss/slink; then
    log "Ownership changed successfully." "INFO"
  else
    log "Error: Failed to change ownership." "ERROR"
    exit 1
  fi
}

# Function to install slinksc.ubuntu service
install_service() {
  log "Installing slinksc.ubuntu service..." "INFO"
  if install -pm 755 -o root -g root /home/rss/slink/slinksc.ubuntu /etc/init.d/slinksc.ubuntu && /usr/sbin/update-rc.d slinksc.ubuntu defaults; then
    log "Service slinksc.ubuntu installed successfully." "INFO"
  else
    log "Error: Failed to install slinksc.ubuntu service." "ERROR"
    exit 1
  fi
}

# Function to start slinksc.ubuntu service
start_service() {
  log "Starting slinksc.ubuntu service..." "INFO"
  if /etc/init.d/slinksc.ubuntu start; then
    log "Service slinksc.ubuntu started successfully." "INFO"
  else
    log "Error: Failed to start slinksc.ubuntu service." "ERROR"
    exit 1
  fi
}

# Main script execution
add_32bit_architecture
update_package_list
install_libraries
add_user
set_password
download_files
extract_files
create_properties_file
change_ownership
install_service
start_service

log "Script completed successfully." "INFO"