#!/bin/bash

# Logger Function
log() {
  local message="$1"
  local type="$2"
  local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  local color
  local endcolor="\033[0m"

  case "$type" in
    "info") color="\033[38;5;79m" ;;
    "success") color="\033[1;32m" ;;
    "error") color="\033[1;31m" ;;
    *) color="\033[1;34m" ;;
  esac

  echo -e "${color}${timestamp} - ${message}${endcolor}"
}

# Error handler function
handle_error() {
  local exit_code=$1
  local error_message="$2"
  log "Error: $error_message (Exit Code: $exit_code)" "error"
  exit $exit_code
}

# Function to check for command availability
command_exists() {
  command -v "$1" &> /dev/null
}

# Check if we are on an RPM-based system
if ! [ -f /etc/redhat-release ] \
   && ! grep -q "Amazon Linux" /etc/system-release 2>/dev/null \
   && ! grep -qi "TencentOS" /etc/system-release 2>/dev/null \
   && ! grep -qi "OpenCloudOS" /etc/system-release 2>/dev/null; then
    handle_error 1 "This script is intended for RPM-based systems. Please run it on an RPM-based system."
fi

log "Cleaning up old repositories..." "info"
rm -f /etc/yum.repos.d/nodesource*.repo
log "Old repositories removed" "info"

# Define Node.js version
NODE_VERSION="24.x"

# Get system architecture
SYS_ARCH=$(uname -m)

# Validate system architecture
case "$SYS_ARCH" in
  aarch64|x86_64) log "Supported architecture: $SYS_ARCH" "info" ;;
  *) handle_error 1 "Unsupported architecture: $SYS_ARCH. Only aarch64 and x86_64 are supported." ;;
esac

# Repository content for Node.js
NODEJS_REPO_CONTENT="[nodesource-nodejs]
name=Node.js Packages for Linux RPM based distros - $SYS_ARCH
baseurl=https://rpm.nodesource.com/pub_${NODE_VERSION}/nodistro/nodejs/$SYS_ARCH
priority=9
enabled=1
gpgcheck=1
gpgkey=https://rpm.nodesource.com/gpgkey/ns-operations-public.key
module_hotfixes=1"

# Write Node.js repository content
echo "$NODEJS_REPO_CONTENT" | tee /etc/yum.repos.d/nodesource-nodejs.repo > /dev/null

# Check if Node.js version is an LTS version
if [[ "$NODE_VERSION" == "20.x" ]] || [[ "$NODE_VERSION" == "22.x" ]] || [[ "$NODE_VERSION" == "24.x" ]]; then
  # Repository content for N|Solid
  NSOLID_REPO_CONTENT="[nodesource-nsolid]
name=N|Solid Packages for Linux RPM based distros - $SYS_ARCH
baseurl=https://rpm.nodesource.com/pub_${NODE_VERSION}/nodistro/nsolid/$SYS_ARCH
priority=9
enabled=1
gpgcheck=1
gpgkey=https://rpm.nodesource.com/gpgkey/ns-operations-public.key
module_hotfixes=1"

  # Write N|Solid repository content
  echo "$NSOLID_REPO_CONTENT" | tee /etc/yum.repos.d/nodesource-nsolid.repo > /dev/null
  log "Added N|Solid repository for LTS version: $NODE_VERSION" "info"
fi

# Check for availability of dnf, yum or microdnf
if command_exists dnf; then
    log "dnf available, updating..." "info"
    dnf makecache --disablerepo="*" --enablerepo="nodesource-nodejs"
    
    # Update N|Solid repository if it's LTS
    if [[ "$NODE_VERSION" == "20.x" ]] || [[ "$NODE_VERSION" == "22.x" ]] || [[ "$NODE_VERSION" == "24.x" ]]; then
        dnf makecache --disablerepo="*" --enablerepo="nodesource-nsolid"
        log "Repository is configured and updated." "info"
        log "You can use N|solid Runtime as a node.js alternative" "info"
        log "To install N|solid Runtime, run: dnf install nsolid -y" "success"
    else
        log "Repository is configured and updated." "info"
    fi
    
    log "Run 'dnf install nodejs -y' to complete the installation." "info"
    exit 0
elif command_exists yum; then
    log "yum available, updating..." "info"
    yum makecache --disablerepo="*" --enablerepo="nodesource-nodejs"

    # Update N|Solid repository if it's LTS
    if [[ "$NODE_VERSION" == "20.x" ]] || [[ "$NODE_VERSION" == "22.x" ]] || [[ "$NODE_VERSION" == "24.x" ]]; then
        yum makecache --disablerepo="*" --enablerepo="nodesource-nsolid"
        log "Repository is configured and updated." "info"
        log "You can use N|solid Runtime as a node.js alternative" "info"
        log "Run 'yum install nsolid -y' to complete the installation." "success"
    else
        log "Repository is configured and updated." "info"
    fi
    
    log "Run 'yum install nodejs -y' to complete the installation." "info"
elif command_exists microdnf; then
    log "microdnf available, updating..." "info"
    microdnf makecache --disablerepo="*" --enablerepo="nodesource-nodejs"

    # Update N|Solid repository if it's LTS
    if [[ "$NODE_VERSION" == "20.x" ]] || [[ "$NODE_VERSION" == "22.x" ]] || [[ "$NODE_VERSION" == "24.x" ]]; then
        microdnf makecache --disablerepo="*" --enablerepo="nodesource-nsolid"
        log "Repository is configured and updated. Run 'microdnf install nsolid -y' to complete the installation." "info"
    else
        log "Repository is configured and updated." "info"
    fi
    
    log "Run 'microdnf install nodejs -y' to complete the installation." "info"
else
    handle_error 1 "Neither yum, dnf nor microdnf package manager was found. Please update your system using your package manager."
fi
