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

import AnalysisRunStatus from './AnalysisRunStatus';

describe('AnalysisRunStatus', () => {
  describe('pending state', () => {
    it('renders queued copy', () => {
      render(<AnalysisRunStatus run={{ status: 'pending' }} />);
      expect(screen.getByText('Analysis queued')).toBeInTheDocument();
    });
  });

  describe('processing state', () => {
    it('renders in-progress copy', () => {
      render(<AnalysisRunStatus run={{ status: 'processing' }} />);
      expect(screen.getByText(/Analyzing your site/i)).toBeInTheDocument();
    });

    it('renders indeterminate progress bar', () => {
      render(<AnalysisRunStatus run={{ status: 'processing' }} />);
      expect(screen.getByRole('progressbar')).toBeInTheDocument();
    });
  });

  describe('completed state', () => {
    it('renders success copy', () => {
      render(<AnalysisRunStatus run={{ status: 'completed' }} />);
      expect(screen.getByText('Analysis complete')).toBeInTheDocument();
    });
  });

  describe('failed state', () => {
    it('renders failed heading', () => {
      render(<AnalysisRunStatus run={{ status: 'failed' }} />);
      expect(screen.getByText('Analysis failed')).toBeInTheDocument();
    });

    it('renders generic error copy when no error message provided', () => {
      render(<AnalysisRunStatus run={{ status: 'failed' }} />);
      expect(screen.getByText(/check that your GSC connection is active/i)).toBeInTheDocument();
    });

    it('renders specific error message when provided', () => {
      render(
        <AnalysisRunStatus
          run={{ status: 'failed', error: 'GSC API quota exceeded' }}
        />
      );
      expect(screen.getByText('GSC API quota exceeded')).toBeInTheDocument();
    });

    it('does not render retry button when onRetry is not provided', () => {
      render(<AnalysisRunStatus run={{ status: 'failed' }} />);
      expect(screen.queryByTestId('analysis-retry-button')).not.toBeInTheDocument();
    });

    it('renders retry button when onRetry is provided', () => {
      const onRetry = vi.fn();
      render(<AnalysisRunStatus run={{ status: 'failed' }} onRetry={onRetry} />);
      expect(screen.getByTestId('analysis-retry-button')).toBeInTheDocument();
    });

    it('calls onRetry when retry button is clicked', async () => {
      const user = userEvent.setup();
      const onRetry = vi.fn();
      render(<AnalysisRunStatus run={{ status: 'failed' }} onRetry={onRetry} />);

      await user.click(screen.getByTestId('analysis-retry-button'));
      expect(onRetry).toHaveBeenCalledOnce();
    });

    it('has data-testid for identification', () => {
      render(<AnalysisRunStatus run={{ status: 'failed' }} />);
      expect(screen.getByTestId('analysis-run-failed')).toBeInTheDocument();
    });
  });
});
