import { injectEvent } from "../../core/injector";
import {
  LevelProperties,
  LoyaltyTypes,
  MilestoneProperties,
  PromoAction,
  PromoProperties,
  RewardProperties,
  SurveyProperties,
} from "./typings";
import {
  validateLevelEvent,
  validateMilestoneEvent,
  validatePromoEvent,
  validateRewardEvent,
  validateSurveyEvent,
} from "./validators";

export const logIngestEvent = async (
  eventType: LoyaltyTypes,
  properties:
    | PromoProperties
    | LevelProperties
    | MilestoneProperties
    | SurveyProperties
    | RewardProperties,
  sendNow = false,
  eventTime?: string
) => {
  let checkProps = true;
  let property: PromoAction | undefined;

  switch (eventType) {
    case LoyaltyTypes.Promo:
      checkProps = validatePromoEvent(properties as PromoProperties);
      if (checkProps) {
        property = (properties as PromoProperties).action;
      }
      break;
    case LoyaltyTypes.Level:
      checkProps = validateLevelEvent(properties as LevelProperties);
      break;
    case LoyaltyTypes.Milestone:
      checkProps = validateMilestoneEvent(properties as MilestoneProperties);
      if (checkProps) {
        property = (properties as PromoProperties).action;
      }
      break;
    case LoyaltyTypes.Survey:
      checkProps = validateSurveyEvent(properties as SurveyProperties);
      if (checkProps) {
        property = (properties as PromoProperties).action;
      }
      break;
    case LoyaltyTypes.Reward:
      checkProps = validateRewardEvent(properties as RewardProperties);
      if (checkProps) {
        property = (properties as PromoProperties).action;
      }
      break;
  }

  if (!checkProps) {
    return; // Exit if the properties validation failed
  }

  injectEvent(eventType, property, properties, sendNow, "", eventTime);
};
