import { render } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';

import MarketplaceAlert, {
  type MarketplaceAlertProps,
} from './MarketplaceAlert';

describe('MarketplaceAlert', () => {
  const defaultProps: MarketplaceAlertProps = {
    title: 'Test Alert',
    text: 'This is a test alert message',
    variant: 'info',
  };

  it('renders with default props', () => {
    const { asFragment } = render(<MarketplaceAlert {...defaultProps} />);
    expect(asFragment()).toMatchSnapshot();
  });

  describe('variants', () => {
    const variants: Array<MarketplaceAlertProps['variant']> = [
      'info',
      'warning',
      'success',
      'error',
    ];

    variants.forEach((variant) => {
      it(`renders ${variant} variant correctly`, () => {
        const { asFragment } = render(
          <MarketplaceAlert {...defaultProps} variant={variant} />
        );
        expect(asFragment()).toMatchSnapshot();
      });
    });
  });

  it('renders without text', () => {
    const { asFragment } = render(
      <MarketplaceAlert title='Title Only' variant='info' />
    );
    expect(asFragment()).toMatchSnapshot();
  });

  it('renders with custom icon', () => {
    const { asFragment } = render(
      <MarketplaceAlert
        {...defaultProps}
        icon={<svg data-testid='custom-icon' />}
      />
    );
    expect(asFragment()).toMatchSnapshot();
  });

  it('renders with buttons', () => {
    const handleClick = vi.fn();
    const { asFragment } = render(
      <MarketplaceAlert
        {...defaultProps}
        buttons={[
          { label: 'Primary Action', onClick: handleClick, variant: 'primary' },
          {
            label: 'Secondary Action',
            onClick: handleClick,
            variant: 'secondary',
          },
        ]}
      />
    );
    expect(asFragment()).toMatchSnapshot();
  });

  it('renders with disabled button', () => {
    const handleClick = vi.fn();
    const { asFragment } = render(
      <MarketplaceAlert
        {...defaultProps}
        buttons={[
          {
            label: 'Disabled Button',
            onClick: handleClick,
            disabled: true,
          },
        ]}
      />
    );
    expect(asFragment()).toMatchSnapshot();
  });

  it('renders with custom className', () => {
    const { asFragment } = render(
      <MarketplaceAlert {...defaultProps} className='custom-class' />
    );
    expect(asFragment()).toMatchSnapshot();
  });

  it('renders with aria labels', () => {
    const { asFragment } = render(
      <MarketplaceAlert
        {...defaultProps}
        aria-label='Custom aria label'
        aria-describedby='custom-description'
      />
    );
    expect(asFragment()).toMatchSnapshot();
  });
});
