import CfExceptionHandler from "../../../core/CfExceptionHandler";
import { hasRepeatedIds } from "../../../utils";
import {
  LevelProperties,
  LoyaltyTypes,
  MilestoneProperties,
  PromoProperties,
  RedeemType,
  RewardAction,
  RewardCatalog,
  RewardProperties,
  SurveyCatalog,
  SurveyProperties,
} from "../typings";

export const validatePromoEvent = (properties: PromoProperties): boolean => {
  if (properties.promo_id == "") {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Promo,
      "empty promo id"
    );
    return false;
  } else if (properties.title == "") {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Promo,
      "empty promo title"
    );
    return false;
  } else if (properties.action == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Promo,
      "invalid promo action"
    );
    return false;
  } else if (properties.items_list.length == 0) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Promo,
      "empty promo items list"
    );
    return false;
  } else if (hasRepeatedIds(properties.items_list)) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Promo,
      "promo items list repeated ids"
    );
    return false;
  }
  return true;
};

export const validateLevelEvent = (properties: LevelProperties): boolean => {
  if (properties.module_id == "") {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Level,
      "empty level module id"
    );
    return false;
  } else if (properties.prev_level < 0) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Level,
      "negative level previous_level"
    );
    return false;
  } else if (properties.new_level < 0) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Level,
      "negative level new_level"
    );
    return false;
  }
  return true;
};

export const validateMilestoneEvent = (
  properties: MilestoneProperties
): boolean => {
  if (properties.milestone_id == "") {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Milestone,
      "empty milestone id"
    );
    return false;
  } else if (properties.action == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Milestone,
      "invalid milestone action"
    );
    return false;
  }
  return true;
};

export const validateSurveyEvent = (properties: SurveyProperties): boolean => {
  if (properties.action == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Survey,
      "invalid survey action"
    );
    return false;
  } else if (properties.type == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Survey,
      "invalid survey type"
    );
    return false;
  } else if (properties.is_completed == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Survey,
      "invalid survey is_completed"
    );
    return false;
  } else if (properties.response_list.length == 0) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Survey,
      "empty survey response list"
    );
    return false;
  }

  return true;
};

export const validateRewardEvent = (properties: RewardProperties): boolean => {
  if (properties.reward_id == "") {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Reward,
      "empty reward id"
    );
    return false;
  } else if (properties.action == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Reward,
      "invalid reward action"
    );
    return false;
  } else if (
    properties.action == RewardAction.Add &&
    properties.acc_points == undefined
  ) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Reward,
      "reward acc_points are required for add action"
    );
    return false;
  } else if (properties.total_points == undefined) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Reward,
      "invalid reward total points"
    );
    return false;
  } else if (
    properties.action == RewardAction.Redeem &&
    properties.acc_points == undefined
  ) {
    new CfExceptionHandler().throwAndLogError(
      LoyaltyTypes.Reward,
      "reward redeem object required for redeem action"
    );
    return false;
  } else if (
    properties.action == RewardAction.Redeem &&
    properties.redeem_type != undefined
  ) {
    if (properties.redeem_type == undefined) {
      new CfExceptionHandler().throwAndLogError(
        LoyaltyTypes.Reward,
        "invalid reward redeem type"
      );
      return false;
    } else if (properties.redeem_is_successful == undefined) {
      new CfExceptionHandler().throwAndLogError(
        LoyaltyTypes.Reward,
        "invalid reward redeem is successful"
      );
      return false;
    } else if (properties.redeem_points_withdrawn == undefined) {
      new CfExceptionHandler().throwAndLogError(
        LoyaltyTypes.Reward,
        "invalid reward redeem points withdrawn"
      );
      return false;
    } else if (properties.redeem_converted_value == undefined) {
      new CfExceptionHandler().throwAndLogError(
        LoyaltyTypes.Reward,
        "invalid reward redeem converted value"
      );
      return false;
    } else if (
      properties.redeem_type == RedeemType.Cash &&
      properties.redeem_currency == undefined
    ) {
      new CfExceptionHandler().throwAndLogError(
        LoyaltyTypes.Reward,
        "invalid reward currency"
      );
      return false;
    }
  }
  return true;
};
