flowchart LR QP["🔄 Redis Queue Processor
Orchestrates workflow execution
server/backend/celery/tasks/bulk_gen/queue_worker.py:67"]

QP --> S1["📝 Step 1: Validate Preset<br/>Check preset exists, user credits, config valid<br/>server/backend/celery/tasks/bulk_gen/step_1_validate_preset.py"]
S1 --> QP

QP --> S2["🎨 Step 2: Generate Prompts<br/>Create unique AI prompts for each image<br/>server/backend/celery/tasks/bulk_gen/step_2_generate_prompts.py"]
S2 --> QP

QP --> S3["📁 Step 3: Setup Directory<br/>Create temp output folder structure<br/>server/backend/celery/tasks/bulk_gen/step_3_setup_directory.py"]
S3 --> QP

QP --> S4["🖼️ Step 4: Generate Images<br/>Parallel AI image generation<br/>server/backend/celery/tasks/bulk_gen/step_4_generate_images.py"]
S4 --> IMG["🔥 Batch Image Processing<br/>ThreadPoolExecutor parallel execution<br/>server/backend/services/bulk_gen/bulk_image_service.py:241"]

IMG --> GEN["🎯 Single Image Generation<br/>Process individual prompt<br/>server/backend/services/bulk_gen/bulk_image_service.py:77"]
GEN --> AI["🧠 AI Generator Instance<br/>Get singleton round-robin orchestrator<br/>server/backend/services/ai_image_generator/ai_image_generator.py:227"]
AI --> ROUTE{📏 Smart Routing Decision<br/>Detect input type and route to providers<br/>server/backend/services/ai_image_generator/ai_image_generator.py:130}

ROUTE -->|exact_dimensions| REP["🚀 Force Replicate Only<br/>Precise dimensions need Replicate<br/>server/backend/services/ai_image_generator/replicate_provider.py"]
ROUTE -->|aspect_ratio| RR["🔄 Round-robin Selection<br/>Alternate between compatible providers<br/>server/backend/services/ai_image_generator/ai_image_generator.py:154"]
ROUTE -->|default| RR

RR --> REP
RR --> GOOGLE["🌟 Google Nano Banana Provider<br/>Aspect ratio optimized generation<br/>server/backend/services/ai_image_generator/google_provider.py"]

REP --> RESULT["✅ Generation Result<br/>Returns image URL + provider metadata<br/>provider.generate_image method"]
GOOGLE --> RESULT

RESULT --> S4
S4 --> QP

QP --> S5["📦 Steps 5-8: Package & Upload<br/>ZIP creation, database update, S3 upload<br/>server/backend/celery/tasks/bulk_gen/step_5_create_zip.py<br/>server/backend/celery/tasks/bulk_gen/step_7_upload_s3.py"]
S5 --> QP

QP --> DONE["✅ Workflow Complete<br/>Mark job status as completed<br/>backend_jobs.status = completed"]

style QP fill:#f0f0f0
style S4 fill:#fff3e0
style ROUTE fill:#f3e5f5
style REP fill:#ffebee
style GOOGLE fill:#e8f5e8
style RR fill:#fff9c4