'use client';

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import {
  getAllLeads,
  getProjectList,
  getLeadData,
  getFilterProjectList,
  getFilterLocalityList,
  getFilterConfigurations,
  getFilterBudgetList,
  getLeadStatus,
  updateLeadData,
  getLeadRemarks,
  getLeadsCalendar,
  getLeadUserDropdown,
  getFilterLaunchList,
  getBothSalesLeadDropdown,
  getLaunchedProjects,
} from './service';
import { LIST_META } from '@/utills/constant';
import type { AllLeadsState } from './interface';
import { getEmployee } from '../employees/service';
import { getLaunch } from '../launches/service';
import { removeEmptyKeys } from '@/utills/helper';
import { notification } from 'antd';
// Define an initial state
const initialState: AllLeadsState = {
  allLeads: [],
  projects: [],
  leadDetailById: [],
  SelectedLaunches: [],
  selectedEmployee: [],
  leadsMeta: LIST_META,
  listLoading: true,
  status: 'loading',
  error: null,
  loading: true,
  activeLeads: [],
  overdueLeads: [],
  scheduled: [],
  visited: [],
  token: null,
  booked: [],
  deadLead: [],
  leadCalendar: [],
  dropdownList: [],
  clusterManList: [],
  teamLeadList: [],
  preSalesList: [],
  fieldSalesList: [],
  launchedProjects:[],
  filterProjectLList: [],
  projectListHasMore: true,
  filterLocalityLList: [],
  localityListHasMore: true,
};

export const fetchEmployee = createAsyncThunk(
  'employees/fetchEmployee',
  async(id: number | string) => {
    const employees = await getEmployee(id);
    const employee = [
      {
        id: employees?.data[0].id,
        label: `${employees?.data[0].first_name} ${employees?.data[0].last_name}`,
      },
    ];
    return employee;
  }
);
export const fetchLaunch = createAsyncThunk('allleads/fetchLaunch', async(id: any) => {
  const launch = await getLaunch(id);
  const launchList = [{ id: launch?.data?.id, label: launch?.data?.name }];
  return launchList;
});

export const fetchAllLeads = createAsyncThunk('allleads/fetchAllLeads', async(params: any) => {
    const { filters, tabKey } = params;
    // Clone the filters
    const modifiedFilters = { ...filters };

    // Convert project_id array to comma separated string if it exists and is an array
    if (Array.isArray(modifiedFilters.project_id)) {
      modifiedFilters.project_id = modifiedFilters?.project_id?.join(',');
    }

    // Convert locality_id array to comma separated string if it exists and is an array
    if (Array.isArray(modifiedFilters.locality_id)) {
      modifiedFilters.locality_id = modifiedFilters?.locality_id?.join(',');
    }

    const queryString = removeEmptyKeys(modifiedFilters);
    const leads = await getAllLeads(queryString, tabKey);
    return leads;
  });

export const fetchLeadsCalendar = createAsyncThunk(
  'allleads/fetchLeadsCalendar',
  async(params: any) => {
    const queryString = removeEmptyKeys(params);
    const calendar = await getLeadsCalendar(queryString);
    return calendar;
  }
);

export const fetchUserDropdown = createAsyncThunk(
  'allleads/fetchUserDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const userDropdownList = await getLeadUserDropdown(queryString);
    return userDropdownList;
  }
);

export const fetchUserClusterDropdown = createAsyncThunk(
  'allleads/fetchUserClusterDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const clusterDropdownList = await getLeadUserDropdown(queryString);
    return clusterDropdownList;
  }
);

export const fetchUserDropdownAPI = createAsyncThunk(
  'allleads/fetchUserClusterDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const clusterDropdownList = await getLeadUserDropdown(queryString);
    return clusterDropdownList;
  }
);
export const fetchUserTeamLeadDropdown = createAsyncThunk(
  'allleads/fetchUserTeamLeadDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const teamLeadDropdownList = await getLeadUserDropdown(queryString);
    return teamLeadDropdownList;
  }
);

export const fetchUserPreSalesDropdown = createAsyncThunk(
  'allleads/fetchUserPreSalesDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const preSalesDropdownList = await getLeadUserDropdown(queryString);
    return preSalesDropdownList;
  }
);

