import { Reducer } from "react";
import update from "immutability-helper";

import { State, Action, ActionType } from "./types";

const reducer: <Item>() => Reducer<State<Item>, Action<Item>> = () => (state, action) => {
  switch (action.type) {
    case ActionType.INITIALIZE_ITEMS: {
      const {
        initialSelectedItems = [],
        initialItems = [],
      } = action.payload;

      return update(state, {
        items: {
          $set: initialItems.map((item) => ({
            ...item,
            isSelected: initialSelectedItems.includes(item),
          })),
        },
      });
    }

    case ActionType.TOGGLE_SINGLE_ITEM: {
      const { items, itemIdentifierKey } = state;

      const { itemIdentifierValue } = action.payload;

      const itemIndex = items.findIndex((itemFound) => (
        itemFound[itemIdentifierKey] === itemIdentifierValue
      ));

      const item = items[itemIndex];

      return update(state, {
        items: {
          $splice: [[itemIndex, 1, {
            ...item,
            isSelected: !item.isSelected,
          }]],
        },
      });
    }

    case ActionType.TOGGLE_ALL_ITEMS: {
      return update(state, {
        items: {
          $set: state.items.map(item => ({
            ...item,
            isSelected: !item.isSelected,
          })),
        },
      });
    }

    default: {
      throw new Error("Unknown action type");
    }
  }
};

export default reducer;