import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
import { RootState } from "../store";
import axios from "../../api/axios";
import { favorites } from "../../api-bodies/MockData";

interface FavoritesState {
  favorites: string[];
}

const initialState: FavoritesState = {
  favorites: [],
};

export const favoritesSlice = createSlice({
  name: "favorites",
  initialState,
  reducers: {},
  extraReducers(builder) {
    builder
      .addCase(fetchFavorites.fulfilled, (state, action) => {
        state.favorites = action.payload;
      })
      .addCase(addFavorite.fulfilled, (state, action) => {
        state.favorites.push(action.payload);
      })
      .addCase(removeFavorite.fulfilled, (state, action) => {
        const index = state.favorites.indexOf(action.payload);
        state.favorites.splice(index, 1);
      });
  },
});

export const fetchFavorites = createAsyncThunk(
  "favorites/fetchFavorites",
  async (uuid: string) => {
    if (uuid) {
      const response = await axios.get(`/users/${uuid}/favourites`);
      return response.data.userIds;
    } else {
      return favorites;
    }
  }
);
export const addFavorite = createAsyncThunk(
  "favorites/addFavorite",
  async (ids: { userId: string; toBeAdded: string }) => {
    if (ids.userId) {
      await axios.post(
        `/users/${ids.userId}/favourites`,
        JSON.stringify({ userId: ids.toBeAdded })
      );
      return ids.toBeAdded;
    } else {
      return ids.toBeAdded;
    }
  }
);
export const removeFavorite = createAsyncThunk(
  "favorites/removeFavorite",
  async (ids: { userId: string; toBeRemoved: string }) => {
    if (ids.userId) {
      await axios.delete(`/users/${ids.userId}/favourites/${ids.toBeRemoved}`);
      return ids.toBeRemoved;
    } else {
      return ids.toBeRemoved;
    }
  }
);
export const selectFavorites = (state: RootState) => state.favorites.favorites;
export default favoritesSlice.reducer;
