import * as types from "./types";
import _ from "lodash";

const initialState = {
  firstLoadFlag: true,
  template: {
    totalCounts: 0,
    items: [],
  },
};

export const templateManageReducer = (state = initialState, { type, payload }) => {
  const { template } = state;
  const { totalCounts, items } = template;
  let newItems: any = [];

  switch (type) {
    case types.UPDATE_SSR_TEMPLATE:
      return {
        ...state,
        firstLoadFlag: true,
        template: payload.template,
      };
    case types.GET_TEMPLATE_SUCCEEDED:
      return {
        ...state,
        firstLoadFlag: false,
        template: payload.template,
      };
    case types.SEARCH_TEMPLATE_SUCCEEDED:
      return {
        ...state,
        firstLoadFlag: false,
        template: payload.template,
      };
    case types.ADD_TEMPLATE_SUCCEEDED:
      newItems = [...items];
      newItems.push(payload.template);
      return {
        ...state,
        firstLoadFlag: false,
        template: {
          totalCounts: totalCounts + 1,
          items: newItems,
        },
      };
    case types.MOD_TEMPLATE_SUCCEEDED:
      const modItem = payload.template;

      _.each(items, (item: any) => {
        if (item.id == modItem.id) {
          newItems.push(modItem);
        } else {
          newItems.push(item);
        }
      });
      return {
        ...state,
        firstLoadFlag: false,
        template: {
          totalCounts: totalCounts,
          items: newItems,
        },
      };
    case types.DEL_TEMPLATE_SUCCEEDED:
      const delItemId = payload.id;

      _.each(items, (item: any) => {
        if (item.id != delItemId) {
          newItems.push(item);
        }
      });

      return {
        ...state,
        firstLoadFlag: false,
        template: {
          totalCounts: totalCounts - 1,
          items: newItems,
        },
      };
    case types.BATCH_DEL_TEMPLATE_SUCCEEDED:
      const delItemIds = payload.ids;
      const allIds = _.map(
        _.map(items, (item) => _.pick(item, ["id"])),
        "id"
      );
      const diffIds = _.xor(allIds, delItemIds);

      newItems = _.filter(items, (item: any) => _.includes(diffIds, item.id));

      let newTotalCounts = totalCounts - delItemIds.length;
      if (newTotalCounts < 0) newTotalCounts = 0;

      return {
        ...state,
        firstLoadFlag: false,
        template: {
          totalCounts: newTotalCounts,
          items: newItems,
        },
      };
    default:
      return state;
  }
};
