import { describe, it, expect } from 'vitest';
import { renderToStaticMarkup } from 'react-dom/server';

import { getPlatformStyle, PlatformBadge, PlatformIcon } from '@/lib/platform-style';

describe('getPlatformStyle', () => {
  const knownPlatforms = ['claude', 'anthropic', 'openai', 'codex', 'gemini', 'google', 'sora', 'antigravity'];

  it.each(knownPlatforms)('should return correct label and non-empty icon for "%s"', (platform) => {
    const style = getPlatformStyle(platform);
    // label should be the capitalised form, not empty
    expect(style.label).toBeTruthy();
    expect(style.icon).toBeTruthy();
  });

  it('anthropic and claude should share the same badge style', () => {
    const claude = getPlatformStyle('claude');
    const anthropic = getPlatformStyle('anthropic');
    expect(claude.badge).toBe(anthropic.badge);
  });

  it('openai and codex should share the same badge style', () => {
    const openai = getPlatformStyle('openai');
    const codex = getPlatformStyle('codex');
    expect(openai.badge).toBe(codex.badge);
  });

  it('gemini and google should share the same badge style', () => {
    const gemini = getPlatformStyle('gemini');
    const google = getPlatformStyle('google');
    expect(gemini.badge).toBe(google.badge);
  });

  it('should be case-insensitive ("OpenAI" and "openai" return same result)', () => {
    const upper = getPlatformStyle('OpenAI');
    const lower = getPlatformStyle('openai');
    expect(upper).toEqual(lower);
  });

  it('should return fallback grey style for unknown platform', () => {
    const style = getPlatformStyle('unknownService');
    expect(style.badge).toContain('slate');
    expect(style.label).toBe('unknownService');
    expect(style.icon).toBe('');
  });
});

describe('PlatformBadge', () => {
  it('should render output containing the correct label text', () => {
    const html = renderToStaticMarkup(PlatformBadge({ platform: 'claude' }));
    expect(html).toContain('Claude');
  });

  it('should render fallback label for unknown platform', () => {
    const html = renderToStaticMarkup(PlatformBadge({ platform: 'myPlatform' }));
    expect(html).toContain('myPlatform');
  });
});

describe('PlatformIcon', () => {
  it('should return non-null for known platforms', () => {
    const icon = PlatformIcon({ platform: 'openai' });
    expect(icon).not.toBeNull();
  });

  it('should return null for unknown platform (empty icon)', () => {
    const icon = PlatformIcon({ platform: 'unknownPlatform' });
    expect(icon).toBeNull();
  });
});
