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

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

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

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

// Fetch launch based on existing_user_id
export const fetchLaunch = createAsyncThunk(
  'lead_transfer/fetchLaunch', // Changed action type to be unique
  async(searchQuery: any) => {
    const response = await getLaunch(searchQuery);
    return response;
  }
);

// Fetch launches for the new employee (for "Transfer to Launch" dropdown)
export const fetchNewUserLaunches = createAsyncThunk(
  'lead_transfer/fetchNewUserLaunches',
  async(searchQuery: any) => {
    const response = await getNewUserLaunches(searchQuery);
    return response;
  }
);

const leadTransferSlice = createSlice({
    name: 'lead_transfer',
    initialState,
    reducers: {},
    extraReducers: (builder) => {
        // Fetch 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';
            });

    // Fetch 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';
      });

    // Fetch Launch
    builder
      .addCase(fetchLaunch.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchLaunch.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.launchList = action.payload.data;
      })
      .addCase(fetchLaunch.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message ?? 'An error occurred';
      });

    // Fetch New User Launches (Transfer to Launch dropdown)
    builder
      .addCase(fetchNewUserLaunches.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchNewUserLaunches.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.newUserLaunchList = action.payload.data;
      })
      .addCase(fetchNewUserLaunches.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message ?? 'An error occurred';
      });
  },
});

export default leadTransferSlice.reducer;
