'use client';

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { getAllLeadRequest, updateLeadStatus } from './service';
import { LIST_META } from '@/utills/constant';
import { removeEmptyKeys } from '@/utills/helper';
import type { FilterOptions, LeadRequestState } from './interface';

const initialState: LeadRequestState = {
  leadRequests: [],
  leadsMeta: LIST_META,
  listLoading: true,
  status: 'loading',
  error: null,
};

export const fetchAllLeadRequests = createAsyncThunk(
  'leadRequests/fetchAllLeadRequests',
  async(payload: any) => {
    const queryString = removeEmptyKeys(payload) as FilterOptions;
    const leads = await getAllLeadRequest(queryString);
    return leads;
  }
);

export const updateLeadStatusAction = createAsyncThunk(
  'leadRequests/updateLeadStatus',
  async({ id, data }: { id: number; data: any }): Promise<any> => {
    const response = await updateLeadStatus(id, data);
    return response;
  }
);

const leadRequestsSlice = createSlice({
  name: 'leadRequests',
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchAllLeadRequests.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchAllLeadRequests.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.leadRequests = action.payload.data;
        state.leadsMeta = action.payload.meta;
      })
      .addCase(fetchAllLeadRequests.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      });
  },
});

export const selectAllLeads = (state: any): void => state.leadRequests.userList;

export default leadRequestsSlice.reducer;
