/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

/* eslint-env mozilla/frame-script */

const { XPCOMUtils } = ChromeUtils.import(
  "resource://gre/modules/XPCOMUtils.jsm"
);

const manager = Cc["@mozilla.org/presentation-device/manager;1"].getService(
  Ci.nsIPresentationDeviceManager
);

var testProvider = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDeviceProvider"]),
  forceDiscovery() {
    sendAsyncMessage("force-discovery");
  },
  listener: null,
};

var testDevice = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
  establishControlChannel() {
    return null;
  },
  disconnect() {},
  isRequestedUrlSupported(requestedUrl) {
    return true;
  },
  id: null,
  name: null,
  type: null,
  listener: null,
};

var testDevice1 = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
  id: "dummyid",
  name: "dummyName",
  type: "dummyType",
  establishControlChannel(url, presentationId) {
    return null;
  },
  disconnect() {},
  isRequestedUrlSupported(requestedUrl) {
    return true;
  },
};

var testDevice2 = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
  id: "dummyid",
  name: "dummyName",
  type: "dummyType",
  establishControlChannel(url, presentationId) {
    return null;
  },
  disconnect() {},
  isRequestedUrlSupported(requestedUrl) {
    return true;
  },
};

var mockedDeviceWithoutSupportedURL = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
  id: "dummyid",
  name: "dummyName",
  type: "dummyType",
  establishControlChannel(url, presentationId) {
    return null;
  },
  disconnect() {},
  isRequestedUrlSupported(requestedUrl) {
    return false;
  },
};

var mockedDeviceSupportHttpsURL = {
  QueryInterface: ChromeUtils.generateQI(["nsIPresentationDevice"]),
  id: "dummyid",
  name: "dummyName",
  type: "dummyType",
  establishControlChannel(url, presentationId) {
    return null;
  },
  disconnect() {},
  isRequestedUrlSupported(requestedUrl) {
    if (requestedUrl.includes("https://")) {
      return true;
    }
    return false;
  },
};

addMessageListener("setup", function() {
  manager.addDeviceProvider(testProvider);

  sendAsyncMessage("setup-complete");
});

addMessageListener("trigger-device-add", function(device) {
  testDevice.id = device.id;
  testDevice.name = device.name;
  testDevice.type = device.type;
  manager.addDevice(testDevice);
});

addMessageListener("trigger-add-unsupport-url-device", function() {
  manager.addDevice(mockedDeviceWithoutSupportedURL);
});

addMessageListener("trigger-add-multiple-devices", function() {
  manager.addDevice(testDevice1);
  manager.addDevice(testDevice2);
});

addMessageListener("trigger-add-https-devices", function() {
  manager.addDevice(mockedDeviceSupportHttpsURL);
});

addMessageListener("trigger-device-update", function(device) {
  testDevice.id = device.id;
  testDevice.name = device.name;
  testDevice.type = device.type;
  manager.updateDevice(testDevice);
});

addMessageListener("trigger-device-remove", function() {
  manager.removeDevice(testDevice);
});

addMessageListener("trigger-remove-unsupported-device", function() {
  manager.removeDevice(mockedDeviceWithoutSupportedURL);
});

addMessageListener("trigger-remove-multiple-devices", function() {
  manager.removeDevice(testDevice1);
  manager.removeDevice(testDevice2);
});

addMessageListener("trigger-remove-https-devices", function() {
  manager.removeDevice(mockedDeviceSupportHttpsURL);
});

addMessageListener("teardown", function() {
  manager.removeDeviceProvider(testProvider);
});
