import React from 'react';
import { render, fireEvent, waitFor } from '@testing-library/react';
import BulkUploadBtn from '../components/ui/run-analysis/BulkUploadBtn';
import { toast } from 'react-toastify';

jest.mock('react-toastify', () => ({
  toast: {
    success: jest.fn(),
    error: jest.fn(),
    warning: jest.fn(),
  },
  ToastContainer: () => <div />,
}));

describe('BulkUploadBtn - Upload Validation', () => {
  let originalCreateElement: typeof document.createElement;

  beforeEach(() => {
    originalCreateElement = document.createElement;
    jest.clearAllMocks();
  });

  afterEach(() => {
    document.createElement = originalCreateElement;
  });

  const renderComponent = () =>
    render(<BulkUploadBtn selectedRateOuotesRecords={[{ quote_id: 1 }]} />);

  const mockFileInput = (mockFile: File | null) => {
    const input: any = {
      files: mockFile ? [mockFile] : [],
      click: jest.fn(),
    };
    const createElementMock = jest.spyOn(document, 'createElement').mockReturnValue(input);
    return input;
  };

  test('shows error toast when non-CSV file is selected', async () => {
    const invalidFile = new File(['dummy'], 'file.txt', { type: 'text/plain' });
    const input = mockFileInput(invalidFile);
    renderComponent();

    fireEvent.click(document.querySelector('button')!);

    await waitFor(() => {
      input.onchange();
    });

    expect(toast.error).toHaveBeenCalledWith('Only CSV files are allowed.', expect.any(Object));
  });

  test('shows error toast when CSV file is too large', async () => {
    const largeFile = new File(['a'.repeat(21 * 1024 * 1024)], 'large.csv', { type: 'text/csv' });
    Object.defineProperty(largeFile, 'size', { value: 21 * 1024 * 1024 });

    const input = mockFileInput(largeFile);
    renderComponent();

    fireEvent.click(document.querySelector('button')!);

    await waitFor(() => {
      input.onchange();
    });

    expect(toast.error).toHaveBeenCalledWith('File must be 20MB or less.', expect.any(Object));
  });
});
