/**
 * Tests for the theme utility
 */

import {
  STATUS_COLORS,
  BADGE_COLORS,
  BUTTON_STYLES,
  INPUT_STYLES,
  CARD_STYLES,
  ALERT_STYLES,
  ROLE_COLORS,
  PRIZE_COLORS,
  getStatusColor,
  getButtonStyle,
  getInputStyle,
  getRoleColor,
  getPrizeColor,
} from '@/utils/theme';

describe('Theme Utility', () => {
  describe('Constants', () => {
    it('should have all status colors defined', () => {
      expect(STATUS_COLORS.PENDING).toBe('bg-secondary-100 text-secondary-800');
      expect(STATUS_COLORS.CLAIMED).toBe('bg-primary-100 text-primary-800');
      expect(STATUS_COLORS.REJECTED).toBe('bg-red-100 text-red-800');
      expect(STATUS_COLORS.ACTIVE).toBe('bg-primary-100 text-primary-800');
      expect(STATUS_COLORS.INACTIVE).toBe('bg-gray-100 text-gray-800');
      expect(STATUS_COLORS.EXPIRED).toBe('bg-red-100 text-red-800');
    });

    it('should have all badge colors defined', () => {
      expect(BADGE_COLORS.info).toBe('bg-blue-100 text-blue-800');
      expect(BADGE_COLORS.success).toBe('bg-primary-100 text-primary-800');
      expect(BADGE_COLORS.warning).toBe('bg-secondary-100 text-secondary-800');
      expect(BADGE_COLORS.error).toBe('bg-red-100 text-red-800');
      expect(BADGE_COLORS.purple).toBe('bg-purple-100 text-purple-800');
      expect(BADGE_COLORS.pink).toBe('bg-pink-100 text-pink-800');
      expect(BADGE_COLORS.amber).toBe('bg-secondary-200 text-secondary-800');
      expect(BADGE_COLORS.gray).toBe('bg-gray-100 text-gray-800');
    });

    it('should have all button styles defined', () => {
      expect(BUTTON_STYLES.primary).toContain('bg-primary-500');
      expect(BUTTON_STYLES.secondary).toContain('bg-secondary-500');
      expect(BUTTON_STYLES.success).toContain('bg-primary-500');
      expect(BUTTON_STYLES.danger).toContain('bg-red-600');
      expect(BUTTON_STYLES.warning).toContain('bg-secondary-400');
      expect(BUTTON_STYLES.outline).toContain('border-primary-500');
      expect(BUTTON_STYLES.ghost).toContain('text-gray-600');
    });

    it('should have input styles defined', () => {
      expect(INPUT_STYLES.base).toContain('w-full');
      expect(INPUT_STYLES.base).toContain('rounded-lg');
      expect(INPUT_STYLES.error).toBe('border-red-500');
      expect(INPUT_STYLES.normal).toBe('border-gray-300');
    });

    it('should have card styles defined', () => {
      expect(CARD_STYLES.base).toContain('bg-white');
      expect(CARD_STYLES.base).toContain('rounded-lg');
      expect(CARD_STYLES.hover).toContain('hover:shadow-lg');
      expect(CARD_STYLES.bordered).toContain('border-gray-200');
    });

    it('should have alert styles defined', () => {
      expect(ALERT_STYLES.info).toContain('bg-blue-50');
      expect(ALERT_STYLES.success).toContain('bg-green-50');
      expect(ALERT_STYLES.warning).toContain('bg-yellow-50');
      expect(ALERT_STYLES.error).toContain('bg-red-50');
    });

    it('should have role colors defined', () => {
      expect(ROLE_COLORS.ADMIN).toBe('bg-red-100 text-red-800');
      expect(ROLE_COLORS.EMPLOYEE).toBe('bg-blue-100 text-blue-800');
      expect(ROLE_COLORS.CLIENT).toBe('bg-primary-100 text-primary-800');
    });

    it('should have prize colors defined', () => {
      expect(PRIZE_COLORS.INFUSEUR).toBe('bg-blue-100 text-blue-800');
      expect(PRIZE_COLORS.THE_SIGNATURE).toBe('bg-primary-100 text-primary-800');
      expect(PRIZE_COLORS.COFFRET_DECOUVERTE).toBe('bg-purple-100 text-purple-800');
      expect(PRIZE_COLORS.COFFRET_PRESTIGE).toBe('bg-secondary-200 text-secondary-800');
      expect(PRIZE_COLORS.THE_GRATUIT).toBe('bg-pink-100 text-pink-800');
    });
  });

  describe('getStatusColor', () => {
    it('should return correct color for known statuses', () => {
      expect(getStatusColor('PENDING')).toBe('bg-secondary-100 text-secondary-800');
      expect(getStatusColor('CLAIMED')).toBe('bg-primary-100 text-primary-800');
      expect(getStatusColor('REJECTED')).toBe('bg-red-100 text-red-800');
    });

    it('should handle lowercase statuses', () => {
      expect(getStatusColor('pending')).toBe('bg-secondary-100 text-secondary-800');
      expect(getStatusColor('claimed')).toBe('bg-primary-100 text-primary-800');
    });

    it('should return gray for unknown statuses', () => {
      expect(getStatusColor('UNKNOWN')).toBe('bg-gray-100 text-gray-800');
      expect(getStatusColor('random')).toBe('bg-gray-100 text-gray-800');
    });
  });

  describe('getButtonStyle', () => {
    it('should return primary style by default', () => {
      expect(getButtonStyle()).toContain('bg-primary-500');
    });

    it('should return correct style for variant', () => {
      expect(getButtonStyle('primary')).toContain('bg-primary-500');
      expect(getButtonStyle('secondary')).toContain('bg-secondary-500');
      expect(getButtonStyle('success')).toContain('bg-primary-500');
      expect(getButtonStyle('danger')).toContain('bg-red-600');
      expect(getButtonStyle('warning')).toContain('bg-secondary-400');
      expect(getButtonStyle('outline')).toContain('border-primary-500');
      expect(getButtonStyle('ghost')).toContain('text-gray-600');
    });
  });

  describe('getInputStyle', () => {
    it('should return normal input style when no error', () => {
      const style = getInputStyle(false);
      expect(style).toContain('w-full');
      expect(style).toContain('border-gray-300');
      expect(style).not.toContain('border-red-500');
    });

    it('should return error input style when has error', () => {
      const style = getInputStyle(true);
      expect(style).toContain('w-full');
      expect(style).toContain('border-red-500');
      expect(style).not.toContain('border-gray-300');
    });
  });

  describe('getRoleColor', () => {
    it('should return correct color for known roles', () => {
      expect(getRoleColor('ADMIN')).toBe('bg-red-100 text-red-800');
      expect(getRoleColor('EMPLOYEE')).toBe('bg-blue-100 text-blue-800');
      expect(getRoleColor('CLIENT')).toBe('bg-primary-100 text-primary-800');
    });

    it('should handle lowercase roles', () => {
      expect(getRoleColor('admin')).toBe('bg-red-100 text-red-800');
      expect(getRoleColor('employee')).toBe('bg-blue-100 text-blue-800');
      expect(getRoleColor('client')).toBe('bg-primary-100 text-primary-800');
    });

    it('should return gray for unknown roles', () => {
      expect(getRoleColor('UNKNOWN')).toBe('bg-gray-100 text-gray-800');
    });
  });

  describe('getPrizeColor', () => {
    it('should return correct color for known prize types', () => {
      expect(getPrizeColor('INFUSEUR')).toBe('bg-blue-100 text-blue-800');
      expect(getPrizeColor('THE_SIGNATURE')).toBe('bg-primary-100 text-primary-800');
      expect(getPrizeColor('COFFRET_DECOUVERTE')).toBe('bg-purple-100 text-purple-800');
      expect(getPrizeColor('COFFRET_PRESTIGE')).toBe('bg-secondary-200 text-secondary-800');
      expect(getPrizeColor('THE_GRATUIT')).toBe('bg-pink-100 text-pink-800');
    });

    it('should handle lowercase prize types', () => {
      expect(getPrizeColor('infuseur')).toBe('bg-blue-100 text-blue-800');
    });

    it('should return gray for unknown prize types', () => {
      expect(getPrizeColor('UNKNOWN')).toBe('bg-gray-100 text-gray-800');
    });
  });
});
