import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { OpenGroupV2InfoJoinable } from '../../opengroup/opengroupV2/ApiUtil';

export type DefaultRoomsState = {
  rooms: Array<OpenGroupV2InfoJoinable>;
  inProgress: boolean;
};

export const initialDefaultRoomState: DefaultRoomsState = {
  rooms: [],
  inProgress: false,
};

/**
 * Payload to dispatch to update the base64 data of a default room
 */
export type Base64Update = {
  base64Data: string;
  roomId: string;
};

/**
 * This slice is the one holding the default joinable rooms fetched once in a while from the default opengroup v2 server.
 */
const defaultRoomsSlice = createSlice({
  name: 'defaultRooms',
  initialState: initialDefaultRoomState,
  reducers: {
    updateDefaultRooms(state, action) {
      window?.log?.info('updating default rooms', action.payload);
      const rooms = action.payload as Array<OpenGroupV2InfoJoinable>;
      return { ...state, rooms: rooms };
    },
    updateDefaultRoomsInProgress(state, action) {
      const inProgress = action.payload as boolean;
      return { ...state, inProgress };
    },
    updateDefaultBase64RoomData(state, action: PayloadAction<Base64Update>) {
      const payload = action.payload;
      const newRoomsState = state.rooms.map(room => {
        if (room.id === payload.roomId) {
          return {
            ...room,
            base64Data: payload.base64Data,
          };
        }
        return room;
      });
      return { ...state, rooms: newRoomsState };
    },
  },
});

const { actions, reducer } = defaultRoomsSlice;
export const {
  updateDefaultRooms,
  updateDefaultBase64RoomData,
  updateDefaultRoomsInProgress,
} = actions;
export const defaultRoomReducer = reducer;
