import { injectEvent } from "../../core/injector";
import {
  CancelCheckoutProperties,
  CartProperties,
  CheckoutInternalProperties,
  CheckoutProperties,
  DeliveryProperties,
  ECommerceTypes,
  ItemReportProperties,
  ItemRequestProperties,
  ItemProperties,
} from "./typings";
import { validate } from "./validators";
import { getPayloadFromItem } from "./itemObjectMapper";

export const logIngestEvent = async (
  eventType: ECommerceTypes,
  properties:
    | CancelCheckoutProperties
    | CheckoutProperties
    | CartProperties
    | DeliveryProperties
    | ItemReportProperties
    | ItemRequestProperties
    | ItemProperties,
  sendNow = false,
  eventTime?: string
) => {
  if (!validate(eventType, properties)) return;

  if (eventType === ECommerceTypes.Item || eventType === ECommerceTypes.Cart) {
    const prs = properties as ItemProperties | CartProperties;
    const payload = getPayloadFromItem(prs.item);

    injectEvent(
      eventType,
      (properties as any).action,
      payload,
      sendNow,
      "",
      eventTime
    );
    return;
  }

  if (eventType === ECommerceTypes.Checkout) {
    const prs = properties as CheckoutProperties;

    if (!prs.items?.length) return;

    for (const itemObj of prs.items) {
        const itemPayload = getPayloadFromItem(itemObj);
      const payload: CheckoutInternalProperties = {
        order_id: prs.order_id,
        is_successful: prs.is_successful,
        cart_price: prs.cart_price,
        cart_id: prs.cart_id,
        shop_mode: prs.shop_mode,
        meta: prs.meta,
        items: itemPayload,
      };

      injectEvent(
        eventType,
        (prs.is_successful) ? "is_successful" : "not_successful",
        payload,
        sendNow,
        "",
        eventTime
      );
    }

    return;
  }

  injectEvent(
    eventType,
    (properties as any).action,
    properties,
    sendNow,
    "",
    eventTime
  );
};
