#!/bin/bash

# ==============================================================================
# Script Name: update_repo_from_list.sh
# Description: Reads a list of DEB filenames, replaces corresponding old packages, 
#              and adds new packages to the repository.
# ==============================================================================

# --- CONFIGURATION ---
REPO_DIR="/home/build/4.14.0/cavisson/ubuntu-pkg/Ubuntu_2004/pkgs/packages"
INDEX_DIR="/home/build/4.14.0/cavisson/ubuntu-pkg/Ubuntu_2004/pkgs"

# *** NEW CONFIGURATION ***
# 1. Directory where the actual NEW DEB files reside.
NEW_DEBS_DIR="./resolved_packages" 
# 2. File listing the filenames (e.g., 'libfoo_1.1.deb', one per line)
NEW_LIST_FILE="packages_to_update.txt" 

LOG_FILE="/var/log/repo_sync_$(date +%Y%m%d).log"
DRY_RUN=true 

# --- Colors & Logging Function (Consistent with previous scripts) ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log() {
    local DRY_PREFIX=""
    if [ "$DRY_RUN" = true ]; then
        DRY_PREFIX="${YELLOW}[DRY RUN]${NC} "
    fi
    echo -e "${DRY_PREFIX}$1" | tee -a "$LOG_FILE"
}

# --- Core Logic Functions ---
detect_package_name() {
    local DEB_PATH="$1"
    dpkg-deb -f "$DEB_PATH" Package 2>/dev/null
}

main() {
    # Initial Checks
    if [[ $EUID -ne 0 ]]; then exit 1; fi
    if [ ! -f "$NEW_LIST_FILE" ]; then log "ERROR: List file '$NEW_LIST_FILE' not found."; exit 1; fi
    # ... (rest of configuration checks) ...

    # --- INVENTORY OLD PACKAGES (Identical to previous script) ---
    log "Scanning old packages for removal candidates..."
    declare -A OLD_PKG_FILES
    find "$REPO_DIR" -maxdepth 1 -name "*.deb" -print0 | while IFS= read -r -d $'\0'\ OLD_FILE_PATH; do
        PKG_NAME=$(detect_package_name "$OLD_FILE_PATH")
        if [ -n "$PKG_NAME" ]; then
            OLD_PKG_FILES["$PKG_NAME"]="${OLD_PKG_FILES["$PKG_NAME"]} $OLD_FILE_PATH"
        fi
    done
    
    log "--- Processing Packages from $NEW_LIST_FILE ---"
    PROCESSED_COUNT=0
    DELETED_COUNT=0
    NEW_COUNT=0

    # 1. ITERATE THROUGH THE LIST FILE
    while IFS= read -r DEB_FILENAME; do
        # Clean the input filename and construct full paths
        DEB_FILENAME=$(echo "$DEB_FILENAME" | tr -d '\r' | xargs)
        [ -z "$DEB_FILENAME" ] && continue
        
        NEW_FILE_PATH="$NEW_DEBS_DIR/$DEB_FILENAME"
        
        if [ ! -f "$NEW_FILE_PATH" ]; then
            log "WARNING: File listed in $NEW_LIST_FILE not found: $DEB_FILENAME"
            continue
        fi

        PKG_NAME=$(detect_package_name "$NEW_FILE_PATH")
        [ -z "$PKG_NAME" ] && log "WARNING: Could not determine package name for $DEB_FILENAME. Skipping." && continue
        
        log "Processing ${BLUE}$PKG_NAME${NC} ($DEB_FILENAME)"

        # 2. CHECK & DELETE CORRESPONDING OLD PACKAGES
        if [ -n "${OLD_PKG_FILES[$PKG_NAME]}" ]; then
            log "CLEANUP: Old version(s) found. Removing..."
            
            for OLD_FILE_PATH in ${OLD_PKG_FILES[$PKG_NAME]}; do
                log "DELETE: Removing old version -> $(basename "$OLD_FILE_PATH")"
                
                if [ "$DRY_RUN" = false ]; then
                    rm -f "$OLD_FILE_PATH"
                fi
                ((DELETED_COUNT++))
            done
            unset OLD_PKG_FILES["$PKG_NAME"]
        else
            log "ADDITION: No old version found in repo. Adding new package."
        fi

        # 3. COPY THE NEW PACKAGE (Always Copy)
        log "COPY: Adding $DEB_FILENAME to repository."

        if [ "$DRY_RUN" = false ]; then
            cp -v "$NEW_FILE_PATH" "$REPO_DIR" >> "$LOG_FILE" 2>&1
            if [ $? -eq 0 ]; then ((NEW_COUNT++)); fi
        else
            ((NEW_COUNT++))
        fi
        
        ((PROCESSED_COUNT++))
        
    done < "$NEW_LIST_FILE"

    # --- FINAL STEPS (Indexing) ---
    # ... (Indexing code remains the same, running dpkg-scanpackages) ...
    
    log "--- REPOSITORY UPDATE FINISHED ---"
    log "Summary: Processed $PROCESSED_COUNT files. $DELETED_COUNT old files removed. $NEW_COUNT files added."
}

main "$@"
