import AuthUtils from "@dndbeyond/authentication-lib-js";

import { getStt } from "./tokenUtils";

export const getAuthHeaders = AuthUtils.makeGetAuthorizationHeaders({
  madeGetShortTermToken: getStt,
});

/**
 * A wrapper around fetch that adds the Authorization header and anything else
 * that may need to be included in every request. If withCookies is true, the
 * request will add the credentials: "include" option. Otherwise, this function
 * should work exactly like the native fetch function.
 *
 * See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
 */
export const summon = async (
  input: RequestInfo | URL,
  init?: RequestInit,
  withCookies?: boolean
) => {
  // Get the Authorization headers from the auth token
  const authHeaders = await getAuthHeaders();
  // If withCookies is true, set the credentials to include
  const credentials = withCookies && { credentials: "include" };
  // If there is a body, set the Content-Type to application/json
  const contentType = init?.body && { "Content-Type": "application/json" };

  return window.fetch(input, {
    ...(credentials as { credentials: RequestCredentials } | undefined),
    ...init,
    headers: {
      ...authHeaders,
      ...init?.headers,
      ...contentType,
      Accept: "application/json",
    },
  });
};
