import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, within, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { MemoryRouter } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { I18nextProvider } from 'react-i18next';
import { ThemeProvider } from 'styled-components';
import AdminCompaniesPage from '@/features/admin/pages/AdminCompaniesPage';
import * as companyService from '@/features/admin/services/companyAdminService';
import i18n from '@/locales/i18n';
import { LocaleProvider } from '@/app/providers/LocaleProvider';
import { lightTheme } from '@/styles/theme';

vi.mock('@/features/auth/store/authStore', () => ({
  useAuthStore: (selector: (state: { user: { is_super_admin: boolean } }) => unknown) =>
    selector({ user: { is_super_admin: true } }),
}));

vi.mock('@/features/admin/services/companyAdminService', () => ({
  listCompanies: vi.fn(),
  createCompany: vi.fn(),
  updateCompany: vi.fn(),
  deleteCompany: vi.fn(),
}));

vi.mock('@/shared/components/layout/AppLayout', () => ({
  AppLayout: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
}));

function renderPage() {
  const queryClient = new QueryClient({
    defaultOptions: { queries: { retry: false } },
  });

  return render(
    <QueryClientProvider client={queryClient}>
      <I18nextProvider i18n={i18n}>
        <LocaleProvider>
          <ThemeProvider theme={lightTheme}>
            <MemoryRouter>
              <AdminCompaniesPage />
            </MemoryRouter>
          </ThemeProvider>
        </LocaleProvider>
      </I18nextProvider>
    </QueryClientProvider>,
  );
}

describe('AdminCompaniesPage', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('renders companies when data loads', async () => {
    vi.mocked(companyService.listCompanies).mockResolvedValue([
      {
        id: 'c1',
        name: 'Acme Corp',
        code: 'ACME',
        email_domain: 'acme.test',
        logo_url: null,
        is_active: true,
      },
    ]);

    renderPage();

    expect(await screen.findByText('Acme Corp')).toBeInTheDocument();
    expect(screen.getByText('ACME')).toBeInTheDocument();
  });

  it('creates a company from the modal', async () => {
    vi.mocked(companyService.listCompanies).mockResolvedValue([]);
    vi.mocked(companyService.createCompany).mockResolvedValue({
      id: 'c2',
      name: 'New Co',
      code: 'NEW',
      email_domain: null,
      logo_url: null,
      is_active: true,
    });

    renderPage();
    const user = userEvent.setup();

    await user.click(await screen.findByRole('button', { name: /add company/i }));
    const dialog = await screen.findByRole('dialog');
    const inputs = within(dialog).getAllByRole('textbox');
    await user.type(inputs[0], 'New Co');
    await user.type(inputs[1], 'NEW');
    await user.click(within(dialog).getByRole('button', { name: /save/i }));

    await waitFor(() => {
      expect(companyService.createCompany).toHaveBeenCalledWith(
        expect.objectContaining({ name: 'New Co', code: 'NEW' }),
      );
    });
  });
});
