// META: global=window-module
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/notifications/resources/helpers.js
// META: variant=?includeAppServerKey=true
// META: variant=?includeAppServerKey=false

import { pushMessage } from "./resources/helpers.js"
import { createVapid } from "./resources/vapid.js";

const includeAppServerKey = new URL(location.href).searchParams.get("includeAppServerKey") === "true";
let registration;

async function subscribe(t) {
  if (includeAppServerKey) {
    const vapid = await createVapid();
    const subscription = await registration.pushManager.subscribe({
      applicationServerKey: vapid.publicKey
    });
    t.add_cleanup(() => subscription.unsubscribe());
    return { vapid, subscription };
  }

  // without key
  try {
    const subscription = await registration.pushManager.subscribe();
    t.add_cleanup(() => subscription.unsubscribe());
    return { subscription };
  } catch (err) {
    if (err.name === "NotSupportedError") {
      // happens if and only if applicationServerKey omission is disallowed,
      // which is permitted per the spec. Throwing OptionalFeatureUnsupportedError marks the
      // result as PRECONDITION_FAILED.
      //
      // https://w3c.github.io/push-api/#subscribe-method
      // If the options argument does not include a non-null value for the applicationServerKey
      // member, and the push service requires one to be given, queue a global task on the
      // networking task source using global to reject promise with a "NotSupportedError"
      // DOMException.
      throw new OptionalFeatureUnsupportedError(description);
    } else {
      throw err;
    }
  }
}

async function pushMessageAndWaitForPushEvent(subscription, options) {
  const promise = new Promise(r => {
    navigator.serviceWorker.addEventListener("message", r, { once: true })
  });

  pushMessage(subscription, options);

  return (await promise).data;
}

promise_setup(async () => {
  await trySettingPermission("granted");
  registration = await prepareActiveServiceWorker("push-sw.js");
});

promise_test(async (t) => {
  const { vapid, subscription } = await subscribe(t);

  const event = await pushMessageAndWaitForPushEvent(subscription, { vapid });

  assert_equals(event.constructor, "PushEvent");
  assert_equals(event.data, null);
}, "Posting to the push endpoint should fire push event on the service worker");

const entries = [
  { isJSON: false, message: new TextEncoder().encode("Hello") },
  { isJSON: false, message: new Uint8Array([226, 130, 40, 240, 40, 140, 188]) },
  { isJSON: true, message: new TextEncoder().encode(JSON.stringify({ hello: "world" })) },
  { isJSON: false, message: new Uint8Array() },
  { isJSON: false, message: new Uint8Array([0x48, 0x69, 0x21, 0x20, 0xf0, 0x9f, 0x91, 0x80]) },
];

for (const { isJSON, message } of entries) {
  promise_test(async (t) => {
    const { vapid, subscription } = await subscribe(t);

    const event = await pushMessageAndWaitForPushEvent(subscription, { vapid, message });

    assert_equals(event.constructor, "PushEvent");
    assert_array_equals(new Uint8Array(event.data.arrayBuffer), message);
    assert_array_equals(new Uint8Array(await event.data.blob.arrayBuffer()), message);
    assert_equals(event.data.text, new TextDecoder().decode(message));

    assert_equals(event.data.json.ok, isJSON);
    if (isJSON) {
      assert_array_equals(
        new TextEncoder().encode(JSON.stringify(event.data.json.value)),
        message
      );
    }

  }, `Posting to the push endpoint with encrypted data ${message} should fire push event on the service worker`);
}
