import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import type { MembershipClubChargeCenter } from "@/lib/features/charge-centers/models";
import { searchMembershipChargeCenters } from "@/lib/features/charge-centers/query";
import type { MemberAccountStatus } from "@/lib/features/member-account-status/models";
import { searchMemberAccountStatuses } from "@/lib/features/member-account-status/query";
import { updateMembershipClub } from "@/lib/features/membership-clubs/action";
import type { MembershipClub } from "@/lib/features/membership-clubs/models";
import { getMembershipClub } from "@/lib/features/membership-clubs/query";
import type { Membership } from "@/lib/features/memberships/models";
import { searchMemberships } from "@/lib/features/memberships/query";
import type { CoreResponse } from "@/lib/features/types";
import { Stack } from "@mantine/core";
import type { Route } from "../../../members/+types/page";
import MembershipClubClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        {
          label: "Clubs",
          to: "/admin/memberships/clubs",
        },
        {
          label: "Edit",
        },
      ]}
    />
  ),
};

export async function action({ request, params }: Route.ActionArgs) {
  const { id } = params as { id: string };
  const { intent, ...payload } = (await request.json()) as {
    intent: string;
  } & MembershipClub;
  let club;
  switch (intent) {
    case "update-membership-club":
      club = await updateMembershipClub(id, payload);
      return club;
    default:
      throw Error("Invalid intent");
  }
}

export async function loader({ params }: Route.LoaderArgs) {
  const { id } = params as { id: string };
  const clubData = await getMembershipClub(id);
  const account_statuses = await searchMemberAccountStatuses();
  const memberships = await searchMemberships();
  const chargeCenterResponse = await searchMembershipChargeCenters();
  return { account_statuses, memberships, clubData, chargeCenterResponse };
}

const MembershipClubPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { account_statuses, clubData, memberships, chargeCenterResponse } =
    loaderData as unknown as {
      account_statuses: CoreResponse<{
        statuses: MemberAccountStatus[];
      }>;
      memberships: CoreResponse<Membership[]>;
      clubData: CoreResponse<MembershipClub>;
      chargeCenterResponse: CoreResponse<MembershipClubChargeCenter[]>;
    };
  if (!clubData.success) {
    return <Stack>NOT FOUND</Stack>;
  }
  return (
    <MembershipClubClientPage
      account_statuses={account_statuses.data.statuses}
      memberships={memberships.data}
      membershipClub={clubData.data}
      chargeCenters={chargeCenterResponse?.data ?? []}
    />
  );
};
export default MembershipClubPage;
