#!/bin/sh /etc/rc.common

START=99
STOP=01
USE_PROCD=1

EXTRA_COMMANDS="restore"
EXTRA_HELP="        restore        Restore overlay packages"

BACKUP_DIR="/etc/backup"
INSTALLED_PACKAGES="$BACKUP_DIR/installed_packages.txt"
LOG_FILE="$BACKUP_DIR/banana-restore.log"
LOCK_FILE="/tmp/banana-restore.lock"
INTERNET_CHECK_ATTEMPTS=12
INTERNET_CHECK_DELAY=10
INTERNET_TEST_HOSTS="1.1.1.1 8.8.8.8"

ensure_backup_dir() {
    if [ ! -d "$BACKUP_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
        if [ $? -ne 0 ]; then
            logger -t "banana-restore" "Unable to create backup directory: $BACKUP_DIR"
            return 1
        fi
    fi
    return 0
}

log() {
    ensure_backup_dir
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    logger -t "banana-restore" "$1"
}

check_internet() {
    for i in $(seq 1 $INTERNET_CHECK_ATTEMPTS); do
        for host in $INTERNET_TEST_HOSTS; do
            if ping -c 1 -W 2 $host >/dev/null 2>&1; then
                log "Internet connection detected via $host"
                return 0
            fi
        done
        
        if wget -q --spider http://www.google.com >/dev/null 2>&1; then
            log "Internet connection detected via HTTP"
            return 0
        fi
        
        log "Waiting for internet connection... attempt $i/$INTERNET_CHECK_ATTEMPTS"
        sleep $INTERNET_CHECK_DELAY
    done
    
    log "No internet connection after $((INTERNET_CHECK_ATTEMPTS * INTERNET_CHECK_DELAY)) seconds. Aborting."
    return 1
}

cleanup() {
    log "Cleaning up..."
    [ -f "$LOCK_FILE" ] && rm -f "$LOCK_FILE"
}

do_restore() {
    if [ ! -f "$INSTALLED_PACKAGES" ]; then
        log "No package list found. Nothing to restore."
        return 0
    fi
    
    if [ -f "$LOCK_FILE" ]; then
        log "Restoration already in progress. Exiting."
        return 1
    fi
    
    touch "$LOCK_FILE"
    trap cleanup EXIT INT TERM
    
    ensure_backup_dir && rm -f "$LOG_FILE"
    
    log "Beginning package restoration process"
    
    if ! check_internet; then
        log "No internet connection. Restoration will resume on next boot."
        return 1
    fi
    
    log "Updating package lists..."
    if command -v apk >/dev/null 2>&1; then
        apk update
    else
        opkg update
    fi
    if [ $? -ne 0 ]; then
        log "Failed to update package lists. Will try again on next boot."
        return 1
    fi
    
    log "Processing package list..."
    
    PACKAGES_LIST=$(grep '\toverlay' "$INSTALLED_PACKAGES" | cut -f1)
    TOTAL_PACKAGES=$(echo "$PACKAGES_LIST" | wc -l)
    
    if [ -z "$PACKAGES_LIST" ]; then
        log "No overlay packages found to restore"
        log "Cleaning up..."
        rm -f "$INSTALLED_PACKAGES"
        log "Disabling service for future boots"
        /etc/init.d/banana-restore disable
        return 0
    fi
    
    log "Found $TOTAL_PACKAGES packages to restore"
    
    COUNT=0
    echo "$PACKAGES_LIST" | while read -r pkg; do
        [ -z "$pkg" ] && continue
        COUNT=$((COUNT + 1))
        if [ $COUNT -le 10 ]; then
            log "Package to install: $pkg"
        elif [ $COUNT -eq 11 ]; then
            log "... and $((TOTAL_PACKAGES - 10)) more packages"
        fi
    done
    
    log "Installing packages..."
    
    if command -v apk >/dev/null 2>&1; then
        INSTALL_OUTPUT=$(grep '\toverlay' "$INSTALLED_PACKAGES" | cut -f1 | xargs apk add 2>&1)
    else
        INSTALL_OUTPUT=$(grep '\toverlay' "$INSTALLED_PACKAGES" | cut -f1 | xargs opkg install 2>&1)
    fi
    INSTALL_RESULT=$?
    
    log "Install command output:"
    echo "$INSTALL_OUTPUT" >> "$LOG_FILE"
    
    if [ $INSTALL_RESULT -eq 0 ]; then
        log "All packages installed successfully"
    else
        log "Some errors occurred during installation. Check the log for details."
    fi
    
    log "Package restoration completed"
    
    log "Cleaning up..."
    rm -f "$INSTALLED_PACKAGES"
    
    log "Disabling service for future boots"
    /etc/init.d/banana-restore disable
    
    log "Package restoration complete."
    
    return 0
}

start_service() {
    if [ ! -f "$INSTALLED_PACKAGES" ]; then
        return 1
    fi
    
    procd_open_instance
    procd_set_param command /bin/sh -c "sleep 10 && /etc/init.d/banana-restore restore"
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

boot() {
    start
}

restore() {
    do_restore
}