import { List as ImmutableList } from 'immutable';

import type { RootState } from 'soapbox/store';

export const validId = (id: any) => typeof id === 'string' && id !== 'null' && id !== 'undefined';

export const isURL = (url: string) => {
  try {
    new URL(url);
    return true;
  } catch {
    return false;
  }
};

export const parseBaseURL = (url: any) => {
  try {
    return new URL(url).origin;
  } catch {
    return '';
  }
};

export const getLoggedInAccount = (state: RootState) => {
  const me = state.me;
  return state.accounts.get(me);
};

export const isLoggedIn = (getState: () => RootState) => {
  return validId(getState().me);
};

export const getAppToken = (state: RootState) => state.auth.getIn(['app', 'access_token']) as string;

export const getUserToken = (state: RootState, accountId?: string | false | null) => {
  const accountUrl = state.accounts.getIn([accountId, 'url']);
  return state.auth.getIn(['users', accountUrl, 'access_token']) as string;
};

export const getAccessToken = (state: RootState) => {
  const me = state.me;
  return getUserToken(state, me);
};

export const getAuthUserId = (state: RootState) => {
  const me = state.auth.get('me');

  return ImmutableList([
    state.auth.getIn(['users', me, 'id']),
    me,
  ]).find(validId);
};

export const getAuthUserUrl = (state: RootState) => {
  const me = state.auth.get('me');

  return ImmutableList([
    state.auth.getIn(['users', me, 'url']),
    me,
  ]).find(isURL);
};

/** Get the VAPID public key. */
export const getVapidKey = (state: RootState) => {
  return state.auth.getIn(['app', 'vapid_key']) || state.instance.getIn(['pleroma', 'vapid_public_key']);
};
