/**
 * Image Generation Service
 *
 * AI-powered image generation with multi-provider support,
 * caching, and queue management.
 *
 * Features:
 * - Multiple AI providers: Imagen 4 Ultra, FLUX 1.1 Pro, DALL-E 3
 * - Cozy cartoon style optimized prompts
 * - Smart caching to avoid duplicate generations
 * - Queue system for batch processing
 * - Cost tracking and statistics
 *
 * Ported from Python ws/image_generation.py
 */

// Image Generator
export {
  ImageGenerator,
  imageGenerator,
  COZY_CARTOON_STYLE,
  STYLE_PRESETS,
  type ImageProvider,
  type ImageGenerationResult,
  type ImageGenerationOptions,
} from './image_generator.js';

// Database Operations
export {
  createImageTables,
  saveGeneratedImage,
  getCachedImage,
  getEventImageUrl,
  getImagesByCategory,
  getImageStats,
  rateImage,
  deactivateImage,
  mapEventToImage,
  type GeneratedImage,
  type QueueItem,
  type SaveImageOptions,
} from './database.js';

// Queue Management
export {
  addToGenerationQueue,
  getPendingQueueItems,
  processQueueItem,
  processGenerationQueue,
  getQueueStats,
  clearOldQueueItems,
  retryFailedItems,
} from './queue.js';

// ============================================================
// Convenience Functions
// ============================================================

import { imageGenerator } from './image_generator.js';
import { getCachedImage, saveGeneratedImage } from './database.js';
import type { ImageProvider } from './image_generator.js';

/**
 * Generate an image and cache it, or return cached version if available.
 * This is the main entry point for image generation.
 *
 * @param prompt - The image prompt
 * @param options - Generation options
 * @returns Image URL or null
 */
export async function generateAndCacheImage(
  prompt: string,
  options: {
    eventType?: string;
    eventCategory?: string;
    style?: string;
    provider?: ImageProvider;
    useCache?: boolean;
  } = {}
): Promise<string | null> {
  const {
    eventType,
    eventCategory,
    style = 'cozy_cartoon',
    provider,
    useCache = true,
  } = options;

  // Check cache first
  if (useCache) {
    const cached = await getCachedImage({ eventType, eventCategory });
    if (cached) {
      console.log(`Using cached image: ${cached.image_url}`);
      return cached.image_url;
    }
  }

  // Generate new image
  const result = await imageGenerator.generateImage(prompt, { style, provider });

  if (result.imageUrl) {
    // Save to cache
    await saveGeneratedImage({
      imageUrl: result.imageUrl,
      prompt,
      provider: provider ?? imageGenerator.getProvider(),
      eventType,
      eventCategory,
      stylePreset: style,
    });
    return result.imageUrl;
  }

  console.error(`Image generation failed: ${result.error}`);
  return null;
}

/**
 * Image service manager object for convenient access
 */
export const imageService = {
  generator: imageGenerator,
  generateAndCache: generateAndCacheImage,
};
