import {pillToneForType, formatEventDateParts, groupEventsByDay, cleanEventTitle} from './eventDisplay';

describe('pillToneForType', () => {
  it('shouldMapFestNozAndFestDeizToOrange', () => {
    expect(pillToneForType('Fest-noz')).toBe('orange');
    expect(pillToneForType('Fest-deiz')).toBe('orange');
    expect(pillToneForType('FEST NOZ')).toBe('orange');
  });

  it('shouldMapConcertToBlue', () => {
    expect(pillToneForType('Concert')).toBe('blue');
    expect(pillToneForType('concert de soutien')).toBe('blue');
  });

  it('shouldMapStageAndSpectacleToOlive', () => {
    expect(pillToneForType('Stage')).toBe('olive');
    expect(pillToneForType('Spectacle')).toBe('olive');
    expect(pillToneForType('Atelier')).toBe('olive');
  });

  it('shouldFallBackToNeutralForUnknownTypes', () => {
    expect(pillToneForType('Conférence')).toBe('neutral');
    expect(pillToneForType(null)).toBe('neutral');
    expect(pillToneForType(undefined)).toBe('neutral');
  });
});

describe('formatEventDateParts', () => {
  it('shouldFormatFrenchDateParts', () => {
    const parts = formatEventDateParts('2026-07-18', 'fr');
    expect(parts.day).toBe('18');
    expect(parts.dow.toLowerCase()).toContain('sam');
    expect(parts.month.toLowerCase()).toContain('juil');
  });

  it('shouldFallBackToFrenchForUnknownLocale', () => {
    const parts = formatEventDateParts('2026-07-18', 'xx');
    expect(parts.day).toBe('18');
  });

  it('shouldReturnEmptyPartsForInvalidDate', () => {
    const parts = formatEventDateParts('not-a-date', 'fr');
    expect(parts.day).toBe('');
    expect(parts.dow).toBe('');
    expect(parts.month).toBe('');
  });
});

describe('groupEventsByDay', () => {
  const events = [
    {eveId: 1, eveDate: '2026-07-19'},
    {eveId: 2, eveDate: '2026-07-18'},
    {eveId: 3, eveDate: '2026-07-18'},
    {eveId: 4, eveDate: '2026-07-21'},
  ];

  it('shouldGroupEventsByDateSortedChronologically', () => {
    const groups = groupEventsByDay(events, 'fr');
    expect(groups.map((g) => g.key)).toEqual(['2026-07-18', '2026-07-19', '2026-07-21']);
    expect(groups[0].events.map((e: {eveId: number}) => e.eveId)).toEqual([2, 3]);
    expect(groups[1].events.length).toBe(1);
  });

  it('shouldProvideLocalizedDayLabel', () => {
    const groups = groupEventsByDay(events, 'fr');
    expect(groups[0].label.toLowerCase()).toContain('samedi');
    expect(groups[0].label).toContain('18');
    expect(groups[0].label.toLowerCase()).toContain('juillet');
  });

  it('shouldIgnoreEventsWithInvalidDates', () => {
    const groups = groupEventsByDay([{eveId: 1, eveDate: 'invalid'}], 'fr');
    expect(groups).toEqual([]);
  });
});

describe('cleanEventTitle', () => {
  it('shouldStripHtmlTagsAndCollapseWhitespace', () => {
    expect(cleanEventTitle('Régalades 2026<br> 18h30: Initiation<br>21h30 : fest-noz'))
      .toBe('Régalades 2026 18h30: Initiation 21h30 : fest-noz');
  });

  it('shouldReturnEmptyStringForNullish', () => {
    expect(cleanEventTitle(null)).toBe('');
    expect(cleanEventTitle(undefined)).toBe('');
  });
});
