// @vitest-environment happy-dom

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

import { applyFavicon, EMPTY_FAVICON, normalizeBrandPath, resolveBrandAssetUrl } from '../systemBrand';

class MockImage {
  get src() {
    return '';
  }

  set src(value: string) {
    queueMicrotask(() => this.listeners.get(value.includes('broken') ? 'error' : 'load')?.());
  }

  private listeners = new Map<string, () => void>();

  addEventListener(type: string, listener: () => void) {
    this.listeners.set(type, listener);
  }
}

describe('systemBrand', () => {
  beforeEach(() => {
    document.head.innerHTML = '<link rel="icon" href="data:,">';
    vi.stubGlobal('Image', MockImage);
  });

  it('normalizes empty and invalid persisted values', () => {
    expect(normalizeBrandPath()).toBe('');
    expect(normalizeBrandPath('  ')).toBe('');
    expect(normalizeBrandPath('null')).toBe('');
    expect(normalizeBrandPath(' Undefined ')).toBe('');
    expect(normalizeBrandPath(' /file/logo.png ')).toBe('/file/logo.png');
  });

  it('resolves relative paths without changing absolute resources', () => {
    expect(resolveBrandAssetUrl('/file/logo.png', '/dev/')).toBe('/dev/file/logo.png');
    expect(resolveBrandAssetUrl('file/logo.png', '/dev')).toBe('/dev/file/logo.png');
    expect(resolveBrandAssetUrl('https://cdn.example.com/logo.png', '/dev')).toBe('https://cdn.example.com/logo.png');
    expect(resolveBrandAssetUrl('data:image/png;base64,abc', '/dev')).toBe('data:image/png;base64,abc');
  });

  it('uses the configured favicon after it loads', async () => {
    await applyFavicon('/dev/file/favicon.png');

    expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe('/dev/file/favicon.png');
  });

  it('clears the favicon for empty or failed resources', async () => {
    await applyFavicon('');
    expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe(EMPTY_FAVICON);

    await applyFavicon('/broken/favicon.png');
    expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe(EMPTY_FAVICON);
  });
});
