import { IUser, newUser } from './model'; import * as ud from 'updeep'; import * as _ from 'lodash'; import { INITIAL_USER_STATE, IUserState } from './state'; import { User } from '../../ingester-api/models'; import {

USER_ADD, USER_ADD_FAIL, USER_ADD_SUCCESS, USER_DELETE, USER_DELETE_FAIL, USER_DELETE_SUCCESS, USER_LOAD,
USER_LOAD_FAIL,
USER_LOAD_SUCCESS, USER_SELECT,
USER_UPDATE,
USER_UPDATE_FAIL,
USER_UPDATE_SUCCESS,
UserActions

} from “./actions”;

export function userReducer(state = ud.freeze(INITIAL_USER_STATE), action: UserActions): IUserState {

const updateState = ud(ud._, state);
switch (action.type) {
  case USER_SELECT: {
    return updateState({selectedUser: action.payload});
  }
  case USER_LOAD: {
    return updateState({updating: true});
  }
  case USER_LOAD_SUCCESS: {
    return updateState({
      users: action.payload.map((user: User) => _.pick(user, ['id', 'name', 'role', 'organizations'])),
      updating: false
    });
  }
  case USER_LOAD_FAIL: {
    return updateState({updating: false});
  }
  case USER_ADD: {
    return updateState({updating: true});
  }
  case USER_ADD_SUCCESS: {
    const user: IUser = action.payload;
    return updateState({
      ids: (ids) => [].concat(ids, [user.id]),
      users: ud({[user.id]: user}, state.users),
      updating: false
    });
  }
  case USER_ADD_FAIL: {
    return updateState({updating: false});
  }
  case USER_UPDATE: {
    return updateState({updating: true});
  }
  case USER_UPDATE_SUCCESS: {
    const user: IUser = action.payload;
    if (!state.users[user.id]) {
      return updateState({updating: false});
    }
    return updateState({
      users: ud({[user.id]: user}, state.users),
      updating: false
    });
  }
  case USER_UPDATE_FAIL: {
    return updateState({updating: false});
  }
  case USER_DELETE: {
    return updateState({updating: true});
  }
  case USER_DELETE_SUCCESS: {
    const user: IUser = action.payload;
    return updateState({
      ids: ud.reject(id => id === user.id),
      users: ud.omit(user.id, state.users),
      updating: false
    })
  }
  case USER_DELETE_FAIL: {
    return updateState({updating: false});
  }
  default: {
    return state;
  }
}

}