import { Achievement } from '@core/identity/domain/entities/Achievement';

describe('Achievement', () => {
  const baseProps = () => ({
    id: 'ach-1',
    name: 'First Win',
    description: 'Win your first race',
    category: 'driver' as const,
    rarity: 'common' as const,
    points: 10,
    requirements: [{ type: 'wins' as const, value: 1, operator: '>=' as const }],
    isSecret: false,
  });

  it('creates an Achievement with default iconUrl', () => {
    const a = Achievement.create(baseProps());

    expect(a.id).toBe('ach-1');
    expect(a.iconUrl).toBe('');
    expect(a.createdAt).toBeInstanceOf(Date);
  });

  it('throws if id is missing', () => {
    expect(() => Achievement.create({ ...baseProps(), id: '' })).toThrow(Error);
    expect(() => Achievement.create({ ...baseProps(), id: '   ' })).toThrow(Error);
  });

  it('throws if name is missing', () => {
    expect(() => Achievement.create({ ...baseProps(), name: '' })).toThrow(Error);
    expect(() => Achievement.create({ ...baseProps(), name: '   ' })).toThrow(Error);
  });

  it('throws if requirements is empty', () => {
    expect(() => Achievement.create({ ...baseProps(), requirements: [] })).toThrow(Error);
  });

  it('checkRequirements evaluates all requirements', () => {
    const a = Achievement.create({
      ...baseProps(),
      requirements: [
        { type: 'wins', value: 2, operator: '>=' },
        { type: 'podiums', value: 1, operator: '>=' },
      ],
    });

    expect(a.checkRequirements({ wins: 2, podiums: 1 })).toBe(true);
    expect(a.checkRequirements({ wins: 1, podiums: 1 })).toBe(false);
    expect(a.checkRequirements({ wins: 2 })).toBe(false);
  });

  it('getRarityColor returns the configured color', () => {
    expect(Achievement.create({ ...baseProps(), rarity: 'common' }).getRarityColor()).toBe('#9CA3AF');
    expect(Achievement.create({ ...baseProps(), rarity: 'legendary' }).getRarityColor()).toBe('#F59E0B');
  });

  it('hides name/description when secret', () => {
    const a = Achievement.create({ ...baseProps(), isSecret: true });

    expect(a.getDisplayName()).toBe('???');
    expect(a.getDisplayDescription()).toContain('secret');
  });
});