import { IBookmark } from "@lonelyplanet/open-planet-node/dist/resources/bookmark";
import { IBookmarkList } from "@lonelyplanet/open-planet-node/dist/resources/bookmarkList";
import { Action, handleActions } from "redux-actions";
import { IUpdateBookmarkDoneAction } from "../actions/bookmark";
import {
  ADD_BOOKMARK_DONE,
  LIST_CREATE_DONE,
  LIST_UPDATE_DONE,
  UPDATE_BOOKMARK_DONE,
} from "../constants/bookmark";

const initialState: IBookmarkReducerState = {
  lists: [],
};

export interface IBookmarkReducerState {
  lists: IBookmarkList[];
}

export interface IBookmarkActionsPayload extends IBookmarkList {
  id?: string;
  listId?: string;
  bookmark?: any;
  entries?: any;
}

export const bookmark = handleActions<
  IBookmarkReducerState,
  IBookmarkActionsPayload
  >
({
  [ADD_BOOKMARK_DONE]: (state, action) => {
    return {
      ...state,
      lists: state.lists.map((list) => {
        if (list.id === action.payload.listId) {
          return {
            ...list,
            entries: [
              ...list.entries,
              {
                ...action.payload.bookmark,
              },
            ],
          };
        }

        return list;
      }),
    };
  },
  [UPDATE_BOOKMARK_DONE]: (state, action) => ({
    ...state,
    lists: state.lists.map((list) => {
      if (list.id === action.payload.listId) {
        const entries = list.entries.map((entry) => {
          if (entry.id === action.payload.bookmark.id) {
            return {
              ...action.payload.bookmark,
            };
          }

          return entry;
        });

        return {
          ...list,
          entries,
        };
      }
      return list;
    }),
  }),
  [LIST_CREATE_DONE]: (state, action) => ({
    ...state,
    lists: [
      ...state.lists,
      {
        ...action.payload,
      },
    ],
  }),
  [LIST_UPDATE_DONE]: (state, action) => ({
    ...state,
    lists: state.lists.map((list) => {
      if (list.id === action.payload.id) {
        return {
          ...list,
          ...action.payload,
          entries: list.entries,
        };
      }
      return list;
    }),
  }),
}, initialState);

export default bookmark;
