import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { api } from '@/lib/api';
import { useSelectedMembership, requireSelectedStore } from '@/lib/stores/store-context';
import { ScheduleSettingsClient } from '../schedule-settings-client';
import type { Membership, ScheduleSettings } from '@alqove/api-client';
vi.mock('@/lib/stores/store-context', () => ({ useSelectedMembership: vi.fn(), requireSelectedStore: vi.fn((id: string) => id), captureCommandGeneration: vi.fn(() => 7) }));
vi.mock('@/lib/api', () => ({ api: { scheduling: { settings: vi.fn(), updateSettings: vi.fn() } } }));
const settings: ScheduleSettings = { timezone: 'America/Los_Angeles', work_week_start_day: 'mon', work_week_start_time: '00:00', payroll_rounding_mode: 'none', payroll_rounding_increment_minutes: 1, clock_in_early_minutes: 0, clock_in_late_minutes: 0, clock_out_late_minutes: 0 };
const member: Membership = { id: 'm1', store_id: 's1', role: 'owner', is_exempt: false, capabilities: ['settings.schedule', 'schedule.view'] };
function mount() { return render(<QueryClientProvider client={new QueryClient({ defaultOptions: { queries: { retry: false } } })}><ScheduleSettingsClient /></QueryClientProvider>); }
beforeEach(() => { vi.clearAllMocks(); vi.mocked(useSelectedMembership).mockReturnValue(member); vi.mocked(api.scheduling.settings).mockResolvedValue({ data: settings }); });
describe('schedule settings', () => {
  it('loads server settings, submits explicit fields and confirms after readback', async () => {
    vi.mocked(api.scheduling.updateSettings).mockResolvedValue({ data: { ...settings, timezone: 'America/Chicago', clock_in_early_minutes: 15 } });
    mount();
    expect(await screen.findByLabelText('Store timezone (IANA)')).toHaveValue('America/Los_Angeles');
    fireEvent.change(screen.getByLabelText('Store timezone (IANA)'), { target: { value: 'America/Chicago' } });
    fireEvent.change(screen.getByLabelText('Clock in early (minutes)'), { target: { value: '15' } });
    await userEvent.click(screen.getByRole('button', { name: 'Save settings' }));
    await waitFor(() => expect(api.scheduling.updateSettings).toHaveBeenCalledWith('s1', { ...settings, timezone: 'America/Chicago', clock_in_early_minutes: 15 }));
    expect(requireSelectedStore).toHaveBeenCalledWith('s1', 'settings.schedule', 7);
    expect(await screen.findByRole('status')).toHaveTextContent('Settings saved');
    expect(api.scheduling.settings).toHaveBeenCalledTimes(2);
  });
  it('surfaces historical-lock validation and preserves the unsaved timezone', async () => {
    vi.mocked(api.scheduling.updateSettings).mockRejectedValue({ errors: { timezone: ['Timezone cannot change after scheduling history exists.'] } });
    mount();
    fireEvent.change(await screen.findByLabelText('Store timezone (IANA)'), { target: { value: 'America/Chicago' } });
    await userEvent.click(screen.getByRole('button', { name: 'Save settings' }));
    expect(await screen.findByRole('alert')).toHaveTextContent(/history exists/);
    expect(screen.getByLabelText('Store timezone (IANA)')).toHaveValue('America/Chicago');
  });
  it('does not fetch or permit edits without settings.schedule, regardless of role', () => {
    vi.mocked(useSelectedMembership).mockReturnValue({ ...member, capabilities: ['schedule.view'] });
    mount();
    expect(api.scheduling.settings).not.toHaveBeenCalled();
    expect(screen.queryByRole('button', { name: 'Save settings' })).not.toBeInTheDocument();
  });
});
