import {hash_with_key, create_hash, filter_hash} from '../common/utilities'

export function store_items(state, items_name, items) {
  return {
    ...state,
    [items_name]: {
      ...state[items_name],
      ...hash_with_key(items),
    },
  }
}

export function update_item(state, items_name, item) {
  return {
    ...state,
    [items_name]: {
      ...state[items_name],
      [item.id]: {
        ...(state[items_name][item.id] || {}),
        ...item,
      },
    },
  }
}

export function update_items(state, items_name, items) {
  return items.reduce((state, item) => update_item(state, items_name, item), state)
}

export function remove_item(state, items_name, item_id) {
  let items = {...state[items_name]}
  if (items[item_id]) {
    delete items[item_id]
  }
  return {
    ...state,
    [items_name]: items,
  }
}

export function filter_items(state, items_name, filter) {
  return {
    ...state,
    [items_name]: filter_hash(state[items_name], filter),
  }
}

export function create_item(state, items_name, item) {
  return store_items({...state, idGenerator: state.idGenerator - 1}, items_name, [item])
}

export function update_item_id(state, items_name, item, temp_id) {
  return store_items(remove_item(state, items_name, temp_id), items_name, [{...state[items_name][temp_id], ...item}])
}

export function add_item_id(state, items_name, item_id) {
  return update_item_id_in_set(state, items_name, item_id, true)
}

export function remove_item_id(state, items_name, item_id) {
  return update_item_id_in_set(state, items_name, item_id, false)
}

export function toggle_item_id(state, items_name, item_id) {
  return update_item_id_in_set(state, items_name, item_id, !state[items_name][item_id])
}

export function update_item_ids_in_set(state, items_name, item_ids, status) {
  return {
    ...state,
    [items_name]: {
      ...state[items_name],
      ...create_hash(item_ids, () => status),
    },
  }
}

export function update_item_id_in_set(state, items_name, item_id, status) {
  return update_item_ids_in_set(state, items_name, [item_id], status)
}
