import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { I18nextProvider } from 'react-i18next';
import { ThemeProvider } from 'styled-components';
import AdminInvitesPage from '@/features/admin/pages/AdminInvitesPage';
import * as inviteService from '@/features/admin/services/inviteService';
import i18n from '@/locales/i18n';
import { LocaleProvider } from '@/app/providers/LocaleProvider';
import { lightTheme } from '@/styles/theme';
import { PERMISSIONS } from '@/features/auth/constants/permissions';

vi.mock('@/features/auth/store/authStore', () => ({
  useAuthStore: (selector: (state: { user: unknown }) => unknown) =>
    selector({
      user: {
        id: 'u2',
        company_id: 'c1',
        is_super_admin: false,
        permissions: [PERMISSIONS.DEPARTMENT_USERS_MANAGE],
        departments: [
          {
            id: 'd1',
            company_id: 'c1',
            name: 'Support',
            is_active: true,
            is_department_head: true,
            is_manager: true,
            created_at: '',
            updated_at: '',
          },
        ],
      },
    }),
}));

vi.mock('@/features/admin/services/inviteService', () => ({
  inviteService: {
    list: vi.fn().mockResolvedValue([]),
    create: vi.fn(),
    revoke: vi.fn(),
    resend: vi.fn(),
  },
}));

vi.mock('@/features/admin/services/departmentAdminService', () => ({
  listDepartments: vi.fn().mockResolvedValue([]),
}));

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>
              <AdminInvitesPage />
            </MemoryRouter>
          </ThemeProvider>
        </LocaleProvider>
      </I18nextProvider>
    </QueryClientProvider>,
  );
}

describe('AdminInvitesPage', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.mocked(inviteService.inviteService.list).mockResolvedValue([]);
  });

  it('invite form uses locked department for department head', async () => {
    renderPage();
    expect(await screen.findByDisplayValue('Support')).toBeInTheDocument();
    expect(screen.queryByRole('combobox', { name: /^Department$/i })).not.toBeInTheDocument();
  });
});
