import { rewardValue } from "@/lib/features/promo-codes/rewards";
import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import { getBookingsByMembership } from "@/lib/features/bookings/query";
import type { CoreBookingUnit } from "@/lib/features/bookings/types";
import {
  getMemberShipContacts,
  getMembershipDetails,
} from "@/lib/features/members/query";
import type {
  CoreMemberDetailed,
  VpAccountDetails,
} from "@/lib/features/members/types";
import { getPromoCodeByCode } from "@/lib/features/promo-codes/query";
import type { CoreAPIPagination, CoreResponse } from "@/lib/features/types";
import { FEATURE_SLUGS } from "@/lib/role-helpers";
import type { Route } from "./+types/page";
// Reuse the promo-code member view; the Reports overrides keep navigation in-section.
import MemberInPromoCodeClient from "@/routes/promo-code-campaigns/$campaignId/promo-codes/$promoCodeId/members/$membershipNumber/_client";

/**
 * Points a member receives from this promo code.
 *
 * Delegates to the shared reward reader — the inline version matched only the
 * exact string "POINTS", so a reward stored as "point" resolved to null.
 */
function extractPointsFromPromo(promo: unknown): number | null {
  return rewardValue(promo as Parameters<typeof rewardValue>[0], "points");
}

export const handle = {
  breadcrumb: ({
    params,
  }: {
    params: { code: string; membershipNumber: string };
  }) => (
    <BreadCrumbLink
      links={[
        { label: "Reports", to: "/admin/reports" },
        { label: `Member #${params.membershipNumber}` },
      ]}
    />
  ),
};

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.campaignReports,
  "read",
  async ({ request, params }) => {
    const { code, membershipNumber } = params as {
      code: string;
      membershipNumber: string;
    };
    const url = new URL(request.url);
    const page = parseInt(url.searchParams.get("page") ?? "1", 10) || 1;
    const pageSize =
      parseInt(url.searchParams.get("pageSize") ?? "100", 10) || 100;

    const cookie = { Cookie: request.headers.get("Cookie") ?? "" };
    const membershipRes = await getMembershipDetails(membershipNumber, cookie);
    const realId =
      (membershipRes?.success &&
        (membershipRes.data?.account?.AccountID as string)) ||
      membershipNumber;
    const [contactsResponse, membershipBookings, promoResponse] =
      await Promise.all([
        getMemberShipContacts(realId, cookie),
        getBookingsByMembership(page, pageSize, realId, request),
        getPromoCodeByCode(code, cookie),
      ]);
    const pointsAllocated = promoResponse?.success
      ? extractPointsFromPromo(promoResponse.data)
      : null;
    return {
      code,
      membershipNumber,
      membershipRes,
      contactsResponse,
      membershipBookings,
      pointsAllocated,
    };
  },
);

const Page: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const {
    code,
    membershipNumber,
    membershipRes,
    contactsResponse,
    membershipBookings,
    pointsAllocated,
  } = loaderData as unknown as {
    code: string;
    membershipNumber: string;
    membershipRes: CoreResponse<{ account: VpAccountDetails }>;
    contactsResponse: CoreResponse<{ members: CoreMemberDetailed[] }>;
    membershipBookings?: CoreResponse<{
      bookings: CoreBookingUnit[];
      pagination: CoreAPIPagination;
    }>;
    pointsAllocated: number | null;
  };
  return (
    <MemberInPromoCodeClient
      promoCodeId={code}
      membershipNumber={membershipNumber}
      account={
        membershipRes?.success ? (membershipRes.data?.account ?? null) : null
      }
      contacts={
        contactsResponse?.success ? (contactsResponse.data?.members ?? []) : []
      }
      bookings={{
        data: membershipBookings?.data?.bookings ?? [],
        totalRows: membershipBookings?.data?.pagination?.total ?? 0,
      }}
      pointsAllocated={pointsAllocated}
      initialError={membershipRes?.success ? undefined : membershipRes?.message}
      backHref="/admin/reports"
      contactHrefBase={`/admin/reports/members/${code}/${membershipNumber}`}
    />
  );
};

export default Page;
