import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import {
  getMemberByMemberNumber,
  getMemberSessionsByUserId,
  resetMemberPassword,
} from "@/lib/features/members/query";
import type {
  CoreMemberDetailed,
  CoreMemberSession,
} from "@/lib/features/members/types";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import type { AccessScope, CoreResponse } from "@/lib/features/types";
import { FEATURE_SLUGS, getCheckedAccess } from "@/lib/role-helpers";
import type { Route } from "./+types/page";
// Reuse the promo-code contact view; backHref keeps navigation in the Reports section.
import ContactInPromoCodeClient from "@/routes/promo-code-campaigns/$campaignId/promo-codes/$promoCodeId/members/$membershipNumber/$contactId/_client";

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

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.campaignReports,
  "read",
  async ({ request, params }) => {
    // Member endpoints are Core2-native now and need the console session.
    const memberHeaders = { Cookie: request.headers.get("Cookie") ?? "" };
    const { code, membershipNumber, contactId } = params as {
      code: string;
      membershipNumber: string;
      contactId: string;
    };
    const accessScope = getCheckedAccess(request, FEATURE_SLUGS.members);
    const memberResponse = await getMemberByMemberNumber(
      contactId,
      memberHeaders,
    );
    let sessionsResponse: CoreResponse<{ sessions: CoreMemberSession[] }> | {} =
      {};
    if (memberResponse?.data?.member?.user_id) {
      sessionsResponse = await getMemberSessionsByUserId(
        memberResponse?.data?.member?.user_id,
        memberHeaders,
      );
    }
    return {
      code,
      membershipNumber,
      contactId,
      memberResponse,
      sessionsResponse,
      accessScope,
    };
  },
);

export async function action({ request }: Route.LoaderArgs) {
  const { intent, ...payload } = await request.json();
  switch (intent as string) {
    case "reset-member-password": {
      const { memberRecordId, ...restPayload } = payload as {
        memberRecordId: string;
        password: string;
      };
      await resetMemberPassword(memberRecordId, restPayload);
      break;
    }
    default:
      break;
  }
}

const Page: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const {
    code,
    membershipNumber,
    memberResponse,
    sessionsResponse,
    accessScope,
  } = loaderData as unknown as {
    code: string;
    membershipNumber: string;
    contactId: string;
    memberResponse: CoreResponse<{ member: CoreMemberDetailed }>;
    sessionsResponse: CoreResponse<{ sessions: CoreMemberSession[] }>;
    accessScope: AccessScope;
  };
  return (
    <ContactInPromoCodeClient
      promoCodeId={code}
      membershipNumber={membershipNumber}
      member={memberResponse?.data?.member}
      sessions={sessionsResponse?.data?.sessions ?? []}
      accessScope={accessScope}
      backHref={`/admin/reports/members/${code}/${membershipNumber}`}
    />
  );
};

export default Page;
