import { v4 as uuid } from "uuid";
import { RequestBuilder } from "@applicaster/zapp-pipes-v2-client";
import { sessionStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/SessionStorage";
import { getAppUrlScheme } from "@applicaster/zapp-react-native-utils/appDataUtils";

let source: string | null = null;

const addSource = async () => {
  if (source) {
    return source;
  }

  const appUrlScheme = getAppUrlScheme();
  const bundleId = await sessionStorage.getItem("bundleIdentifier");
  const appVersion = await sessionStorage.getItem("version_name");

  if (!appUrlScheme || !bundleId || !appVersion) {
    throw Error(
      `Error: Can not create client data addSource: Check appUrlScheme, bundleId, appversion. Item(s) not exist.
      {appUrlScheme: ${appUrlScheme}, bundleId: ${bundleId}, appVersion: ${appVersion}}`
    );
  }

  source = `${appUrlScheme}://${bundleId}/versions/${appVersion}`;

  return source;
};

export const createCloudEvent = async ({ type, subject, data }) => {
  return {
    specversion: "1.0",
    type,
    datacontenttype: "application/json",
    subject,
    source: await addSource(),
    time: new Date().toISOString(),
    data,
    id: uuid(),
  };
};

export const sendCloudEvent = async (cloudEvent: any, url: string) => {
  if (!url) {
    throw new Error("Feed locator is missing");
  }

  const requestBuilder = new RequestBuilder();

  const response = await requestBuilder
    .setUrl(url)
    .setMethod("POST")
    .addBodyParams(cloudEvent)
    .call<ZappFeed>();

  return response;
};
