import type { ExternalMembership } from "@karma/viewpoint-sdk/types";
import moment from "moment";
import { logError } from "../logger";

type RedirectionType = "direct" | "sso";

interface BaseMenuItem {
  type: "item" | "group";
  label: string;
}

interface ItemMenu extends BaseMenuItem {
  type: "item";
  slug: string;
  isExternal: boolean;
  redirectionType: RedirectionType;
  externalURL: string | null;
  appPathname: string | null;
}

interface GroupMenu extends BaseMenuItem {
  type: "group";
  expandAsDefault: boolean;
  menuItems: MenuItem[];
}

type MenuItem = ItemMenu | GroupMenu;

export type Menu = MenuItem[];

export const _checkExternalMembership = async (
  slug: "241-rewards" | "member-privileges-travel",
  external_memberships: ExternalMembership[],
) => {
  const externalEntityIDMap = {
    "241-rewards": 95401,
    "member-privileges-travel": 95711,
  };
  try {
    if (!externalEntityIDMap[slug]) {
      return false;
    }

    const external_membership = external_memberships.find(
      (ex) => ex.EntityID === externalEntityIDMap[slug],
    );
    if (!external_membership) {
      return false;
    }
    if (
      slug === "241-rewards" &&
      !moment(external_membership.CommenceDate).isAfter("2024-09-30")
    ) {
      return false;
    }

    return true;
  } catch (err) {
    logError(err);
    return false;
  }
};

export const _validateMenuItems = async (
  menu: Menu,
  account_policies: Record<
    string,
    | string
    | "read"
    | "write"
    | "all"
    | "block"
    | "READ"
    | "WRITE"
    | "BLOCK"
    | "BLOCKED"
    | boolean
  >,
  external_memberships: ExternalMembership[],
): Promise<Menu> => {
  const sanitized_menu: Menu = [];

  for (const item of menu) {
    if (item.type === "item") {
      if (
        account_policies[item.slug] &&
        (account_policies[item.slug] === false ||
          account_policies[item.slug] === "BLOCK" ||
          account_policies[item.slug] === "block" ||
          account_policies[item.slug] === "BLOCKED")
      ) {
        continue;
      }
      if (
        item.slug === "241-rewards" ||
        item.slug === "member-privileges-travel"
      ) {
        const has_external_membership = await _checkExternalMembership(
          item.slug,
          external_memberships,
        );
        if (!has_external_membership)
          continue;
      }
      sanitized_menu.push(item);
    } else if (item.type === "group") {
      const sanitized_menu_items = await _validateMenuItems(
        item.menuItems,
        account_policies,
        external_memberships,
      );
      if (sanitized_menu_items.length === 0) {
        continue;
      }
      sanitized_menu.push({
        type: item.type,
        label: item.label,
        expandAsDefault: item.expandAsDefault,
        menuItems: sanitized_menu_items,
      });
    }
  }

  return sanitized_menu;
};
