/**
 * Supported converter engines
 */
export type ConverterEngine = 'ffmpeg' | 'imagemagick';

/**
 * File category based on type
 */
export type FileCategory = 'video' | 'audio' | 'image';

/**
 * Conversion status
 */
export type ConversionStatus = 'pending' | 'loading' | 'processing' | 'completed' | 'error';

/**
 * Supported conversion format
 */
export interface ConversionFormat {
  id: string;
  name: string;
  extension: string;
  mimeType: string;
  category: FileCategory;
  converter: ConverterEngine;
  description?: string;
}

/**
 * Conversion job configuration
 */
export interface ConversionJob {
  id: string;
  inputFile: File;
  inputFormat: ConversionFormat;
  outputFormat: ConversionFormat;
  options: ConversionOptions;
  status: ConversionStatus;
  progress: number;
  result?: Blob;
  error?: string;
  startTime?: number;
  endTime?: number;
}

/**
 * Generic conversion options
 */
export interface ConversionOptions {
  // Video options
  videoBitrate?: string;
  videoCodec?: string;
  videoResolution?: string;
  videoFps?: number;

  // Audio options
  audioBitrate?: string;
  audioCodec?: string;
  audioSampleRate?: number;
  audioChannels?: number;

  // Image options
  imageQuality?: number;
  imageWidth?: number;
  imageHeight?: number;
  imageFormat?: string;

  // Generic options
  [key: string]: string | number | boolean | undefined;
}

/**
 * History item for conversion history
 */
export interface ConversionHistoryItem {
  id: string;
  inputFileName: string;
  inputFormat: string;
  outputFormat: string;
  outputFileName: string;
  timestamp: number;
  fileSize: number;
  result?: Blob;
}

/**
 * Format preset for common conversions
 */
export interface FormatPreset {
  id: string;
  name: string;
  description: string;
  category: FileCategory;
  sourceFormats: string[];
  targetFormat: string;
  options: ConversionOptions;
  icon?: string;
}

/**
 * WASM module loading state
 */
export interface WASMModuleState {
  ffmpeg: boolean;
  imagemagick: boolean;
}

/**
 * Progress callback for conversion
 */
export type ProgressCallback = (progress: number) => void;

/**
 * Conversion result
 */
export interface ConversionResult {
  success: boolean;
  blob?: Blob;
  error?: string;
  duration?: number;
}
