/**
 * Comprehensive TDD Test Suite for Imagen4 Generator
 *
 * Following London School TDD with emphasis on performance assertions,
 * image generation pipeline coordination, and quality validation.
 *
 * RED-GREEN-REFACTOR CYCLE:
 * Focus on AI-powered image generation, performance optimization,
 * batch processing coordination, and quality assessment.
 */

import {
  describe,
  it,
  expect,
  beforeEach,
  afterEach,
  jest,
} from "@jest/globals";
import { EventEmitter } from "events";
import { Imagen4Generator } from "../imagen4-generator.js";
import {
  MockFactory,
  TestDataGenerator,
  MockBuilder,
  ContractTester,
  PerformanceTester,
  PropertyGenerator,
} from "./test-utilities.js";

// Mock external dependencies following London School principles
jest.mock("../../../utils/logger.js");
jest.mock("../../../ai/image-ai-engine.js");
jest.mock("../../../rendering/gpu-accelerator.js");

describe("Imagen4Generator - London School TDD with Performance Focus", () => {
  let imagen4Generator: Imagen4Generator;
  let mockConfig: any;
  let mockLogger: jest.Mocked<any>;
  let mockImageAIEngine: jest.Mocked<any>;
  let mockGPUAccelerator: jest.Mocked<any>;
  let mockRenderingPipeline: jest.Mocked<any>;
  let mockQualityAssessor: jest.Mocked<any>;
  let mockStorageManager: jest.Mocked<any>;
  let mockPerformanceMonitor: jest.Mocked<any>;
  let mockBatchProcessor: jest.Mocked<any>;
  let mockBuilder: MockBuilder;

  beforeEach(() => {
    // Setup comprehensive mock configuration for image generation
    mockConfig = {
      ai: {
        model: "imagen4-ultra-v2",
        maxResolution: { width: 4096, height: 4096 },
        supportedFormats: ["png", "jpg", "webp", "tiff", "bmp"],
        qualityLevels: ["draft", "standard", "high", "ultra"],
        features: {
          textToImage: true,
          imageToImage: true,
          inpainting: true,
          outpainting: true,
          styleTransfer: true,
          superResolution: true,
        },
        performance: {
          gpuMemoryOptimization: true,
          batchOptimization: true,
          caching: true,
          streaming: false,
        },
      },
      generation: {
        defaultSteps: 50,
        maxSteps: 100,
        guidanceScale: 7.5,
        seed: -1, // Random seed
        sampler: "ddim",
        negativePrompt: "blurry, low quality, distorted",
        aspectRatios: {
          square: "1:1",
          portrait: "3:4",
          landscape: "4:3",
          widescreen: "16:9",
          cinema: "21:9",
        },
      },
      performance: {
        targetLatency: 5000, // 5 seconds
        maxConcurrentGenerations: 4,
        gpuMemoryLimit: 12288, // 12GB
        batchSize: 4,
        cacheEnabled: true,
        preloadModels: true,
        optimization: {
          precisionMode: "fp16",
          tensorrtOptimization: true,
          dynamicBatching: true,
          memoryPooling: true,
        },
      },
      quality: {
        assessmentEnabled: true,
        minQualityScore: 0.7,
        metrics: [
          "sharpness",
          "color_accuracy",
          "composition",
          "prompt_adherence",
        ],
        enhancement: {
          autoCorrection: true,
          noiseReduction: true,
          colorBalancing: true,
          contrastOptimization: true,
        },
      },
      storage: {
        basePath: "/tmp/imagen4",
        compression: "lossless",
        metadata: true,
        versioning: true,
        cleanup: {
          enabled: true,
          retentionDays: 30,
          maxStorageGB: 100,
        },
      },
      batch: {
        enabled: true,
        maxBatchSize: 16,
        parallelBatches: 2,
        queueSize: 100,
        priorityLevels: 5,
        scheduling: "priority_first",
      },
    };

    mockBuilder = new MockBuilder();

    // Setup Logger mock
    mockLogger = mockBuilder
      .mockFunction("info", jest.fn())
      .mockFunction("debug", jest.fn())
      .mockFunction("warn", jest.fn())
      .mockFunction("error", jest.fn())
      .build() as any;

    // Setup ImageAIEngine mock
    mockImageAIEngine = {
      initialize: jest.fn().mockResolvedValue(undefined),
      generateImage: jest.fn().mockImplementation(async (prompt, options) => ({
        imageData: `generated_image_${Date.now()}.png`,
        metadata: {
          prompt: prompt,
          steps: options?.steps || 50,
          guidance: options?.guidance || 7.5,
          seed: options?.seed || 12345,
          resolution: options?.resolution || { width: 1024, height: 1024 },
        },
        performance: {
          generationTime: 3500,
          memoryUsed: 8192,
          gpuUtilization: 85,
        },
      })),
      enhancePrompt: jest
        .fn()
        .mockImplementation(
          async (prompt) =>
            `${prompt}, highly detailed, professional photography, 8k resolution`,
        ),
      analyzeStyle: jest.fn().mockResolvedValue({
        dominantStyle: "photorealistic",
        confidence: 0.92,
        suggestions: ["increase_detail", "adjust_lighting"],
      }),
      optimizeGeneration: jest.fn().mockResolvedValue({
        optimalSteps: 42,
        optimalGuidance: 8.2,
        recommendedSampler: "euler_a",
      }),
      preloadModels: jest.fn().mockResolvedValue(undefined),
      unloadModels: jest.fn().mockResolvedValue(undefined),
    };

    // Setup GPUAccelerator mock
    mockGPUAccelerator = {
      initialize: jest.fn().mockResolvedValue(undefined),
      getAvailableMemory: jest.fn().mockReturnValue(10240), // 10GB available
      getTotalMemory: jest.fn().mockReturnValue(12288), // 12GB total
      getCurrentUtilization: jest.fn().mockReturnValue(45), // 45% utilization
      optimizeBatch: jest.fn().mockImplementation(async (requests) => ({
        optimalBatchSize: Math.min(requests.length, 4),
        memoryEstimate: requests.length * 2048,
        expectedLatency: requests.length * 1.2 * 1000,
      })),
      allocateMemory: jest.fn().mockResolvedValue("memory_pool_123"),
      releaseMemory: jest.fn().mockResolvedValue(undefined),
      warmupKernels: jest.fn().mockResolvedValue(undefined),
    };

    // Setup RenderingPipeline mock
    mockRenderingPipeline = {
      initialize: jest.fn().mockResolvedValue(undefined),
      processImage: jest
        .fn()
        .mockImplementation(async (imageData, pipeline) => ({
          processedImage: `processed_${imageData}`,
          appliedEffects: pipeline.effects || [],
          processingTime: 850,
          qualityScore: 0.88,
        })),
      applyEnhancements: jest.fn().mockResolvedValue({
        enhancedImage: "enhanced_image_data",
        improvements: ["noise_reduction", "sharpness", "color_balance"],
      }),
      generateVariations: jest
        .fn()
        .mockImplementation(async (baseImage, count) =>
          Array.from({ length: count }, (_, i) => ({
            id: `variation_${i}`,
            imageData: `${baseImage}_var_${i}`,
            similarity: 0.75 + Math.random() * 0.2,
          })),
        ),
    };

    // Setup QualityAssessor mock
    mockQualityAssessor = {
      assessQuality: jest
        .fn()
        .mockImplementation(async (imageData, criteria) => ({
          overallScore: 0.85,
          metrics: {
            sharpness: 0.9,
            colorAccuracy: 0.82,
            composition: 0.88,
            promptAdherence: 0.8,
          },
          issues: [],
          recommendations: ["minor_color_adjustment"],
          passed: true,
        })),
      compareImages: jest.fn().mockResolvedValue({
        similarity: 0.78,
        differences: ["color_tone", "detail_level"],
        preference: "image_a",
      }),
      validatePromptAdherence: jest.fn().mockResolvedValue({
        score: 0.85,
        detectedElements: ["person", "landscape", "sunset"],
        missingElements: [],
        extraElements: ["bird"],
      }),
    };

    // Setup StorageManager mock
    mockStorageManager = {
      initialize: jest.fn().mockResolvedValue(undefined),
      storeImage: jest.fn().mockImplementation(async (imageData, metadata) => ({
        id: `img_${Date.now()}`,
        path: `/storage/images/${metadata.name || "image"}.png`,
        size: 2048576,
        format: "png",
        stored: new Date(),
      })),
      retrieveImage: jest.fn().mockResolvedValue({
        imageData: "retrieved_image_data",
        metadata: { created: new Date(), size: 1024576 },
      }),
      deleteImage: jest.fn().mockResolvedValue(true),
      getStorageUsage: jest.fn().mockReturnValue({
        used: 50 * 1024 * 1024 * 1024, // 50GB
        total: 100 * 1024 * 1024 * 1024, // 100GB
        percentage: 50,
      }),
      cleanup: jest.fn().mockResolvedValue({
        deletedFiles: 25,
        freedSpace: 10 * 1024 * 1024 * 1024, // 10GB
      }),
    };

    // Setup PerformanceMonitor mock
    mockPerformanceMonitor = {
      start: jest.fn().mockResolvedValue(undefined),
      recordGeneration: jest.fn(),
      recordBatch: jest.fn(),
      getMetrics: jest.fn().mockResolvedValue({
        ...MockFactory.createPerformanceMetrics(),
        imageGeneration: {
          averageLatency: 3200,
          throughput: 18.5, // images per minute
          gpuUtilization: 78,
          memoryEfficiency: 0.85,
          cacheHitRate: 0.65,
        },
      }),
      getGenerationMetrics: jest.fn().mockReturnValue({
        totalGenerations: 1250,
        successRate: 0.94,
        averageQualityScore: 0.82,
        topPromptPatterns: ["landscape", "portrait", "abstract"],
      }),
      startTimer: jest.fn().mockReturnValue("timer_123"),
      endTimer: jest.fn().mockReturnValue(2350), // milliseconds
    };

    // Setup BatchProcessor mock
    mockBatchProcessor = {
      initialize: jest.fn().mockResolvedValue(undefined),
      enqueueBatch: jest.fn().mockImplementation(async (requests) => ({
        batchId: `batch_${Date.now()}`,
        size: requests.length,
        estimatedCompletion: new Date(Date.now() + requests.length * 2000),
        priority: 1,
      })),
      processBatch: jest.fn().mockImplementation(async (batchId) => ({
        batchId,
        results: Array.from({ length: 4 }, (_, i) => ({
          id: `result_${i}`,
          success: true,
          imageData: `batch_image_${i}`,
          generationTime: 2000 + Math.random() * 1000,
        })),
        totalTime: 8500,
        successRate: 1.0,
      })),
      getBatchStatus: jest.fn().mockResolvedValue({
        batchId: "batch_123",
        status: "processing",
        progress: 0.6,
        completed: 6,
        total: 10,
      }),
      cancelBatch: jest.fn().mockResolvedValue(true),
    };

    // Mock constructor dependencies
    jest.mocked(require("../../../utils/logger.js")).Logger = jest
      .fn()
      .mockImplementation(() => mockLogger);

    // Create Imagen4Generator instance
    imagen4Generator = new Imagen4Generator(mockConfig);

    // Inject mocks
    (imagen4Generator as any).imageAIEngine = mockImageAIEngine;
    (imagen4Generator as any).gpuAccelerator = mockGPUAccelerator;
    (imagen4Generator as any).renderingPipeline = mockRenderingPipeline;
    (imagen4Generator as any).qualityAssessor = mockQualityAssessor;
    (imagen4Generator as any).storageManager = mockStorageManager;
    (imagen4Generator as any).performanceMonitor = mockPerformanceMonitor;
    (imagen4Generator as any).batchProcessor = mockBatchProcessor;
  });

  afterEach(() => {
    jest.clearAllMocks();
    mockBuilder.clear();
  });

  // ==================== INITIALIZATION AND PERFORMANCE SETUP ====================

  describe("Initialization and Performance Optimization", () => {
    it("should coordinate initialization with GPU optimization and model preloading", async () => {
      // ARRANGE
      const initializeSpy = jest.spyOn(imagen4Generator, "initialize");
      const performanceTimer = mockPerformanceMonitor.startTimer();

      // ACT
      await imagen4Generator.initialize();

      // ASSERT - Verify initialization coordination with performance focus
      expect(initializeSpy).toHaveBeenCalledTimes(1);
      expect(mockImageAIEngine.initialize).toHaveBeenCalled();
      expect(mockGPUAccelerator.initialize).toHaveBeenCalled();
      expect(mockImageAIEngine.preloadModels).toHaveBeenCalled();
      expect(mockGPUAccelerator.warmupKernels).toHaveBeenCalled();
      expect(mockPerformanceMonitor.start).toHaveBeenCalled();
      expect(mockLogger.info).toHaveBeenCalledWith(
        "Initializing Imagen4 Generator with performance optimization",
      );

      // Verify performance timing
      expect(mockPerformanceMonitor.startTimer).toHaveBeenCalled();
      expect(mockPerformanceMonitor.endTimer).toHaveBeenCalledWith(
        performanceTimer,
      );
    });

    it("should validate GPU memory requirements before initialization", async () => {
      // ARRANGE
      mockGPUAccelerator.getAvailableMemory.mockReturnValueOnce(4096); // Insufficient memory

      // ACT
      const result = await imagen4Generator.initialize();

      // ASSERT
      expect(mockGPUAccelerator.getAvailableMemory).toHaveBeenCalled();
      expect(mockLogger.warn).toHaveBeenCalledWith(
        "GPU memory may be insufficient for optimal performance",
        expect.objectContaining({
          available: 4096,
          recommended: expect.any(Number),
        }),
      );
    });

    it("should handle initialization failure with proper cleanup", async () => {
      // ARRANGE
      const initError = new Error("GPU initialization failed");
      mockGPUAccelerator.initialize.mockRejectedValueOnce(initError);

      // ACT & ASSERT
      await expect(imagen4Generator.initialize()).rejects.toThrow(
        "GPU initialization failed",
      );
      expect(mockImageAIEngine.unloadModels).toHaveBeenCalled();
      expect(mockLogger.error).toHaveBeenCalledWith(
        "Failed to initialize Imagen4 Generator",
        initError,
      );
    });
  });

  // ==================== SINGLE IMAGE GENERATION WITH PERFORMANCE FOCUS ====================

  describe("Single Image Generation Performance", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should generate image within performance targets", async () => {
      // ARRANGE
      const request = {
        prompt: "A serene mountain landscape at sunset",
        resolution: { width: 1024, height: 1024 },
        quality: "high",
        style: "photorealistic",
        steps: 50,
        guidance: 7.5,
      };

      const performanceTest = PerformanceTester.createPerformanceTest(
        "single_image_generation",
        () => imagen4Generator.generateImage(request),
        mockConfig.performance.targetLatency, // 5000ms
        1,
      );

      // ACT & ASSERT
      await performanceTest();
      expect(mockPerformanceMonitor.recordGeneration).toHaveBeenCalled();
    });

    it("should coordinate prompt enhancement with AI optimization", async () => {
      // ARRANGE
      const request = {
        prompt: "beautiful landscape",
        resolution: { width: 1024, height: 1024 },
        enhancePrompt: true,
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockImageAIEngine.enhancePrompt).toHaveBeenCalledWith(
        "beautiful landscape",
      );
      expect(mockImageAIEngine.generateImage).toHaveBeenCalledWith(
        "beautiful landscape, highly detailed, professional photography, 8k resolution",
        expect.any(Object),
      );
      expect(mockPerformanceMonitor.recordGeneration).toHaveBeenCalled();
    });

    it("should optimize generation parameters for best performance", async () => {
      // ARRANGE
      const request = {
        prompt: "abstract art composition",
        autoOptimize: true,
        quality: "ultra",
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockImageAIEngine.optimizeGeneration).toHaveBeenCalled();
      expect(mockGPUAccelerator.allocateMemory).toHaveBeenCalled();
      expect(result.data.metadata.performance.generationTime).toBeLessThan(
        mockConfig.performance.targetLatency,
      );
    });

    it("should handle memory constraints with dynamic optimization", async () => {
      // ARRANGE
      mockGPUAccelerator.getAvailableMemory.mockReturnValueOnce(2048); // Low memory

      const request = {
        prompt: "high detail fantasy scene",
        resolution: { width: 2048, height: 2048 }, // High memory requirement
        quality: "ultra",
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockGPUAccelerator.optimizeBatch).toHaveBeenCalled();
      expect(mockLogger.info).toHaveBeenCalledWith(
        "Optimizing generation for memory constraints",
        expect.any(Object),
      );
    });
  });

  // ==================== BATCH PROCESSING PERFORMANCE ====================

  describe("Batch Processing Performance Optimization", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should coordinate optimal batch sizing with GPU memory limits", async () => {
      // ARRANGE
      const requests = Array.from({ length: 12 }, (_, i) => ({
        prompt: `Test prompt ${i}`,
        resolution: { width: 1024, height: 1024 },
        quality: "standard",
      }));

      // ACT
      const result = await imagen4Generator.generateBatch(requests);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockGPUAccelerator.optimizeBatch).toHaveBeenCalledWith(requests);
      expect(mockBatchProcessor.enqueueBatch).toHaveBeenCalled();
      expect(mockPerformanceMonitor.recordBatch).toHaveBeenCalled();
    });

    it("should meet batch processing performance targets", async () => {
      // ARRANGE
      const batchRequests = Array.from({ length: 8 }, (_, i) => ({
        prompt: `Batch image ${i}`,
        resolution: { width: 512, height: 512 },
        quality: "standard",
      }));

      const batchPerformanceTest = PerformanceTester.createPerformanceTest(
        "batch_processing",
        () => imagen4Generator.generateBatch(batchRequests),
        15000, // 15 seconds for batch of 8
        1,
      );

      // ACT & ASSERT
      await batchPerformanceTest();
    });

    it("should implement dynamic batch partitioning for large requests", async () => {
      // ARRANGE
      const largeBatch = Array.from({ length: 32 }, (_, i) => ({
        prompt: `Large batch image ${i}`,
        resolution: { width: 1024, height: 1024 },
      }));

      // ACT
      const result = await imagen4Generator.generateBatch(largeBatch);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockBatchProcessor.enqueueBatch).toHaveBeenCalledTimes(2); // Should split into multiple batches
      expect(mockLogger.info).toHaveBeenCalledWith(
        "Partitioning large batch for optimal processing",
        expect.objectContaining({ originalSize: 32, partitions: 2 }),
      );
    });

    it("should handle batch priority scheduling for performance optimization", async () => {
      // ARRANGE
      const highPriorityBatch = Array.from({ length: 4 }, (_, i) => ({
        prompt: `High priority ${i}`,
        priority: 5, // Highest priority
        resolution: { width: 1024, height: 1024 },
      }));

      const lowPriorityBatch = Array.from({ length: 4 }, (_, i) => ({
        prompt: `Low priority ${i}`,
        priority: 1, // Lowest priority
        resolution: { width: 512, height: 512 },
      }));

      // ACT
      const highPriorityResult =
        await imagen4Generator.generateBatch(highPriorityBatch);
      const lowPriorityResult =
        await imagen4Generator.generateBatch(lowPriorityBatch);

      // ASSERT
      expect(highPriorityResult.success).toBe(true);
      expect(lowPriorityResult.success).toBe(true);
      expect(mockBatchProcessor.enqueueBatch).toHaveBeenCalledTimes(2);
    });
  });

  // ==================== QUALITY ASSESSMENT WITH PERFORMANCE METRICS ====================

  describe("Quality Assessment Performance Integration", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should coordinate quality assessment without significant performance impact", async () => {
      // ARRANGE
      const request = {
        prompt: "Quality test image",
        resolution: { width: 1024, height: 1024 },
        qualityAssessment: true,
      };

      const timer = mockPerformanceMonitor.startTimer();

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockQualityAssessor.assessQuality).toHaveBeenCalled();
      expect(result.data.quality.overallScore).toBeGreaterThan(
        mockConfig.quality.minQualityScore,
      );

      // Quality assessment shouldn't add more than 20% overhead
      const totalTime = mockPerformanceMonitor.endTimer(timer);
      expect(totalTime).toBeLessThan(
        mockConfig.performance.targetLatency * 1.2,
      );
    });

    it("should implement performance-optimized quality enhancement", async () => {
      // ARRANGE
      const request = {
        prompt: "Enhancement test",
        resolution: { width: 1024, height: 1024 },
        autoEnhance: true,
      };

      mockQualityAssessor.assessQuality.mockResolvedValueOnce({
        overallScore: 0.65, // Below threshold
        metrics: { sharpness: 0.6, colorAccuracy: 0.7 },
        issues: ["low_sharpness"],
        recommendations: ["apply_sharpening"],
        passed: false,
      });

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockRenderingPipeline.applyEnhancements).toHaveBeenCalled();
      expect(mockQualityAssessor.assessQuality).toHaveBeenCalledTimes(2); // Before and after enhancement
    });

    it("should provide detailed performance metrics for quality processes", async () => {
      // ARRANGE
      const requests = Array.from({ length: 5 }, (_, i) => ({
        prompt: `Quality metrics test ${i}`,
        resolution: { width: 1024, height: 1024 },
        qualityAssessment: true,
      }));

      // ACT
      await imagen4Generator.generateBatch(requests);
      const metrics = await imagen4Generator.getPerformanceMetrics();

      // ASSERT
      expect(metrics.success).toBe(true);
      expect(metrics.data.imageGeneration).toBeDefined();
      expect(metrics.data.imageGeneration.averageLatency).toBeLessThan(
        mockConfig.performance.targetLatency,
      );
      expect(metrics.data.imageGeneration.throughput).toBeGreaterThan(10); // Images per minute
      expect(metrics.data.imageGeneration.gpuUtilization).toBeLessThan(95); // Not maxed out
    });
  });

  // ==================== MEMORY AND RESOURCE PERFORMANCE ====================

  describe("Memory Management and Resource Performance", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should coordinate memory pooling for optimal GPU utilization", async () => {
      // ARRANGE
      const sequentialRequests = Array.from({ length: 10 }, (_, i) => ({
        prompt: `Sequential test ${i}`,
        resolution: { width: 1024, height: 1024 },
      }));

      // ACT
      const results = [];
      for (const request of sequentialRequests) {
        results.push(await imagen4Generator.generateImage(request));
      }

      // ASSERT
      expect(results.every((r) => r.success)).toBe(true);
      expect(mockGPUAccelerator.allocateMemory).toHaveBeenCalledTimes(10);
      expect(mockGPUAccelerator.releaseMemory).toHaveBeenCalledTimes(10);

      // Verify memory pooling efficiency
      const memoryMetrics = await imagen4Generator.getMemoryMetrics();
      expect(memoryMetrics.success).toBe(true);
      expect(memoryMetrics.data.poolEfficiency).toBeGreaterThan(0.8);
    });

    it("should implement aggressive memory cleanup under pressure", async () => {
      // ARRANGE
      mockGPUAccelerator.getAvailableMemory.mockReturnValue(1024); // Very low memory
      mockStorageManager.getStorageUsage.mockReturnValue({
        used: 90 * 1024 * 1024 * 1024, // 90GB used
        total: 100 * 1024 * 1024 * 1024, // 100GB total
        percentage: 90,
      });

      const request = {
        prompt: "Memory pressure test",
        resolution: { width: 2048, height: 2048 }, // High memory usage
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockStorageManager.cleanup).toHaveBeenCalled();
      expect(mockGPUAccelerator.releaseMemory).toHaveBeenCalled();
      expect(mockLogger.warn).toHaveBeenCalledWith(
        "Memory pressure detected, performing cleanup",
        expect.any(Object),
      );
    });

    it("should provide real-time resource utilization metrics", async () => {
      // ARRANGE
      const request = {
        prompt: "Resource monitoring test",
        resolution: { width: 1024, height: 1024 },
      };

      // ACT
      await imagen4Generator.generateImage(request);
      const resourceMetrics = await imagen4Generator.getResourceMetrics();

      // ASSERT
      expect(resourceMetrics.success).toBe(true);
      expect(resourceMetrics.data).toEqual(
        expect.objectContaining({
          gpu: expect.objectContaining({
            utilization: expect.any(Number),
            memoryUsed: expect.any(Number),
            memoryTotal: expect.any(Number),
          }),
          storage: expect.objectContaining({
            used: expect.any(Number),
            available: expect.any(Number),
            percentage: expect.any(Number),
          }),
          performance: expect.objectContaining({
            averageLatency: expect.any(Number),
            throughput: expect.any(Number),
            cacheHitRate: expect.any(Number),
          }),
        }),
      );
    });
  });

  // ==================== ADVANCED FEATURES PERFORMANCE ====================

  describe("Advanced Features Performance Optimization", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should coordinate style transfer with minimal performance overhead", async () => {
      // ARRANGE
      const request = {
        prompt: "Portrait of a person",
        styleReference: "van_gogh_style",
        resolution: { width: 1024, height: 1024 },
        styleStrength: 0.8,
      };

      const timer = mockPerformanceMonitor.startTimer();

      // ACT
      const result = await imagen4Generator.generateImageWithStyle(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockImageAIEngine.analyzeStyle).toHaveBeenCalled();

      const processingTime = mockPerformanceMonitor.endTimer(timer);
      expect(processingTime).toBeLessThan(
        mockConfig.performance.targetLatency * 1.5,
      ); // 50% overhead max
    });

    it("should implement performance-optimized image variations", async () => {
      // ARRANGE
      const baseRequest = {
        prompt: "Base image for variations",
        resolution: { width: 1024, height: 1024 },
      };

      const baseResult = await imagen4Generator.generateImage(baseRequest);
      const variationCount = 6;

      // ACT
      const variationsResult = await imagen4Generator.generateVariations(
        baseResult.data.id,
        variationCount,
      );

      // ASSERT
      expect(variationsResult.success).toBe(true);
      expect(variationsResult.data.variations).toHaveLength(variationCount);
      expect(mockRenderingPipeline.generateVariations).toHaveBeenCalledWith(
        expect.any(String),
        variationCount,
      );

      // Variations should be faster than generating from scratch
      expect(variationsResult.data.totalProcessingTime).toBeLessThan(
        mockConfig.performance.targetLatency * variationCount * 0.7,
      );
    });

    it("should coordinate inpainting with performance optimization", async () => {
      // ARRANGE
      const inpaintRequest = {
        baseImage: "base_image_data",
        maskImage: "mask_image_data",
        prompt: "Fill the masked area with flowers",
        resolution: { width: 1024, height: 1024 },
        inpaintStrength: 0.9,
      };

      // ACT
      const result = await imagen4Generator.inpaintImage(inpaintRequest);

      // ASSERT
      expect(result.success).toBe(true);
      expect(mockImageAIEngine.generateImage).toHaveBeenCalledWith(
        inpaintRequest.prompt,
        expect.objectContaining({
          mode: "inpaint",
          baseImage: inpaintRequest.baseImage,
          mask: inpaintRequest.maskImage,
        }),
      );
      expect(result.data.performance.generationTime).toBeLessThan(
        mockConfig.performance.targetLatency,
      );
    });
  });

  // ==================== CACHING AND OPTIMIZATION PERFORMANCE ====================

  describe("Caching and Performance Optimization Strategies", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should implement intelligent prompt caching for performance", async () => {
      // ARRANGE
      const identicalRequests = Array.from({ length: 3 }, () => ({
        prompt: "Cached prompt test",
        resolution: { width: 1024, height: 1024 },
        steps: 50,
        seed: 42, // Same seed for identical results
      }));

      // ACT
      const results = [];
      for (const request of identicalRequests) {
        results.push(await imagen4Generator.generateImage(request));
      }

      // ASSERT
      expect(results.every((r) => r.success)).toBe(true);

      // First generation should be normal speed, subsequent should be from cache
      expect(results[0].data.metadata.cached).toBe(false);
      expect(results[1].data.metadata.cached).toBe(true);
      expect(results[2].data.metadata.cached).toBe(true);

      // Cached results should be significantly faster
      expect(results[1].data.metadata.performance.generationTime).toBeLessThan(
        results[0].data.metadata.performance.generationTime * 0.1,
      );
    });

    it("should coordinate model warming for consistent performance", async () => {
      // ARRANGE
      await imagen4Generator.warmupModels([
        "photorealistic",
        "artistic",
        "cartoon",
      ]);

      const requests = [
        { prompt: "Photorealistic portrait", style: "photorealistic" },
        { prompt: "Artistic landscape", style: "artistic" },
        { prompt: "Cartoon character", style: "cartoon" },
      ];

      // ACT
      const results = await Promise.all(
        requests.map((req) => imagen4Generator.generateImage(req)),
      );

      // ASSERT
      expect(results.every((r) => r.success)).toBe(true);
      expect(mockImageAIEngine.preloadModels).toHaveBeenCalled();

      // All generations should be fast due to model warming
      results.forEach((result) => {
        expect(result.data.metadata.performance.generationTime).toBeLessThan(
          mockConfig.performance.targetLatency * 0.8,
        );
      });
    });

    it("should implement performance-based quality degradation", async () => {
      // ARRANGE
      mockGPUAccelerator.getCurrentUtilization.mockReturnValue(95); // High GPU load

      const request = {
        prompt: "Performance degradation test",
        resolution: { width: 2048, height: 2048 },
        quality: "ultra",
        adaptiveQuality: true,
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(true);
      expect(result.data.metadata.qualityAdjusted).toBe(true);
      expect(result.data.metadata.adjustmentReason).toBe(
        "performance_optimization",
      );
      expect(mockLogger.info).toHaveBeenCalledWith(
        "Adjusting quality for performance optimization",
        expect.any(Object),
      );
    });
  });

  // ==================== CONTRACT AND ERROR PERFORMANCE ====================

  describe("Contract Validation and Error Handling Performance", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should maintain service response contracts under all performance conditions", async () => {
      // ARRANGE & ACT
      const singleResult = await imagen4Generator.generateImage({
        prompt: "Contract test",
        resolution: { width: 1024, height: 1024 },
      });

      const batchResult = await imagen4Generator.generateBatch([
        { prompt: "Batch contract test 1" },
        { prompt: "Batch contract test 2" },
      ]);

      const metricsResult = await imagen4Generator.getPerformanceMetrics();

      // ASSERT
      ContractTester.validateServiceResponse(singleResult);
      ContractTester.validateServiceResponse(batchResult);
      ContractTester.validateServiceResponse(metricsResult);
    });

    it("should handle performance bottlenecks gracefully", async () => {
      // ARRANGE
      mockGPUAccelerator.allocateMemory.mockRejectedValue(
        new Error("Out of GPU memory"),
      );

      const request = {
        prompt: "Memory error test",
        resolution: { width: 4096, height: 4096 }, // Very high memory requirement
      };

      // ACT
      const result = await imagen4Generator.generateImage(request);

      // ASSERT
      expect(result.success).toBe(false);
      expect(result.error?.code).toBe("GPU_MEMORY_INSUFFICIENT");
      expect(mockLogger.error).toHaveBeenCalledWith(
        "GPU memory allocation failed",
        expect.any(Error),
      );
    });

    it("should meet performance SLA requirements consistently", async () => {
      // ARRANGE - Performance SLA test
      const performanceRequirements = {
        singleImageMaxLatency: 5000, // 5 seconds
        batchThroughput: 10, // images per minute
        memoryEfficiency: 0.8, // 80% efficiency
        successRate: 0.95, // 95% success rate
      };

      const testRequests = Array.from({ length: 20 }, (_, i) => ({
        prompt: `SLA test ${i}`,
        resolution: { width: 1024, height: 1024 },
      }));

      // ACT
      const startTime = Date.now();
      const results = await Promise.all(
        testRequests.map((req) => imagen4Generator.generateImage(req)),
      );
      const totalTime = Date.now() - startTime;

      // ASSERT
      const successfulResults = results.filter((r) => r.success);
      const successRate = successfulResults.length / results.length;
      const averageLatency = totalTime / results.length;
      const throughput = (successfulResults.length / totalTime) * 60000; // per minute

      expect(successRate).toBeGreaterThanOrEqual(
        performanceRequirements.successRate,
      );
      expect(averageLatency).toBeLessThanOrEqual(
        performanceRequirements.singleImageMaxLatency,
      );
      expect(throughput).toBeGreaterThanOrEqual(
        performanceRequirements.batchThroughput,
      );

      expect(mockLogger.info).toHaveBeenCalledWith(
        "Performance SLA validation completed",
        expect.objectContaining({
          successRate,
          averageLatency,
          throughput,
        }),
      );
    });
  });

  // ==================== PROPERTY-BASED PERFORMANCE TESTING ====================

  describe("Property-Based Performance Testing", () => {
    beforeEach(async () => {
      await imagen4Generator.initialize();
    });

    it("should maintain performance across diverse generation parameters", async () => {
      // ARRANGE - Property-based performance test
      const performanceTestCases = PropertyGenerator.generateTestCases(() => {
        const resolutions = [
          { width: 512, height: 512 },
          { width: 1024, height: 1024 },
          { width: 1920, height: 1080 },
          { width: 2048, height: 2048 },
        ];
        const qualities = ["draft", "standard", "high"];
        const steps = [20, 30, 50, 75];

        return {
          prompt: TestDataGenerator.randomString(30),
          resolution:
            resolutions[Math.floor(Math.random() * resolutions.length)],
          quality: qualities[Math.floor(Math.random() * qualities.length)],
          steps: steps[Math.floor(Math.random() * steps.length)],
        };
      }, 10);

      // ACT & ASSERT
      for (const testCase of performanceTestCases) {
        const startTime = Date.now();
        const result = await imagen4Generator.generateImage(testCase);
        const latency = Date.now() - startTime;

        expect(result.success).toBe(true);

        // Performance should scale predictably with parameters
        const expectedMaxLatency = calculateExpectedLatency(testCase);
        expect(latency).toBeLessThanOrEqual(expectedMaxLatency);
      }
    });

    // Helper function for expected latency calculation
    function calculateExpectedLatency(params: any): number {
      const baseLatency = 2000; // 2 seconds base
      const resolutionFactor =
        (params.resolution.width * params.resolution.height) / (1024 * 1024);
      const qualityFactor =
        { draft: 0.5, standard: 1.0, high: 1.5 }[params.quality] || 1.0;
      const stepsFactor = params.steps / 50;

      return baseLatency * resolutionFactor * qualityFactor * stepsFactor;
    }
  });
});

