import { tap, expect } from '@git.zone/tstest/tapbundle';
import { createMistralOcrEngine, type ISmartAiMistralOcrTransport } from '../ts_ocr/index.js';

tap.test('createMistralOcrEngine should call Mistral OCR with image data URLs', async () => {
  const calls: unknown[] = [];
  const mockTransport: ISmartAiMistralOcrTransport = {
    process: async (request) => {
      calls.push(request);
      return {
        pages: [
          {
            index: 0,
            markdown: 'hello terminal',
            confidence_scores: {
              average_page_confidence_score: 0.91,
              minimum_page_confidence_score: 0.8,
            },
          },
        ],
        model: 'mistral-ocr-latest',
        usage_info: {
          pages_processed: 1,
          doc_size_bytes: 12,
        },
      };
    },
  };

  const ocrEngine = createMistralOcrEngine({
    transport: mockTransport,
    confidenceScoresGranularity: 'page',
  });

  const result = await ocrEngine.recognizeImage({
    dataBase64: 'iVBORw0KGgo=',
    mimeType: 'image/png',
  });

  expect(calls.length).toEqual(1);
  expect((calls[0] as any).model).toEqual('mistral-ocr-latest');
  expect((calls[0] as any).document.type).toEqual('image_url');
  expect((calls[0] as any).document.image_url).toEqual('data:image/png;base64,iVBORw0KGgo=');
  expect((calls[0] as any).confidence_scores_granularity).toEqual('page');
  expect(result.text).toEqual('hello terminal');
  expect(result.confidence).toEqual(0.91);
  expect(result.pages).toEqual([
    {
      index: 0,
      text: 'hello terminal',
      confidence: 0.91,
    },
  ]);
});

tap.test('createMistralOcrEngine should validate image input', async () => {
  const ocrEngine = createMistralOcrEngine({
    transport: {
      process: async () => {
        throw new Error('should not call OCR');
      },
    },
  });

  let error: Error | undefined;
  try {
    await ocrEngine.recognizeImage({
      dataBase64: '',
      mimeType: 'image/png',
    });
  } catch (caughtError) {
    error = caughtError instanceof Error ? caughtError : new Error(String(caughtError));
  }

  expect(error?.message).toEqual('Mistral OCR image input requires dataBase64.');
});

export default tap.start();
