import loginDialog from './ui/dialogs/loginBox';
import { SHOWN } from './CONST';
import { ICEServer } from './IceServers';
import { SettingsCallback } from './FormWatcher';
import { IJID } from './JID.interface';

/* tslint:disable:no-unnecessary-initializer */
// We need to initialize options with undefined, otherwise they will not be exported.

/** name of container application (e.g. Nextcloud or SOGo) */
export let appName = 'web applications';

/** How many messages should be logged? */
export let numberOfMessages = 100;

/** Language as IETF language tag (e.g. en, de, es) */
export let lang = '';

/** Auto language detection */
export let autoLang = true;

/** Place for roster */
export let rosterAppend = 'body';

/** Default visibility of roster */
export let rosterVisibility = SHOWN;

/** Set to true if you want to hide offline contacts */
export let hideOfflineContacts = false;

/** Returns permanent saved settings. */
export let loadOptions: (jid: string, password: string) => Promise<{ [id: string]: { [key: string]: any } }> =
   undefined;

/** This function is called after a watched form or the login box is submitted. */
export let loadConnectionOptions: SettingsCallback = undefined;

/** This function is called if an option gets changed. */
export let onOptionChange: (id: string, key: string, value: any, exportId: () => any) => void = undefined;

/** Returns a list of usernames and aliases */
export let getUsers: (search: string) => Promise<{ [uid: string]: string }> = undefined;

/** @TODO Options for info in favicon (UNUSED) */
export let favicon = {
   enable: true,

   /** Favicon info background color */
   bgColor: '#E59400',

   /** Favicon info text color */
   textColor: '#fff',
};

/** This function is called for every avatar element without a user defined avatar. */
export let avatarPlaceholder: (element: JQuery, name: string, color: string, jid?: IJID) => void = (
   element: JQuery,
   text: string,
   color: string
) => {
   element.css({
      'background-color': color,
      color: '#fff',
      'font-weight': 'bold',
      'text-align': 'center',
      'line-height': '36px', // element.height() + 'px',
      'font-size': '22px', //element.height() * 0.6 + 'px'
   });

   element.text(text.length ? text[0].toUpperCase() : '');
};

export interface IRTCPeerConfig {
   ttl: number;
   url?: string;
   withCredentials: boolean;
   iceServers: ICEServer[];
}

/** RTCPeerConfiguration used for audio/video calls. */
export let RTCPeerConfig: IRTCPeerConfig = {
   /** Time-to-live for config from url */
   ttl: 3600,

   /** [optional] If set, jsxc requests and uses RTCPeerConfig from this url */
   url: null,

   /** If true, jsxc send cookies when requesting RTCPeerConfig from the url above */
   withCredentials: false,

   /** ICE servers like defined in http://www.w3.org/TR/webrtc/#idl-def-RTCIceServer */
   iceServers: [
      {
         urls: 'stun:stun.stunprotocol.org',
      },
   ],
};

/** Link to an online user manual */
export let onlineHelp = 'http://www.jsxc.org/manual.html';

/** @TODO (UNUSED) */
export let viewport = {
   getSize() {
      let w = $(window).width() - $('#jsxc_windowListSB').width();
      let h = $(window).height();

      // if (jsxc.storage.getUserItem('roster') === 'shown') {
      //    w -= $('#jsxc_roster').outerWidth(true);
      // }

      return {
         width: w,
         height: h,
      };
   },
};

/**
 * Download urls to screen media extensions. (UNUSED)
 *
 * @type {Object}
 * @see example extensions {@link https://github.com/otalk/getScreenMedia}
 */
export let screenMediaExtension = {
   firefox: '',
   chrome: '',
};

/** Options for native browser notifications */
export let notification = {
   enable: true,

   /** duration for notification */
   popupDuration: 6000,

   /** Mute notification sound? */
   mute: false,
};

export let storage = window.localStorage;

export let disabledPlugins: string[] = ['time'];

export let connectionCallback: (jid: string, status: number, condition?: string) => void = null;

export let onUserRequestsToGoOnline: () => void = loginDialog;

export let automaticallyRestoreAccounts = true;

/** Images are automatically loaded from trusted domains. To trust all subdomains, use a asterix as wildcard. */
export let trustedDomains: string[] = [];

export let includeOSInVersionResponse = false;
