import { describe, expect, it } from 'vitest';

import { resolveUploadErrorDialog } from '../uploadErrorDialog';

const translations = new Map<string, string>([
  ['upload.dialogs.photoLimit.title', 'Upload-Limit erreicht'],
  ['upload.dialogs.photoLimit.description', 'Es wurden {used} von {limit} Fotos hochgeladen. Es bleiben {remaining}.'],
  ['upload.dialogs.photoLimit.hint', 'Wende dich an das Team.'],
  ['upload.dialogs.deviceLimit.title', 'Dieses Gerät ist voll'],
  ['upload.dialogs.deviceLimit.description', 'Du hast das Geräte-Limit erreicht.'],
  ['upload.dialogs.deviceLimit.hint', 'Nutze ein anderes Gerät oder kontaktiere das Team.'],
  ['upload.dialogs.packageMissing.title', 'Event nicht bereit'],
  ['upload.dialogs.packageMissing.description', 'Das Event akzeptiert aktuell keine Uploads.'],
  ['upload.dialogs.packageMissing.hint', 'Frag die Veranstalter:innen nach dem Status.'],
  ['upload.dialogs.galleryExpired.title', 'Galerie abgelaufen'],
  ['upload.dialogs.galleryExpired.description', 'Uploads sind nicht mehr möglich.'],
  ['upload.dialogs.galleryExpired.hint', 'Bitte wende dich an die Veranstalter:innen.'],
  ['upload.dialogs.csrf.title', 'Sicherheitsabgleich erforderlich'],
  ['upload.dialogs.csrf.description', 'Bitte lade die Seite neu und versuche es erneut.'],
  ['upload.dialogs.csrf.hint', 'Aktualisiere die Seite.'],
  ['upload.dialogs.generic.title', 'Upload fehlgeschlagen'],
  ['upload.dialogs.generic.description', 'Der Upload konnte nicht abgeschlossen werden.'],
  ['upload.dialogs.generic.hint', 'Versuche es später erneut.'],
]);

const t = (key: string) => translations.get(key) ?? key;

describe('resolveUploadErrorDialog', () => {
  it('renders photo limit dialog with placeholders', () => {
    const dialog = resolveUploadErrorDialog(
      'photo_limit_exceeded',
      { used: 120, limit: 120, remaining: 0 },
      t
    );

    expect(dialog.title).toBe('Upload-Limit erreicht');
    expect(dialog.description).toBe('Es wurden 120 von 120 Fotos hochgeladen. Es bleiben 0.');
    expect(dialog.hint).toBe('Wende dich an das Team.');
    expect(dialog.tone).toBe('danger');
  });

  it('falls back to generic dialog when code is unknown', () => {
    const dialog = resolveUploadErrorDialog('something_else', undefined, t);

    expect(dialog.tone).toBe('info');
    expect(dialog.title).toBe('Upload fehlgeschlagen');
    expect(dialog.description).toBe('Der Upload konnte nicht abgeschlossen werden.');
  });
});
