import { configureStore } from '@reduxjs/toolkit';
import AttendanceReportSlice, { fetchAttendanceData, fetchShiftAttendanceData } from '../AttendanceReportSlice';

jest.mock('@/services/api/apolloClient', () => ({
  __esModule: true,
  default: { query: jest.fn() },
}));

const createStore = () => configureStore({ reducer: { attendanceReports: AttendanceReportSlice.reducer } });

describe('AttendanceReportSlice', () => {
  it('has correct initial state', () => {
    const store = createStore();
    const state = store.getState().attendanceReports;
    expect(state.attendanceReports).toEqual({});
    expect(state.shiftAttendanceReports).toEqual({});
    expect(state.loading).toBe(false);
    expect(state.shiftLoading).toBe(false);
    expect(state.error).toBeNull();
  });

  describe('fetchAttendanceData', () => {
    it('sets loading on pending', () => {
      const store = createStore();
      store.dispatch({ type: fetchAttendanceData.pending.type });
      expect(store.getState().attendanceReports.loading).toBe(true);
    });

    it('populates attendanceReports on fulfilled', () => {
      const store = createStore();
      const payload = { attendanceReport: { summary: { present: 10 } } };
      store.dispatch({ type: fetchAttendanceData.fulfilled.type, payload });
      expect(store.getState().attendanceReports.attendanceReports).toEqual(payload.attendanceReport);
      expect(store.getState().attendanceReports.loading).toBe(false);
    });

    it('sets error on rejected', () => {
      const store = createStore();
      store.dispatch({ type: fetchAttendanceData.rejected.type, payload: 'Something failed' });
      expect(store.getState().attendanceReports.error).toBe('Something failed');
    });
  });

  describe('fetchShiftAttendanceData', () => {
    it('sets shiftLoading on pending', () => {
      const store = createStore();
      store.dispatch({ type: fetchShiftAttendanceData.pending.type });
      expect(store.getState().attendanceReports.shiftLoading).toBe(true);
    });

    it('populates shiftAttendanceReports on fulfilled', () => {
      const store = createStore();
      const payload = { attendanceReport: { summary: { present: 5 } } };
      store.dispatch({ type: fetchShiftAttendanceData.fulfilled.type, payload });
      expect(store.getState().attendanceReports.shiftAttendanceReports).toEqual(payload.attendanceReport);
      expect(store.getState().attendanceReports.shiftLoading).toBe(false);
    });
  });
});
