import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen } 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 AdminUsersPage from '@/features/admin/pages/AdminUsersPage';
import * as userAdminService from '@/features/admin/services/userAdminService';
import * as departmentMembershipService from '@/features/admin/services/departmentMembershipService';
import * as departmentAdminService from '@/features/admin/services/departmentAdminService';
import i18n from '@/locales/i18n';
import { LocaleProvider } from '@/app/providers/LocaleProvider';
import { lightTheme } from '@/styles/theme';
import { PERMISSIONS } from '@/features/auth/constants/permissions';

const superAdminUser = {
  id: 'u1',
  company_id: 'c1',
  is_super_admin: true,
  permissions: Object.values(PERMISSIONS),
  departments: [],
};

const departmentHeadUser = {
  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: '',
    },
  ],
};

let authUser = superAdminUser;

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

vi.mock('@/features/admin/services/userAdminService', () => ({
  listUsers: vi.fn(),
  updateUser: vi.fn(),
}));

vi.mock('@/features/admin/services/departmentMembershipService', () => ({
  listUserDepartments: vi.fn(),
  assignUserDepartment: vi.fn(),
  updateUserDepartment: vi.fn(),
  removeUserDepartment: vi.fn(),
}));

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

vi.mock('@/features/admin/services/companyAdminService', () => ({
  listCompanies: 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>
              <AdminUsersPage />
            </MemoryRouter>
          </ThemeProvider>
        </LocaleProvider>
      </I18nextProvider>
    </QueryClientProvider>,
  );
}

describe('AdminUsersPage', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    authUser = superAdminUser;
    vi.mocked(userAdminService.listUsers).mockResolvedValue([
      {
        id: 'u10',
        name: 'Jane Doe',
        email: 'jane@mountainview-eg.com',
        company_id: 'c1',
        is_super_admin: false,
        is_active: true,
        locale: 'en',
        timezone: 'UTC',
        departments: [{ id: 'd1', name: 'Support', code: 'SUP', role: 'agent', is_manager: false }],
      },
    ]);
    vi.mocked(departmentAdminService.listDepartments).mockResolvedValue([
      {
        id: 'd1',
        company_id: 'c1',
        name: 'Support',
        code: 'SUP',
        description: null,
        is_active: true,
      },
    ]);
    vi.mocked(departmentMembershipService.listUserDepartments).mockResolvedValue([]);
  });

  it('super admin sees department selector', async () => {
    renderPage();
    expect(await screen.findByText('Jane Doe')).toBeInTheDocument();
    expect(screen.getByText('Department')).toBeInTheDocument();
    expect(screen.getAllByRole('combobox').length).toBeGreaterThan(0);
  });

  it('department head department selector is locked', async () => {
    authUser = departmentHeadUser;
    renderPage();
    expect(await screen.findByDisplayValue('Support')).toBeInTheDocument();
    expect(screen.queryByRole('combobox', { name: /Department/i })).not.toBeInTheDocument();
  });

  it('department users list renders in manage modal', async () => {
    vi.mocked(departmentMembershipService.listUserDepartments).mockResolvedValue([
      {
        id: 'm1',
        department_id: 'd1',
        user_id: 'u10',
        role: 'agent',
        role_in_department: 'agent',
        is_manager: false,
        is_department_head: false,
        is_primary: true,
        joined_at: null,
      },
    ]);

    renderPage();
    await userEvent.click(await screen.findByRole('button', { name: /Manage/i }));
    expect(await screen.findByText(/Department memberships/i)).toBeInTheDocument();
  });

  it('set department head action hidden for department head viewer', async () => {
    authUser = departmentHeadUser;
    vi.mocked(departmentMembershipService.listUserDepartments).mockResolvedValue([
      {
        id: 'm1',
        department_id: 'd1',
        user_id: 'u10',
        role: 'agent',
        role_in_department: 'agent',
        is_manager: false,
        is_department_head: false,
        is_primary: true,
        joined_at: null,
      },
    ]);

    renderPage();
    await userEvent.click(await screen.findByRole('button', { name: /Manage/i }));
    expect(screen.queryByRole('button', { name: /Set as department head/i })).not.toBeInTheDocument();
  });
});
