#!/bin/bash

# AirwavePBX Uninstaller with Let's Encrypt Preservation
# This script safely removes AirwavePBX while preserving SSL certificates

set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Print colored output
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# Header
echo "====================================="
echo "AirwavePBX Uninstaller"
echo "====================================="
echo

# Check if running as root
if [[ $EUID -ne 0 ]]; then
   print_error "This script must be run as root"
   exit 1
fi

# Check if AirwavePBX is installed
if [ ! -f "/usr/local/bin/airwavepbx" ] && [ ! -d "/opt/airwavepbx" ]; then
    print_warning "AirwavePBX does not appear to be installed"
    echo "Nothing to uninstall."
    exit 0
fi

# Preservation options
PRESERVE_LETSENCRYPT=true
PRESERVE_ASTERISK_CONFIGS=false
PRESERVE_DATABASE_BACKUP=true

# Parse command line arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        --no-preserve-ssl)
            PRESERVE_LETSENCRYPT=false
            shift
            ;;
        --preserve-asterisk)
            PRESERVE_ASTERISK_CONFIGS=true
            shift
            ;;
        --no-backup)
            PRESERVE_DATABASE_BACKUP=false
            shift
            ;;
        --force)
            FORCE_UNINSTALL=true
            shift
            ;;
        --help)
            echo "Usage: $0 [OPTIONS]"
            echo "Options:"
            echo "  --no-preserve-ssl     Remove Let's Encrypt certificates"
            echo "  --preserve-asterisk   Keep Asterisk configuration files"
            echo "  --no-backup          Skip database backup"
            echo "  --force              Force uninstall without confirmation"
            echo "  --help               Show this help message"
            exit 0
            ;;
        *)
            print_error "Unknown option: $1"
            echo "Use --help for usage information"
            exit 1
            ;;
    esac
done

# Confirmation prompt
if [ "$FORCE_UNINSTALL" != "true" ]; then
    echo "This will uninstall AirwavePBX from your system."
    echo
    echo "Preservation settings:"
    echo "  - Let's Encrypt certificates: $([ "$PRESERVE_LETSENCRYPT" = true ] && echo "PRESERVE" || echo "REMOVE")"
    echo "  - Asterisk configs: $([ "$PRESERVE_ASTERISK_CONFIGS" = true ] && echo "PRESERVE" || echo "REMOVE")"
    echo "  - Database backup: $([ "$PRESERVE_DATABASE_BACKUP" = true ] && echo "CREATE" || echo "SKIP")"
    echo
    read -p "Are you sure you want to continue? (yes/no) " -r
    if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
        echo "Uninstall cancelled."
        exit 0
    fi
fi

print_info "Starting AirwavePBX uninstallation..."

# Stop services
print_info "Stopping AirwavePBX service..."
systemctl stop airwavepbx 2>/dev/null || true
systemctl disable airwavepbx 2>/dev/null || true

# Create backup directory
BACKUP_DIR="/var/backups/airwavepbx-uninstall-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
print_info "Backup directory: $BACKUP_DIR"

# Backup database if requested
if [ "$PRESERVE_DATABASE_BACKUP" = true ] && [ -f "/var/lib/airwavepbx/data/airwavepbx.db" ]; then
    print_info "Backing up database..."
    cp /var/lib/airwavepbx/data/airwavepbx.db "$BACKUP_DIR/airwavepbx.db"
    print_success "Database backed up to $BACKUP_DIR/airwavepbx.db"
fi

# Backup configuration
if [ -d "/etc/airwavepbx" ]; then
    print_info "Backing up configuration..."
    cp -r /etc/airwavepbx "$BACKUP_DIR/etc-airwavepbx"
fi

# Handle Let's Encrypt certificates
if [ "$PRESERVE_LETSENCRYPT" = true ]; then
    print_info "Preserving Let's Encrypt certificates..."
    
    # Find domain from config
    if [ -f "/etc/airwavepbx/config.env" ]; then
        DOMAIN=$(grep "^DOMAIN=" /etc/airwavepbx/config.env | cut -d= -f2)
        if [ -n "$DOMAIN" ] && [ -d "/etc/letsencrypt/live/$DOMAIN" ]; then
            print_success "Let's Encrypt certificates for $DOMAIN will be preserved"
            
            # Backup Nginx SSL config
            if [ -f "/etc/nginx/sites-available/airwavepbx" ]; then
                cp /etc/nginx/sites-available/airwavepbx "$BACKUP_DIR/nginx-airwavepbx.conf"
            fi
        fi
    fi
else
    print_warning "Let's Encrypt certificates will be removed"
fi