export const fetchUserAllLeadDropdown = createAsyncThunk(
  'allleads/fetchUserAllLeadDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const userDropdownAllLeadList = await getBothSalesLeadDropdown(queryString);
    return userDropdownAllLeadList;
  }
);
export const fetchUserClusterAllLeadDropdown = createAsyncThunk(
  'allleads/fetchUserClusterAllLeadDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const clusterAllLeadDropdownList = await getBothSalesLeadDropdown(queryString);
    return clusterAllLeadDropdownList;
  }
);
export const fetchUserTeamLeadAllLeadDropdown = createAsyncThunk(
  'allleads/fetchUserTeamLeadAllLeadDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const teamLeadAllLeadDropdownList = await getBothSalesLeadDropdown(queryString);
    return teamLeadAllLeadDropdownList;
  }
);
export const fetchUserPreSalesAllLeadDropdown = createAsyncThunk(
  'allleads/fetchUserPreSalesAllLeadDropdown',
  async(params: any) => {
    const { filters } = params;
    const queryString = removeEmptyKeys(filters);
    const preSalesAllLeadDropdownList = await getBothSalesLeadDropdown(queryString);
    return preSalesAllLeadDropdownList;
  }
);

export const getProjects = createAsyncThunk('allleads/getProjects', async(_params: any) => {
  const projects = await getProjectList();
  return projects;
});

export const getLeadDetailById = createAsyncThunk(
  'allleads/getLeadDetailById',
  async(params: any) => {
    const leadData = await getLeadData(params);
    return leadData;
  }
);

export const fetchFilterProjectList = createAsyncThunk(
  'allleads/fetchFilterProjectList',
  async(params?: { page?: number; pageSize?: number; search?: string }) => {
    const projectList = await getFilterProjectList(params);
    return { ...projectList, page: params?.page || 1 };
  }
);

export const fetchFilterLocalityList = createAsyncThunk(
  'allleads/fetchFilterLocalityList',
  async(params?: { page?: number; pageSize?: number; search?: string }) => {
    const localityList = await getFilterLocalityList(params);
    return { ...localityList, page: params?.page || 1 };
  }
);

export const fetchFilterLaunchList = createAsyncThunk(
  'allleads/fetchFilterLaunchList',
  async(params: any) => {
    const filters = params;
    const queryString = removeEmptyKeys(filters);
    const projectList = await getFilterLaunchList(queryString);
    return projectList;
  }
);

export const fetchFilterConfiguration = createAsyncThunk(
  'allleads/fetchFilterConfiguration',
  async() => {
    const configurations = await getFilterConfigurations();
    return configurations;
  }
);

export const fetchFilterBudgetList = createAsyncThunk('allleads/fetchFilterBudgetList', async() => {
  const budgetList = await getFilterBudgetList();
  return budgetList;
});

export const fetchLeadStatus = createAsyncThunk('allleads/fetchLeadStatus', async() => {
  const leadStatus = await getLeadStatus();
  return leadStatus;
});

// Fetch Launched Projects
export const fetchLaunchedProjects = createAsyncThunk('allleads/fetchLaunchedProjects', async() => {
  const launchedProjects = await getLaunchedProjects();
  return launchedProjects;
});

export const leadsDataUpdate = createAsyncThunk(
  'allleads/leadsDataUpdate',
  async({ id, data }: { id: number | string; data: any }) => {
    try {
      const leadsData = await updateLeadData(id, data);
      notification.success({
        message: 'Success',
        description: leadsData?.message,
      });
      return leadsData;
    } catch (error: any) {
      const { message } = error?.response?.data || {};
      notification.error({
        message: 'Error',
        description: message,
      });
    }
  }
);

export const fetchLeadRemarks = createAsyncThunk(
  'allleads/fetchLeadRemarks',
  async(id: number | any) => {
    const remark = await getLeadRemarks(id);
    return remark;
  }
);

