// Copyright (c) 2019 Uber Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import {parseXVIZMessageSync} from './parse-xviz-message-sync';
import {postDeserialize} from './serialize';
import {getWorkerFarm, initializeWorkerFarm} from './parse-xviz-message-workerfarm';

// Public function for initializing workers
export function initializeWorkers({id, worker, maxConcurrency = 4, capacity = null}) {
  initializeWorkerFarm({id, worker, maxConcurrency, capacity});
}

export function parseXVIZMessage({
  message,
  // callbacks
  onResult,
  onError,
  debug,
  // worker options
  worker = false,
  workerId = 'default',
  maxConcurrency = 4,
  capacity = null,
  opts = {}
}) {
  if (worker) {
    const id = workerId;
    if (!getWorkerFarm(id)) {
      initializeWorkers({id, worker, maxConcurrency, capacity});
    }

    const workerFarm = getWorkerFarm(id);

    if (debug) {
      workerFarm.debug = debug;
    }

    const onMessage = data => onResult(postDeserialize(data));
    workerFarm.process({data: message, opts}, onMessage, onError);
  } else {
    parseXVIZMessageSync(message, onResult, onError, opts);
  }
}
