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

import { VibeId } from './config/types';
import { createVibeUri, getVibeIdFromUri } from './vibe-uri';

describe('vibe URI handling', () => {
  it('loads vibes from slug IDs and display names', () => {
    expect(getVibeIdFromUri('https://example.test/?vibe=aurora-mycelium')).toBe(
      VibeId.AuroraMycelium
    );
    expect(getVibeIdFromUri('https://example.test/?vibe=Aurora%20Mycelium')).toBe(
      VibeId.AuroraMycelium
    );
    expect(
      getVibeIdFromUri('https://example.test/?vibe=Velvet%20Observatory')
    ).toBe(VibeId.VelvetObservatory);
  });

  it('uses query values before path or hash fallbacks', () => {
    expect(
      getVibeIdFromUri(
        'https://example.test/chrome-pollen?vibe=lichen-signal#vibe=aurora-mycelium'
      )
    ).toBe(VibeId.LichenSignal);
  });

  it('accepts explicit path segments and hash fallbacks', () => {
    expect(getVibeIdFromUri('https://example.test/vibes/tidepool-lantern')).toBe(
      VibeId.TidepoolLantern
    );
    expect(getVibeIdFromUri('https://example.test/#paper-lantern-fog')).toBe(
      VibeId.PaperLanternFog
    );
  });

  it('ignores unknown or malformed vibe values', () => {
    expect(getVibeIdFromUri('https://example.test/?vibe=missing')).toBeNull();
    expect(getVibeIdFromUri('https://example.test/?vibe=%E0%A4%A')).toBeNull();
    expect(getVibeIdFromUri('not a url')).toBeNull();
  });

  it('creates a canonical query URI without dropping other URL parts', () => {
    expect(
      createVibeUri('https://example.test/garden?debug=1#panel', VibeId.ChromePollen)
    ).toBe('/garden?debug=1&vibe=chrome-pollen#panel');

    expect(
      createVibeUri(
        'https://example.test/garden?vibe=aurora-mycelium&debug=1',
        VibeId.LichenSignal
      )
    ).toBe('/garden?vibe=lichen-signal&debug=1');
  });
});
