import { capsearchFetch, legacyUrl } from "./capsearchAuth";

type CapsearchMenuApiItem = {
  label?: string | null;
  icon?: string | null;
  url?: string | null;
};

type CapsearchMenuApiResponse = {
  menuItems?: CapsearchMenuApiItem[] | null;
};

type CapsearchMenuApiPayload = CapsearchMenuApiItem[] | CapsearchMenuApiResponse;

export type SidebarNavigationItem = {
  label: string;
  iconClass: string;
  href: string;
};

const fallbackIconClass = "fas fa-circle";

export async function getCapsearchNavigationItems(): Promise<SidebarNavigationItem[]> {
  try {
    const response = await capsearchFetch("/left-menu-bar", {
      method: "GET",
      headers: {
        Accept: "application/json",
      },
    });

    if (!response.ok) {
      return [];
    }

    const data = (await response.json()) as CapsearchMenuApiPayload;
    const menuItems = Array.isArray(data)
      ? data
      : Array.isArray(data.menuItems)
        ? data.menuItems
        : null;

    if (!menuItems) {
      return [];
    }

    return menuItems.flatMap(normalizeCapsearchMenuItem);
  } catch {
    return [];
  }
}

function normalizeCapsearchMenuItem(item: CapsearchMenuApiItem): SidebarNavigationItem[] {
  const label = normalizeValue(item.label);
  const url = normalizeValue(item.url);

  if (!label || !url) {
    return [];
  }

  return [
    {
      label,
      iconClass: normalizeValue(item.icon) ?? fallbackIconClass,
      href: normalizeUrl(url),
    },
  ];
}

function normalizeValue(value: string | null | undefined) {
  const trimmed = value?.trim();
  return trimmed ? trimmed : null;
}

function normalizeUrl(url: string) {
  if (url.startsWith("https://frans.s.capsearch.com/index.php/")) {
    return legacyUrl(url.replace("https://frans.s.capsearch.com/index.php/", ""));
  }

  return url;
}
