export const CAN_ACCESS_ALERT = 'can_access_alerts';
export const CAN_ACCESS_BZPRO = 'can_access_bzpro';
export const CAN_ACCESS_CALENDAR = 'can_access_calendar';
export const CAN_ACCESS_COMPANYPAGE = 'can_access_companypage';
export const CAN_ACCESS_DESKCHAT = 'can_access_deskchat';
export const CAN_ACCESS_NEWSFEED = 'can_access_newsfeed';
export const CAN_ACCESS_SENTIMENT = 'can_access_sentiment';
export const CAN_ACCESS_SQUAWK = 'can_access_squawk';
export const IS_BETA_USER = 'is_beta_user';

function handleAPIError(name, response) {
  const err = {
    name: name
  };
  return response.json().then(x => {
    const message = x.Error || x.data[0];

    /**
     * Temporary...
     *
     * We need to assign an error type for field specific errors
     * Also a good opportunity to clean up these god awful bz errors
     *
     * @param field {string} the shitty error message
     */
    switch (message) {
    case 'Unable to register. Email already in use.':
      err.type = 'email';
      err.message = 'Email already in use';
      break;
    case 'Invalid email address.':
      err.type = 'email';
      err.message = 'Invalid email address';
      break;
    case 'Unable to register. Password should a minimum of 8 characters.':
      err.type = 'password';
      err.message = 'Password should be a minimum of 8 characters';
      break;
    case 'Invalid Phone Number.':
      err.type = 'phone';
      err.message = 'Invalid phone number.';
      break;
    default:
      err.message = message;
    }

    throw err;
  })
  // If there was an error when parsing the json, set the error name to the passed
  // error name and try to set the message.
  .catch(e => {
    err.message = e.message || e;
    throw err;
  });
}

export function getAuthKey() {
  return localStorage.authKey;
}

export function setAuthKey(data) {
  const authKey = data.Key;

  // Set it
  localStorage.authKey = authKey;

  return authKey;
}

export function deleteAuthKey() {
  localStorage.removeItem('authKey');
}

export function deleteSavedLayout() {
  localStorage.removeItem('layout');
}

export function handleAPIResponse(response) {
  switch (response.status) {
  case 500:
    return handleAPIError('ServerError', response);
  case 400:
    return handleAPIError('RequestError', response);
  case 401:
    return handleAPIError('AuthError', response);
  case 403:
    return handleAPIError('PermissionError', response);
  case 429:
    const err = {
      name: 'QuotaError',
      message: 'Too many failed attempts! Please try again in a moment.'
    };
    throw err;
  default:
    return response.json();
  }
}