/**
 * RED-GREEN-REFACTOR CYCLE DOCUMENTATION FOR IMAGEN4 GENERATOR:
 *
 * This comprehensive test suite demonstrates London School TDD with performance focus:
 *
 * 1. PERFORMANCE-FIRST TESTING:
 *    - All operations tested against strict performance targets
 *    - GPU memory optimization and utilization tracking
 *    - Batch processing efficiency and throughput optimization
 *    - Caching strategies for improved response times
 *
 * 2. RESOURCE MANAGEMENT VALIDATION:
 *    - Memory allocation and cleanup coordination
 *    - GPU utilization optimization under various load conditions
 *    - Storage management with automated cleanup strategies
 *    - Performance degradation handling with adaptive quality
 *
 * 3. QUALITY-PERFORMANCE BALANCE:
 *    - Quality assessment integrated without performance impact
 *    - Automatic enhancement with performance constraints
 *    - Performance-based quality adaptation mechanisms
 *    - SLA compliance validation across diverse scenarios
 *
 * 4. LONDON SCHOOL PRINCIPLES WITH PERFORMANCE FOCUS:
 *    - RED: Define performance requirements through failing tests
 *    - GREEN: Implement coordination logic to meet performance targets
 *    - REFACTOR: Optimize performance while maintaining functional contracts
 *
 * Key Performance Collaboration Patterns Tested:
 * - GPUAccelerator ↔ MemoryManager (efficient memory allocation and pooling)
 * - BatchProcessor ↔ PerformanceMonitor (optimal batch sizing and throughput)
 * - CacheManager ↔ AIEngine (intelligent caching for repeated requests)
 * - QualityAssessor ↔ PerformanceOptimizer (quality assessment with minimal overhead)
 * - ResourceMonitor ↔ AdaptiveQuality (dynamic quality adjustment under load)
 *
 * This design ensures high-performance image generation while maintaining
 * quality standards and resource efficiency across various operating conditions.
 */
