import {artisteDisplayName, artisteTitle, evenementLibelle, ficheMetadata, stageLibelle, villeTitle} from './ficheTitle';

const barou = {aenPrenom: 'Sylvain', aenPatronyme: 'BAROU', aenLibelle: 'BAROU Sylvain'};

describe('artisteDisplayName', () => {
  it('shouldJoinFirstNameAndLastName', () => {
    expect(artisteDisplayName(barou)).toBe('Sylvain BAROU');
  });

  it.each([
    ['prénom manquant', {...barou, aenPrenom: null}],
    ['nom manquant', {...barou, aenPatronyme: ''}],
    ['prénom vide', {...barou, aenPrenom: '  '}],
  ])('shouldFallBackToTheEntryLabelWhen %s', (_label, aen) => {
    expect(artisteDisplayName(aen)).toBe('BAROU Sylvain');
  });
});

describe('artisteTitle', () => {
  it('shouldBuildTheDocumentTitleFromTheDisplayName', () => {
    expect(artisteTitle(barou)).toBe('Sylvain BAROU - Tamm-Kreiz');
  });

  it('shouldFallBackToTheSiteNameWithoutArtiste', () => {
    expect(artisteTitle(null)).toBe('Tamm-Kreiz');
  });
});

describe('ficheMetadata', () => {
  it('shouldBuildTheTitleFromTheLoadedLabel', async () => {
    expect(await ficheMetadata(async () => 'Bagad Kemper')).toEqual({title: 'Bagad Kemper - Tamm-Kreiz'});
  });

  it('shouldFallBackToTheSiteNameWhenLoadingFails', async () => {
    expect(await ficheMetadata(async () => {
      throw new Error('Network error');
    })).toEqual({title: 'Tamm-Kreiz'});
  });
});

describe('villeTitle', () => {
  const rennes = {vilNom: 'Rennes', vilPay: {payCode: 'FR', payNom: 'France'}, vilSub2: {subNom: 'Ille-et-Vilaine'}};

  it('shouldNameTheVilleAndItsDepartement', () => {
    expect(villeTitle(rennes)).toBe('Rennes - Ille-et-Vilaine - Tamm-Kreiz');
  });

  it('shouldNameTheCountryInsteadOfTheDepartementOutsideFrance', () => {
    const cardiff = {vilNom: 'Cardiff', vilPay: {payCode: 'GB', payNom: 'Royaume-Uni'}, vilSub2: {subNom: 'Wales'}};

    expect(villeTitle(cardiff)).toBe('Cardiff - Royaume-Uni - Tamm-Kreiz');
  });

  it('shouldRecogniseFranceByNameWhenTheCodeIsMissing', () => {
    expect(villeTitle({...rennes, vilPay: {payNom: 'France'}})).toBe('Rennes - Ille-et-Vilaine - Tamm-Kreiz');
  });

  it('shouldFallBackToTheVilleNameWithoutDepartement', () => {
    expect(villeTitle({vilNom: 'Rennes', vilPay: {payCode: 'FR', payNom: 'France'}})).toBe('Rennes - Tamm-Kreiz');
  });
});

describe('evenementLibelle', () => {
  const festNoz = {eveTev: {tevLibelle: 'Fest-noz'}, eveVil: {vilNom: 'Rennes'}};

  it('shouldJoinTypeVilleAndTheLongDate', () => {
    expect(evenementLibelle(festNoz, 'samedi 20 septembre 2026')).toBe('Fest-noz à Rennes, samedi 20 septembre 2026');
  });

  it('shouldSkipTheDateWhenItIsUnknown', () => {
    expect(evenementLibelle(festNoz, '')).toBe('Fest-noz à Rennes');
  });

  it('shouldSkipTheVilleWhenItIsUnknown', () => {
    expect(evenementLibelle({eveTev: {tevLibelle: 'Fest-noz'}, eveVil: null}, 'samedi 20 septembre 2026')).toBe(
      'Fest-noz, samedi 20 septembre 2026'
    );
  });
});

describe('stageLibelle', () => {
  const bombarde = {type: 'Stage', lieu: 'Rennes 35000', dateDebut: '2026-10-03', locale: 'fr'};

  it('shouldJoinTypeLieuAndTheLongDate', () => {
    expect(stageLibelle(bombarde)).toBe('Stage à Rennes 35000, samedi 3 octobre 2026');
  });

  it('shouldSpanTheDatesWhenTheStageLastsSeveralDays', () => {
    expect(stageLibelle({...bombarde, dateFin: '2026-10-04'})).toBe(
      'Stage à Rennes 35000, du samedi 3 octobre 2026 au dimanche 4 octobre 2026'
    );
  });

  it('shouldIgnoreAnEndDateEqualToTheStart', () => {
    expect(stageLibelle({...bombarde, dateFin: '2026-10-03'})).toBe('Stage à Rennes 35000, samedi 3 octobre 2026');
  });

  it('shouldWordTheSpanInTheLanguageOfThePage', () => {
    expect(stageLibelle({...bombarde, dateFin: '2026-10-04', locale: 'en'})).toBe(
      'Stage à Rennes 35000, from Saturday, October 3, 2026 to Sunday, October 4, 2026'
    );
  });

  it('shouldSkipTheLieuWhenItIsUnknown', () => {
    expect(stageLibelle({...bombarde, lieu: ''})).toBe('Stage, samedi 3 octobre 2026');
  });
});
