import { describe, it, expect } from 'vitest';
import { classifyTryOnError, TryOnRejectedError, isTryOnErrorCode } from './tryOnErrors';

describe('try-on rejection policy', () => {
  it.each([
    ['photo_body_hidden', 'photoBodyHidden', false, true],
    ['content_refused', 'refused', false, false],
    ['generation_refused', 'refused', false, false],
    ['quality_failed', 'qualityFailed', true, false],
    ['bad_image', 'unreadableImage', false, true],
  ] as const)('%s has localized recovery', (code, messageKey, retryable, photoProblem) => {
    expect(isTryOnErrorCode(code)).toBe(true);
    expect(classifyTryOnError(new TryOnRejectedError(code))).toEqual({messageKey, retryable, photoProblem});
  });
  it('honors a backend hard stop without making refusals retryable', () => {
    expect(classifyTryOnError(new TryOnRejectedError('quality_failed', false)).retryable).toBe(false);
    expect(classifyTryOnError(new TryOnRejectedError('content_refused', true)).retryable).toBe(false);
    expect(isTryOnErrorCode('private evaluator text')).toBe(false);
  });
  it.each([
    ['Try-on refused (flagged)', 'refused', false],
    ['Failed to fetch image', 'imageLoad', true],
    ['Could not load image', 'imageLoad', true],
    ['Failed to fetch', 'network', true],
    ['Network offline', 'network', true],
    ['request timed out', 'timeout', true],
    ['API error: 504', 'server', true],
    ['job failed', 'processingFailed', true],
    ['secret internal message', 'unexpected', true],
  ])('classifies legacy %s', (message, messageKey, retryable) => {
    expect(classifyTryOnError(new Error(message))).toMatchObject({messageKey, retryable});
  });
  it('never exposes unknown values', () => {
    expect(classifyTryOnError(null).messageKey).toBe('unexpected');
  });
});