# Handle Asterisk configurations
if [ "$PRESERVE_ASTERISK_CONFIGS" = true ]; then
    print_info "Preserving Asterisk configurations..."
    
    # Backup AirwavePBX-specific Asterisk configs
    for conf in sip_airwave.conf extensions_airwave.conf; do
        if [ -f "/etc/asterisk/$conf" ]; then
            cp "/etc/asterisk/$conf" "$BACKUP_DIR/$conf"
        fi
    done
else
    print_info "Removing AirwavePBX Asterisk configurations..."
    
    # Remove includes from main configs
    sed -i '/#include sip_airwave.conf/d' /etc/asterisk/sip.conf 2>/dev/null || true
    sed -i '/#include extensions_airwave.conf/d' /etc/asterisk/extensions.conf 2>/dev/null || true
    
    # Remove AirwavePBX config files
    rm -f /etc/asterisk/sip_airwave.conf
    rm -f /etc/asterisk/extensions_airwave.conf
fi

# Remove Nginx configuration
print_info "Removing Nginx configuration..."
rm -f /etc/nginx/sites-enabled/airwavepbx
rm -f /etc/nginx/sites-available/airwavepbx
nginx -t 2>/dev/null && systemctl reload nginx || true

# Remove systemd service
print_info "Removing systemd service..."
rm -f /etc/systemd/system/airwavepbx.service
systemctl daemon-reload

# Remove application files
print_info "Removing application files..."
rm -rf /opt/airwavepbx

# Remove data directory
print_info "Removing data directory..."
rm -rf /var/lib/airwavepbx

# Remove log files
print_info "Removing log files..."
rm -rf /var/log/airwavepbx

# Remove configuration directory
print_info "Removing configuration directory..."
rm -rf /etc/airwavepbx

# Remove management script
print_info "Removing management script..."
rm -f /usr/local/bin/airwavepbx

# Remove user and group
print_info "Removing airwavepbx user and group..."
userdel -r airwavepbx 2>/dev/null || true
groupdel airwavepbx 2>/dev/null || true

# Remove from asterisk group
gpasswd -d airwavepbx asterisk 2>/dev/null || true

# Clean up npm cache for airwavepbx user
rm -rf /home/airwavepbx/.npm 2>/dev/null || true

# Reload Asterisk if configurations were modified
if [ "$PRESERVE_ASTERISK_CONFIGS" = false ]; then
    print_info "Reloading Asterisk..."
    asterisk -rx "reload" 2>/dev/null || true
fi

# Summary
echo
echo "====================================="
echo "Uninstallation Complete"
echo "====================================="
echo

print_success "AirwavePBX has been removed from your system"

if [ "$PRESERVE_DATABASE_BACKUP" = true ]; then
    print_info "Database backup saved to: $BACKUP_DIR/airwavepbx.db"
fi

if [ "$PRESERVE_LETSENCRYPT" = true ] && [ -n "$DOMAIN" ]; then
    print_info "Let's Encrypt certificates preserved for: $DOMAIN"
    print_info "Certificates location: /etc/letsencrypt/live/$DOMAIN"
fi

if [ "$PRESERVE_ASTERISK_CONFIGS" = true ]; then
    print_info "Asterisk configs backed up to: $BACKUP_DIR"
fi

print_info "All backups saved to: $BACKUP_DIR"

# Cleanup recommendations
echo
echo "Recommended cleanup actions:"
echo "1. If you don't need the backups: rm -rf $BACKUP_DIR"

if [ "$PRESERVE_LETSENCRYPT" = true ] && [ -n "$DOMAIN" ]; then
    echo "2. To remove Let's Encrypt certificates: certbot delete --cert-name $DOMAIN"
fi

echo
print_success "Uninstallation completed successfully!"

# Create a restore script in the backup directory
cat > "$BACKUP_DIR/restore-info.txt" << EOF
AirwavePBX Uninstall Backup
Created: $(date)

This directory contains backups from the AirwavePBX uninstallation.

Contents:
- airwavepbx.db: Database backup (if created)
- etc-airwavepbx/: Configuration files
- nginx-airwavepbx.conf: Nginx configuration (if SSL preserved)
- *.conf: Asterisk configuration files (if preserved)

To restore the database to a new installation:
cp airwavepbx.db /var/lib/airwavepbx/data/

Let's Encrypt certificates status: $([ "$PRESERVE_LETSENCRYPT" = true ] && echo "PRESERVED" || echo "REMOVED")
Domain: ${DOMAIN:-"Not configured"}
EOF

print_info "Restore information saved to: $BACKUP_DIR/restore-info.txt"