import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import {
  getAllCampaignsForAccessList,
  getAllKnownPromoCodes,
  getCampaignPromoCodeMap,
} from "@/lib/features/access-list/query";
import { FEATURE_SLUGS, getCheckedAccess } from "@/lib/role-helpers";
import type { AccessScope } from "@/lib/features/types";
import type { Route } from "./+types/page";
import PromoAccessRoleFormClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        { label: "Promo Code Roles", to: "/admin/promo-access-roles" },
        { label: "Role" },
      ]}
    />
  ),
};

/*
 * Serves both add and edit — `roleId === "new"` is the create case.
 *
 * One page rather than two because the form is identical; the only difference is
 * whether there is an existing role to load, which the client decides.
 */
export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.promocodeAccessList,
  "read",
  async ({ request, params }) => {
    const headers = { Cookie: request.headers.get("Cookie") ?? "" };
    // The same three sources the member Access List uses, so a role can only grant
    // campaigns and codes that are actually grantable.
    const [promoCodesRes, campaignsRes, mapRes] = await Promise.all([
      getAllKnownPromoCodes(headers),
      getAllCampaignsForAccessList(headers),
      getCampaignPromoCodeMap(headers),
    ]);
    return {
      roleId: (params as { roleId: string }).roleId,
      accessScope: getCheckedAccess(request, FEATURE_SLUGS.promocodeAccessList),
      promoCodes: promoCodesRes.success ? (promoCodesRes.data ?? []) : [],
      campaigns: campaignsRes.success ? (campaignsRes.data ?? []) : [],
      campaignPromoCodeMap: mapRes.success ? (mapRes.data ?? []) : [],
    };
  },
);

const Page: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { roleId, accessScope, promoCodes, campaigns, campaignPromoCodeMap } =
    loaderData as unknown as {
      roleId: string;
      accessScope: AccessScope;
      promoCodes: Array<{ id: string; name: string }>;
      campaigns: Array<{ id: string; name: string }>;
      campaignPromoCodeMap: Array<{ campaign_id: string; promo_code_id: string }>;
    };
  return (
    <PromoAccessRoleFormClientPage
      roleId={roleId}
      accessScope={accessScope}
      promoCodes={promoCodes}
      campaigns={campaigns}
      campaignPromoCodeMap={campaignPromoCodeMap}
    />
  );
};

export default Page;
