import { configureStore } from '@reduxjs/toolkit';
import { GeoDataSlice, fetchCountries, fetchCountryStates } from '../GeoDataSlice';

jest.mock('@/services/api/api', () => ({
  apiGet: jest.fn(),
  apiPost: jest.fn(),
  apiPut: jest.fn(),
  apiDelete: jest.fn(),
}));

const createStore = () => configureStore({ reducer: { geoData: GeoDataSlice.reducer } });

describe('GeoDataSlice', () => {
  it('has correct initial state', () => {
    const store = createStore();
    const state = store.getState().geoData;
    expect(state.countries).toEqual([]);
    expect(state.cities).toEqual([]);
    expect(state.states).toEqual([]);
    expect(state.loadingCountries).toBe(false);
    expect(state.loadingStates).toBe(false);
  });

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

    it('populates countries on fulfilled', () => {
      const store = createStore();
      const countries = [{ id: 1, name: 'Ghana' }];
      store.dispatch({ type: fetchCountries.fulfilled.type, payload: countries });
      expect(store.getState().geoData.countries).toEqual(countries);
      expect(store.getState().geoData.loadingCountries).toBe(false);
    });
  });

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

    it('populates states on fulfilled', () => {
      const store = createStore();
      const states = [{ id: 1, name: 'Greater Accra' }];
      store.dispatch({ type: fetchCountryStates.fulfilled.type, payload: states });
      expect(store.getState().geoData.states).toEqual(states);
      expect(store.getState().geoData.loadingStates).toBe(false);
    });
  });
});
