import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { getExistingUsers, getNewUsers } from './service';

// Define an initial state
const initialState = {
  existingUsers: [],
  newUsers: [],
  status: 'idle',
  error: '',
};

interface SearchQuery {
  role_id: number | string;
  city_id: number | string;
  user_id?: number; // Optional for fetching new users
}

// Fetch existing users based on role_id and city_id
export const fetchExistingUsers = createAsyncThunk(
  'users/fetchExistingUsers',
  async(searchQuery: SearchQuery) => {
    const response = await getExistingUsers(searchQuery);
    return response;
  }
);

// Fetch new users based on role_id, city_id, and existing_user_id
export const fetchNewUsers = createAsyncThunk(
  'users/fetchNewUsers',
  async(searchQuery: SearchQuery) => {
    const response = await getNewUsers(searchQuery);
    return response;
  }
);

const usersSlice = createSlice({
  name: 'dissociation',
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    // Existing Users
    builder
      .addCase(fetchExistingUsers.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchExistingUsers.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.existingUsers = action.payload.data;
      })
      .addCase(fetchExistingUsers.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message ?? 'An error occurred';
      });
    // New Users
    builder
      .addCase(fetchNewUsers.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchNewUsers.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.newUsers = action.payload.data;
      })
      .addCase(fetchNewUsers.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message ?? 'An error occurred';
      });
  },
});

export default usersSlice.reducer;
