import { Map as ImmutableMap } from 'immutable';
import { List as ImmutableList } from 'immutable';

const guessDomain = account => {
  try {
    let re = /https?:\/\/(.*?)\//i;
    return re.exec(account.get('url'))[1];
  } catch(e) {
    return null;
  }
};

export const getDomain = account => {
  let domain = account.get('acct').split('@')[1];
  if (!domain) domain = guessDomain(account);
  return domain;
};

export const guessFqn = account => {
  const [user, domain] = account.get('acct').split('@');
  if (!domain) return [user, guessDomain(account)].join('@');
  return account.get('acct');
};

// user@domain even for local users
export const acctFull = account => (
  account.get('fqn') || guessFqn(account)
);

export const getAcct = (account, displayFqn) => (
  displayFqn === true ? acctFull(account) : account.get('acct')
);

export const isStaff = (account = ImmutableMap()) => (
  [isAdmin, isModerator].some(f => f(account) === true)
);

export const isAdmin = account => (
  account.getIn(['pleroma', 'is_admin']) === true
);

export const isModerator = account => (
  account.getIn(['pleroma', 'is_moderator']) === true
);

export const getFollowDifference = (state, accountId, type) => {
  const listSize = state.getIn(['user_lists', type, accountId, 'items'], ImmutableList()).size;
  const counter = state.getIn(['accounts_counters', accountId, `${type}_count`], 0);
  return Math.max(counter - listSize, 0);
};

export const isLocal = account => {
  let domain = account.get('acct').split('@')[1];
  return domain === undefined ? true : false;
};

export const isVerified = account => (
  account.getIn(['pleroma', 'tags'], ImmutableList()).includes('verified')
);
