import React from 'react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { screen } from '@testing-library/react';
import { OA_PRODUCT_URL } from 'src/constants';
import * as bulkSessionIngestionQuery from 'src/data/queries/getBulkSessionIngestion';
import IngestionDetails from '..';

jest.mock('@theorchard/suite-components', () => {
    // eslint-disable-next-line @typescript-eslint/no-require-imports
    const ReactLib = require('react');

    const MockGridTable = ({ data = [], children, loading }: any) => {
        const columns = ReactLib.Children.toArray(children);

        return (
            <div data-testid="GridTable" className={loading ? 'loading' : ''}>
                <div>
                    {columns.map((column: any, index: number) => (
                        <span key={`${column.props.name}-${index}`}>
                            {column.props.title}
                        </span>
                    ))}
                </div>
                {data.map((row: any) => (
                    <div key={row.id}>
                        {columns.map((column: any, index: number) => {
                            const Cell = column.props.Cell;

                            return (
                                <div
                                    key={`${row.id}-${column.props.name}-${index}`}
                                >
                                    {Cell
                                        ? Cell({ data: row })
                                        : row[column.props.name]}
                                </div>
                            );
                        })}
                    </div>
                ))}
            </div>
        );
    };

    MockGridTable.Column = () => null;

    return {
        GridTable: MockGridTable,
    };
});

jest.mock('src/pages/adminPage/components/statusIndicator', () => ({
    __esModule: true,
    default: ({ status }: { status?: string }) => <span>{status}</span>,
}));

describe('IngestionDetails', () => {
    const mockUseGetBulkSessionIngestionQuery = jest.spyOn(
        bulkSessionIngestionQuery,
        'useGetBulkSessionIngestionQuery'
    );

    afterEach(() => {
        jest.clearAllMocks();
    });

    test('requests data for the provided ingestion id', () => {
        mockUseGetBulkSessionIngestionQuery.mockReturnValue({
            data: null,
            loading: false,
        } as never);

        renderInAppContext(
            <IngestionDetails bulkSessionIngestionId="ing-123" />
        );

        expect(mockUseGetBulkSessionIngestionQuery).toHaveBeenCalledWith({
            id: 'ing-123',
        });
    });

    test('renders products with status, id link, and name', () => {
        mockUseGetBulkSessionIngestionQuery.mockReturnValue({
            data: {
                id: 'ing-1',
                products: [
                    {
                        id: 'prod-ing-1',
                        ingestionStatus: 'success',
                        product: {
                            productId: 101,
                            productName: 'Test Product',
                            upc: '12345',
                        },
                    },
                ],
            },
            loading: false,
        } as never);

        renderInAppContext(<IngestionDetails bulkSessionIngestionId="ing-1" />);

        expect(screen.getByText('Products')).toBeInTheDocument();
        expect(screen.getByText('Ingestion Status')).toBeInTheDocument();
        expect(screen.getByText('Product ID')).toBeInTheDocument();
        expect(screen.getByText('Product Name')).toBeInTheDocument();
        expect(screen.getByText('success')).toBeInTheDocument();

        const productLink = screen.getByRole('link', { name: '101' });
        expect(productLink.getAttribute('href')).toBe(
            `${OA_PRODUCT_URL}?release_id=101`
        );
        expect(screen.getByText('Test Product')).toBeInTheDocument();
    });

    test('renders empty table data when products are not returned', () => {
        mockUseGetBulkSessionIngestionQuery.mockReturnValue({
            data: {
                id: 'ing-2',
                products: null,
            },
            loading: false,
        } as never);

        renderInAppContext(<IngestionDetails bulkSessionIngestionId="ing-2" />);

        expect(screen.getByTestId('GridTable')).toBeInTheDocument();
        expect(screen.queryByRole('link')).not.toBeInTheDocument();
    });

    test('forwards loading state to the table', () => {
        mockUseGetBulkSessionIngestionQuery.mockReturnValue({
            data: null,
            loading: true,
        } as never);

        renderInAppContext(<IngestionDetails bulkSessionIngestionId="ing-3" />);

        expect(screen.getByTestId('GridTable')).toHaveClass('loading');
    });
});
