import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { TaxFormInfoHeaderSection } from '../tax-form-info-header-section';

// Mock subcomponents
jest.mock(
    '../components/tax-details-es-sidecar',
    () =>
        ({ isOpen }: { isOpen: boolean }) => (
            <div data-testid="TaxDetailsESSidecar">
                {isOpen ? 'OPEN' : 'CLOSED'}
            </div>
        )
);
jest.mock('../components/edit-form-sidecar', () => () => (
    <div data-testid="EditFormSidecar" />
));
jest.mock('../components/rejection-sidecar', () => () => (
    <div data-testid="RejectionSidecar" />
));
jest.mock('@theorchard/suite-icons', () => ({
    GlyphIcon: ({ name }: { name: string }) => (
        <div data-testid={`GlyphIcon-${name}`} />
    ),
}));

const defaultProps = {
    className: 'test-class',
    accountId: 'acc123',
    accountPayeeId: 'payee123',
    onOpenModal: jest.fn(),
    isNonSpanishTaxResident: false,
};

describe('TaxFormInfoHeaderSection', () => {
    beforeEach(() => {
        jest.clearAllMocks();
    });

    it('renders section title and no glyph icon by default', () => {
        render(<TaxFormInfoHeaderSection {...defaultProps} />);
        expect(screen.getByText('Tax Information')).toBeInTheDocument();
        expect(screen.queryByTestId(/GlyphIcon/)).not.toBeInTheDocument();
    });

    it('renders glyph icon when provided', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                glyphIcon={{ name: 'warning', className: 'warning' }}
            />
        );
        expect(screen.getByTestId('GlyphIcon-warning')).toBeInTheDocument();
    });

    it('renders RejectionSidecar and "Add Tax Form details" button when showHeaderButtons is true and isNonSpanishTaxResident is false', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                showHeaderButtons
                taxEligibilityStateId="state-1"
            />
        );

        expect(screen.getByTestId('RejectionSidecar')).toBeInTheDocument();
        expect(
            screen.getByRole('button', { name: /Add Tax Form details/i })
        ).toBeInTheDocument();
    });

    it('calls onOpenModal when "Add Tax Form details" button is clicked', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                showHeaderButtons
                taxEligibilityStateId="state-1"
            />
        );

        fireEvent.click(
            screen.getByRole('button', { name: /Add Tax Form details/i })
        );
        expect(defaultProps.onOpenModal).toHaveBeenCalled();
    });

    it('renders TaxDetailsESSidecar and button when isNonSpanishTaxResident is true and accountTaxInfoId is defined', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                isNonSpanishTaxResident
                showHeaderButtons
                accountTaxInfoId="taxInfoId"
            />
        );

        expect(screen.getByTestId('TaxDetailsESSidecar')).toBeInTheDocument();
        expect(
            screen.getByRole('button', {
                name: /Add Tax Details/i,
            })
        ).toBeInTheDocument();
    });

    it('renders EditFormSidecar when enableEdit is true and isNonSpanishTaxResident is false', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                enableEdit
                countryOfTaxResidence="FRA"
                taxEligibilityStateId="state-2"
            />
        );
        expect(screen.getByTestId('EditFormSidecar')).toBeInTheDocument();
    });

    it('renders edit button and TaxDetailsESSidecar closed by default, opens on click', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                enableEdit
                isNonSpanishTaxResident
            />
        );

        const editBtn = screen.getByTestId('openModalBtn');
        expect(editBtn).toBeInTheDocument();

        // Initially closed
        expect(screen.getByTestId('TaxDetailsESSidecar')).toHaveTextContent(
            'CLOSED'
        );

        fireEvent.click(editBtn);

        // After click -> opened
        expect(screen.getByTestId('TaxDetailsESSidecar')).toHaveTextContent(
            'OPEN'
        );
    });

    it('renders both showHeaderButtons and enableEdit content when both are true', () => {
        render(
            <TaxFormInfoHeaderSection
                {...defaultProps}
                enableEdit
                showHeaderButtons
                isNonSpanishTaxResident
                accountTaxInfoId="taxInfoId"
            />
        );

        expect(
            screen.getByRole('button', { name: /Add Tax Details/i })
        ).toBeInTheDocument();
        expect(screen.getByTestId('openModalBtn')).toBeInTheDocument();
    });
});
