import { configureStore } from '@reduxjs/toolkit';
import PerformanceDashboardSlice, { fetchEmployeeDashboard, fetchManagerDashboard, fetchOrganizationDashboard, fetchExecutiveSummary } from '../PerformanceDashboardSlice';

jest.mock('@/services/api/api', () => ({ apiGet: jest.fn() }));
jest.mock('antd', () => ({ message: { success: jest.fn(), error: jest.fn(), warning: jest.fn() } }));
jest.mock('@/utilities/Helpers', () => ({
  __esModule: true, default: { handleServerError: jest.fn((e) => e?.message || 'Error') } }));

const createStore = () => configureStore({ reducer: { pd: PerformanceDashboardSlice.reducer } });

describe('PerformanceDashboardSlice', () => {
  it('has correct initial state', () => {
    const store = createStore();
    const state = store.getState().pd;
    expect(state.employeeDashboard).toBeNull();
    expect(state.managerDashboard).toBeNull();
    expect(state.organizationDashboard).toBeNull();
    expect(state.executiveSummary).toBeNull();
    expect(state.loading).toBe(false);
    expect(state.error).toBeNull();
  });

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

  it('sets employeeDashboard on fetchEmployeeDashboard.fulfilled', () => {
    const store = createStore();
    store.dispatch({ type: fetchEmployeeDashboard.fulfilled.type, payload: { goalsCount: 5 } });
    expect(store.getState().pd.employeeDashboard).toEqual({ goalsCount: 5 });
    expect(store.getState().pd.loading).toBe(false);
  });

  it('sets managerDashboard on fetchManagerDashboard.fulfilled', () => {
    const store = createStore();
    store.dispatch({ type: fetchManagerDashboard.fulfilled.type, payload: { teamSize: 10 } });
    expect(store.getState().pd.managerDashboard).toEqual({ teamSize: 10 });
  });

  it('sets organizationDashboard on fetchOrganizationDashboard.fulfilled', () => {
    const store = createStore();
    store.dispatch({ type: fetchOrganizationDashboard.fulfilled.type, payload: { total: 100 } });
    expect(store.getState().pd.organizationDashboard).toEqual({ total: 100 });
  });

  it('sets executiveSummary on fetchExecutiveSummary.fulfilled', () => {
    const store = createStore();
    store.dispatch({ type: fetchExecutiveSummary.fulfilled.type, payload: { avgScore: 4.2 } });
    expect(store.getState().pd.executiveSummary).toEqual({ avgScore: 4.2 });
  });
});
