export interface ScanOptions {
  source?: 'camera' | 'library' | 'image';
  sourceImageUrl?: string;
  multiPage?: boolean;
  defaultFilter?: string;
  availableFilters?: string[];
  pdfPageSize?: 'fit' | 'a4' | 'letter';
  postProcessingActions?: string[];
  flashButtonHidden?: boolean;
  defaultFlashMode?: 'auto' | 'on' | 'off';
  backgroundColor?: string;
  foregroundColor?: string;
  highlightColor?: string;
  menuColor?: string;
  ocrConfiguration?: {
    languages: string[];
    outputFormats?: string[];
  };
  structuredData?: string[];
  structuredDataBarcodeTypes?: string[];
  jpegQuality?: number;
  pdfMaxScanDimension?: number;
  multiPageFormat?: 'none' | 'pdf' | 'tiff';
  pdfFontFileUrl?: string;
}

export interface BarcodeConfiguration {
  isBatchModeEnabled?: boolean;
  supportedCodeTypes?: string[];
}

export interface Scan {
  originalUrl: string;
  enhancedUrl: string;
  ocrResult?: {
    text: string;
    hocrTextLayout?: string;
  };
  structuredData?: any;
}

export interface ScanResult {
  pdfURL?: string;
  multiPageDocumentUrl?: string;
  scans: Scan[];
}

export interface Barcode {
  value: string;
  type: string;
}

export interface BarcodeResult {
  barcodes: Barcode[];
}

export interface DocumentGeneratorConfiguration {
  outputFileUrl: string;
  pdfFontFileUrl?: string;
}

export interface PDFPage {
  imageUrl: string;
  hocrTextLayout?: string;
}

export interface PDFDocument {
  pages: PDFPage[];
}

declare const GeniusScan: {
  scanWithConfiguration(options?: ScanOptions): Promise<ScanResult>;
  scanBarcodesWithConfiguration(configuration?: BarcodeConfiguration): Promise<BarcodeResult>;
  generateDocument(document: PDFDocument, configuration: DocumentGeneratorConfiguration): Promise<void>;
  setLicenseKey(licenseKey: string, autoRefresh: boolean): Promise<void>;
};

export default GeniusScan;
