#!/bin/bash

# Simple Docker Image Archive and Load Script
# Usage:
#   ./docker-images.sh save    - Save images to tar files
#   ./docker-images.sh load    - Load images from tar files
#   ./docker-images.sh clean   - Remove tar files
#   ./docker-images.sh list    - List available tar files

# Define images to archive
IMAGES=(
    # Frontend Services
    registry.k8s.puzzle-eg.com/bg-unified-fe-core:uat
    registry.k8s.puzzle-eg.com/bg-unified-fe-experience:uat
    registry.k8s.puzzle-eg.com/bg-unified-fe-permits:uat
    registry.k8s.puzzle-eg.com/bg-unified-fe-workflow:uat
    # Backend Services
    registry.k8s.puzzle-eg.com/bg-unified-be-email:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-experience:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-files:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-lookup:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-mockapi:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-notification:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-permits:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-platform:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-sms:uat
    registry.k8s.puzzle-eg.com/bg-unified-be-workflow:uat
    # Additional Images
    "nginx:alpine"
    container-registry.oracle.com/database/express:18.4.0-xe
)

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

# Function to log messages
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

# Function to convert image name to filename
image_to_filename() {
    local image="$1"
    # Replace special characters with underscores
    echo "${image}" | sed 's|[/:.]|_|g'
}

# Function to save images
save_images() {
    log "Starting image save process..."
    
    # Create directory for archives
    mkdir -p docker-images-archive
    
    for image in "${IMAGES[@]}"; do
        log "Processing image: $image"
        
        # Generate filename
        filename="docker-images-archive/$(image_to_filename "$image").tar"
        
        # Check if image exists locally
        if docker image inspect "$image" >/dev/null 2>&1; then
            log "Saving $image to $filename"
            if docker save -o "$filename" "$image"; then
                log_success "Saved: $image -> $filename"
                # Show file size
                size=$(du -h "$filename" | cut -f1)
                log "File size: $size"
            else
                log_error "Failed to save: $image"
            fi
        else
            log_warning "Image not found locally: $image"
            log "Attempting to pull image..."
            if docker pull "$image"; then
                log "Successfully pulled: $image"
                log "Saving $image to $filename"
                if docker save -o "$filename" "$image"; then
                    log_success "Saved: $image -> $filename"
                    size=$(du -h "$filename" | cut -f1)
                    log "File size: $size"
                else
                    log_error "Failed to save: $image"
                fi
            else
                log_error "Failed to pull: $image"
            fi
        fi
        echo ""
    done
    
    log_success "Save process completed!"
    log "Total archive size: $(du -sh docker-images-archive 2>/dev/null | cut -f1 || echo 'N/A')"
}

# Function to load images
load_images() {
    log "Starting image load process..."
    
    if [ ! -d "docker-images-archive" ]; then
        log_error "Archive directory not found: docker-images-archive"
        exit 1
    fi
    
    for image in "${IMAGES[@]}"; do
        filename="docker-images-archive/$(image_to_filename "$image").tar"
        
        if [ -f "$filename" ]; then
            log "Loading $filename"
            if docker load -i "$filename"; then
                log_success "Loaded: $filename -> $image"
                # Verify image is loaded
                if docker image inspect "$image" >/dev/null 2>&1; then
                    log "Verified: $image is available locally"
                else
                    log_warning "Image loaded but verification failed: $image"
                fi
            else
                log_error "Failed to load: $filename"
            fi
        else
            log_warning "Archive file not found: $filename"
        fi
        echo ""
    done
    
    log_success "Load process completed!"
}

# Function to clean archive files
clean_archives() {
    log "Cleaning archive files..."
    
    if [ -d "docker-images-archive" ]; then
        log "Removing docker-images-archive directory..."
        rm -rf docker-images-archive
        log_success "Archive directory removed"
    else
        log_warning "Archive directory not found"
    fi
}

# Function to list archive files
list_archives() {
    log "Listing archive files..."
    
    if [ -d "docker-images-archive" ]; then
        echo ""
        echo "Archive files:"
        ls -lh docker-images-archive/*.tar 2>/dev/null || log_warning "No tar files found"
        echo ""
        echo "Total archive size: $(du -sh docker-images-archive 2>/dev/null | cut -f1 || echo 'N/A')"
        echo ""
        echo "Image mapping:"
        for image in "${IMAGES[@]}"; do
            filename="docker-images-archive/$(image_to_filename "$image").tar"
            if [ -f "$filename" ]; then
                size=$(du -h "$filename" | cut -f1)
                echo "  $image -> $(basename "$filename") ($size)"
            else
                echo "  $image -> $(basename "$filename") (NOT FOUND)"
            fi
        done
    else
        log_warning "Archive directory not found"
    fi
}

# Function to show usage
show_usage() {
    echo ""
    echo "Docker Image Archive Manager"
    echo ""
    echo "Usage: $0 {save|load|clean|list}"
    echo ""
    echo "Commands:"
    echo "  save   - Save Docker images to tar files"
    echo "  load   - Load Docker images from tar files"
    echo "  clean  - Remove all archive tar files"
    echo "  list   - List available archive files"
    echo ""
    echo "Images managed:"
    for image in "${IMAGES[@]}"; do
        echo "  - $image"
    done
    echo ""
}

# Main script logic
case "$1" in
    save)
        save_images
        ;;
    load)
        load_images
        ;;
    clean)
        clean_archives
        ;;
    list)
        list_archives
        ;;
    *)
        show_usage
        exit 1
        ;;
esac