const allLeadsSlice = createSlice({
  name: 'allleads',
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder

      .addCase(fetchAllLeads.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchAllLeads.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.allLeads = action.payload?.data;
        state.leadsMeta = action.payload?.meta;
      })
      .addCase(fetchAllLeads.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
    // getLeadDetailById
      .addCase(getLeadDetailById.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(getLeadDetailById.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.leadDetailById = action.payload?.data;
      })
      .addCase(getLeadDetailById.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })

    // getProjects
      .addCase(getProjects.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(getProjects.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.projects = action.payload;
        state.employeeMeta = action.payload;
      })
      .addCase(getProjects.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchLaunch.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchLaunch.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.SelectedLaunches = action.payload;
      })
      .addCase(fetchLaunch.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })

      .addCase(fetchEmployee.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })

      .addCase(fetchEmployee.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        state.selectedEmployee = action.payload;
      })
      .addCase(fetchEmployee.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })

      .addCase(fetchFilterProjectList.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchFilterProjectList.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        const { data, hasMore, page } = action.payload || {};

          if (action.payload.page === 1) {
          state.filterProjectLList = action.payload.data;
          } else {
            state.filterProjectLList = [
              ...state.filterProjectLList,
              ...action.payload.data,
            ];
          }
        state.projectListHasMore = hasMore ?? false;
      })
      .addCase(fetchFilterProjectList.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchFilterLocalityList.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchFilterLocalityList.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        const { hasMore } = action.payload || {};

          if (action.payload.page === 1) {
          state.filterLocalityLList = action.payload.data;
          } else {
            state.filterLocalityLList = [
              ...state.filterLocalityLList,
              ...action.payload.data,
            ];
          }
        state.localityListHasMore = hasMore ?? false;
      })
      .addCase(fetchFilterLocalityList.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchFilterLaunchList.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchFilterLaunchList.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.filterLaunchLList = action.payload?.data;
        state.launchTeamMates = action.payload?.launchTeamMates;
      })
      .addCase(fetchFilterLaunchList.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchFilterConfiguration.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchFilterConfiguration.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.configurationList = action.payload?.data;
      })
      .addCase(fetchFilterConfiguration.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchFilterBudgetList.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchFilterBudgetList.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.budgetList = action.payload?.data;
      })
      .addCase(fetchFilterBudgetList.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(fetchLeadStatus.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchLeadStatus.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.leadStatus = action.payload?.data;
      })
      .addCase(fetchLeadStatus.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      // Fetch Launched Projects Reducer
      .addCase(fetchLaunchedProjects.pending, (state) => {
        state.status = 'loading';
        state.listLoading = true;
      })
      .addCase(fetchLaunchedProjects.fulfilled, (state: any, action) => {
        state.status = 'succeeded';
        state.listLoading = false;
        state.launchedProjects = action.payload?.data;
      })
      .addCase(fetchLaunchedProjects.rejected, (state: any, action: any) => {
        state.status = 'failed';
        state.listLoading = false;
        state.error = action.error.message;
      })
      .addCase(leadsDataUpdate.pending, (state) => {
        state.loading = true;
      })
      .addCase(leadsDataUpdate.fulfilled, (state: any, action) => {
        state.loading = false;
        state.leadDetailById = {
          ...state.leadDetailById,
          meta_data: action?.meta?.arg?.data?.meta_data,
        };
      })
      .addCase(leadsDataUpdate.rejected, (state: any, action) => {
        state.loading = false;
        state.error = action.error.message ?? 'error';
      })

      .addCase(fetchLeadRemarks.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchLeadRemarks.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.leadRemarks = action.payload.data;
      })
      .addCase(fetchLeadRemarks.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })

      .addCase(fetchLeadsCalendar.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchLeadsCalendar.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.leadCalendar = action.payload.data.data;
      })
      .addCase(fetchLeadsCalendar.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.dropdownList = action.payload.data || [];
      })
      .addCase(fetchUserDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserClusterDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserClusterDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.clusterManList = action.payload.data;
      })
      .addCase(fetchUserClusterDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })

      .addCase(fetchUserTeamLeadDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserTeamLeadDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.teamLeadList = action.payload.data;
      })
      .addCase(fetchUserTeamLeadDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserPreSalesDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserPreSalesDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.preSalesList = action.payload.data;
      })
      .addCase(fetchUserPreSalesDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserAllLeadDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserAllLeadDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.dropdownList = action.payload.data;
      })
      .addCase(fetchUserAllLeadDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserClusterAllLeadDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserClusterAllLeadDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.clusterManList = action.payload.data;
      })
      .addCase(fetchUserClusterAllLeadDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })

      .addCase(fetchUserTeamLeadAllLeadDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserTeamLeadAllLeadDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.teamLeadList = action.payload.data;
      })
      .addCase(fetchUserTeamLeadAllLeadDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      })
      .addCase(fetchUserPreSalesAllLeadDropdown.pending, (state) => {
        state.status = 'loading';
        // state.listLoading = true
      })
      .addCase(fetchUserPreSalesAllLeadDropdown.fulfilled, (state: any, action: any) => {
        state.status = 'succeeded';
        // state.listLoading = false
        state.preSalesList = action.payload.data;
      })
      .addCase(fetchUserPreSalesAllLeadDropdown.rejected, (state: any, action: any) => {
        state.status = 'failed';
        // state.listLoading = false
        state.error = action.error.message;
      });
  },
});

export default allLeadsSlice.reducer;
