import {
  AutoRollService,
  AutoRollServiceClient,
} from './rpc';

export * from './rpc';

const host = `${window.location.protocol}//${window.location.host}`;
let rpcClient: AutoRollService = new AutoRollServiceClient(host, window.fetch.bind(window));

/**
 * GetAutoRollService returns an AutoRollService implementation which dispatches
 * events indicating when requests have started and ended.
 *
 * @param ele The parent element, used to dispatch events.
 */
export function GetAutoRollService(ele: HTMLElement): AutoRollService {
  const handler = {
    get(target: any, propKey: any, receiver: any) {
      const origMethod = target[propKey];
      return function(...args: any[]) {
        ele.dispatchEvent(new CustomEvent('begin-task', { bubbles: true }));
        return origMethod.apply(rpcClient, args).then((v: any) => {
          ele.dispatchEvent(new CustomEvent('end-task', { bubbles: true }));
          return v;
        }).catch((err: any) => {
          ele.dispatchEvent(new CustomEvent('fetch-error', {
            detail: {
              error: err,
              loading: propKey,
            },
            bubbles: true,
          }));
          Promise.reject(err);
        });
      };
    },
  };
  return new Proxy(rpcClient, handler);
}

/**
 * MockRPCsForTesting switches this module to use the given AutoRollService for
 * testing purposes.
 */
export function MockRPCsForTesting(repl: AutoRollService) {
  rpcClient = repl;
}
