import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { SelectedUser } from '../../types/SelectedUserType'; // adjust path if needed

interface ChatState {
  selectedUser: SelectedUser | null;
  chatlist: any[]; // Add chatlist to the state
}

const initialState: ChatState = {
  selectedUser: null,
  chatlist: [], // Initialize as empty array
};

const chatSlice = createSlice({
  name: 'chat',
  initialState,
  reducers: {
    setSelectedUser(state, action: PayloadAction<SelectedUser>) {
      state.selectedUser = action.payload;
    },
    
    // ✅ This only updates specific fields, not the whole object
    updateSelectedUser(state, action: PayloadAction<Partial<SelectedUser>>) {
      if (state.selectedUser) {
        state.selectedUser = {
          ...state.selectedUser,
          ...action.payload,
        };
      } else {
        state.selectedUser = action.payload as SelectedUser;
      }
    },
    
    clearSelectedUser(state) {
      state.selectedUser = null;
    },
    
    // ✅ Add this reducer to update the chat list order
    updateChatListOrder(state, action: PayloadAction<any[]>) {
      state.chatlist = action.payload;
    },
    
    // ✅ Optional: Add a reducer to add a single user to chat list
    addToChatList(state, action: PayloadAction<any>) {
      // Check if user already exists in chatlist
      const exists = state.chatlist.some(
        (user) => user.second_id?.toString() === action.payload.second_id?.toString()
      );
      
      if (!exists) {
        // Add to beginning of array (top)
        state.chatlist = [action.payload, ...state.chatlist];
      } else {
        // If exists, move to top
        const filtered = state.chatlist.filter(
          (user) => user.second_id?.toString() !== action.payload.second_id?.toString()
        );
        state.chatlist = [action.payload, ...filtered];
      }
    },
    
    // ✅ Optional: Add a reducer to update a specific user's last message
    updateUserLastMessage(state, action: PayloadAction<{ userId: string; message: any }>) {
      const { userId, message } = action.payload;
      const userIndex = state.chatlist.findIndex(
        (user) => user.second_id?.toString() === userId?.toString()
      );
      
      if (userIndex !== -1) {
        // Update the user's last message
        const updatedUser = {
          ...state.chatlist[userIndex],
          message: message.message || message.type,
          last_message_created: message.created_at || new Date().toISOString(),
          time: message.created_at || new Date().toISOString(),
          message_type: message.type,
          type: message.type,
          url: message.url || "",
        };
        
        // Remove user from current position and add to top
        const newChatList = [
          updatedUser,
          ...state.chatlist.filter((_, i) => i !== userIndex)
        ];
        state.chatlist = newChatList;
      }
    },
    
    // ✅ Optional: Add a reducer to set the entire chat list
    setChatList(state, action: PayloadAction<any[]>) {
      state.chatlist = action.payload;
    },
  },
});

export const { 
  setSelectedUser, 
  clearSelectedUser, 
  updateSelectedUser,
  updateChatListOrder,
  addToChatList,
  updateUserLastMessage,
  setChatList
} = chatSlice.actions;

export default chatSlice.reducer;