// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview The background script for the desk_api_bridge
 * This module routes Desk API calls to the service worker.
 */

import type {ChromeApi, DeskApiBridgeRequest, MessageSender, SendMessageResponse} from './desk_api_types.js';
import {ResponseType} from './message_type.js';
import {ServiceWorkerFactory} from './service_worker.js';
import type {DeskApi, NotificationApi} from './types.js';

/**
 * Extension entry point.
 */
export class Background {
  constructor(
      private readonly chromeAPI: ChromeApi, private readonly deskAPI: DeskApi,
      private readonly notifAPI: NotificationApi) {
    const serviceWorkerFactory = new ServiceWorkerFactory(
        this.deskAPI, this.notifAPI, /*isTest=*/ false);
    this.chromeAPI.runtime.onMessageExternal.addListener(
        (request: DeskApiBridgeRequest, sender: unknown,
         sendResponse: SendMessageResponse) => {
          serviceWorkerFactory.get()
              .then((serviceWorker) => {
                serviceWorker.handleMessage(request, sender as MessageSender)
                    .then((response) => {
                      sendResponse(response);
                    })
                    .catch((error: Error) => {
                      sendResponse({
                        messageType: ResponseType.OPERATION_FAILURE,
                        operands: [],
                        errorMessage: error.message,
                      });
                    });
              })
              .catch((error: Error) => {
                sendResponse({
                  messageType: ResponseType.OPERATION_FAILURE,
                  operands: [],
                  errorMessage: error.message,
                });
              });

          // assures that the service worker will continue to accept requests
          // after it's no longer active.
          return true;
        });


    // @ts-ignore: onConnectExternal defined in chrome.runtime
    this.chromeAPI.runtime.onConnectExternal.addListener(
        // @ts-ignore: Port defined in chrome.runtime
        (port: chrome.runtime.Port) => {
          serviceWorkerFactory.get().then(serviceWorker => {
            serviceWorker.registerEventsListener(port);
          });
        });
  }
}
