import { injectEvent } from "../../core/injector";
import { PaymentMethodProperties, PaymentsEventTypes } from "./typings";
import CfExceptionHandler from "../../core/CfExceptionHandler";

/**
 *
 * @param eventType
 * @param properties
 * @param {string} userId use this parameter when the logger user is not the same than the user who has created this log
 * @param sendNow
 * @param eventTime
 */
const logIngestEvent = async (
  eventType: PaymentsEventTypes,
  properties: PaymentMethodProperties,
  userId = "",
  sendNow = false,
  eventTime?: string
) => {
  if (properties.payment_id == "") {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "empty payment method id. If there is no payment method id then provide payment_<user_id>"
    );
  } else if (properties.action == undefined) {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "invalid payment method action"
    );
  } else if (properties.order_id == "") {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "empty payment method order id"
    );
  } else if (properties.type == undefined) {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "invalid payment method type"
    );
  } else if (properties.payment_amount < 0) {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "negative payment method payment amount"
    );
  } else if (properties.currency == undefined) {
    new CfExceptionHandler().throwAndLogError(
        PaymentsEventTypes.Payment,
      "invalid payment method currency"
    );
  }

  const internalProps = {
    ...properties,
  };

  injectEvent(
    eventType,
    properties.action,
    internalProps,
    sendNow,
      userId,
    eventTime
  );
};

export default {
  logIngestEvent,
};
