import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import type { MemberAccountStatus } from "@/lib/features/member-account-status/models";
import { searchMemberAccountStatuses } from "@/lib/features/member-account-status/query";
import { createMembershipAccountType } from "@/lib/features/membership-account-types/action";
import type { MembershipAccountType } from "@/lib/features/membership-account-types/models";
import { getMembershipAccountType } from "@/lib/features/membership-account-types/query";
import type { CoreResponse } from "@/lib/features/types";
import type { Route } from "../+types/page";
import CreateMembershipAccountTypePageClient from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        {
          label: "Account Types",
          to: "/admin/memberships/account-types",
        },
        {
          label: "Edit",
        },
      ]}
    />
  ),
};

export async function action({ request }: Route.ActionArgs) {
  const { intent, ...payload } = (await request.json()) as {
    intent: string;
  } & MembershipAccountType;
  let club;
  switch (intent) {
    case "create-membership-account-type":
      club = await createMembershipAccountType(payload);
      return club;
    default:
      throw Error("Invalid intent");
  }
}

export async function loader({ request, params }: Route.LoaderArgs) {
  const { id } = params as { id: string };
  const headers = { headers: request.headers };
  const accountTypeResponse = await getMembershipAccountType(id, headers);
  const accountStatusesResponse = await searchMemberAccountStatuses(headers);
  return { accountStatusesResponse, accountTypeResponse };
}

const CreateMembershipClubPage: React.FC<Route.ComponentProps> = ({
  loaderData,
}) => {
  const { accountStatusesResponse, accountTypeResponse } =
    loaderData as unknown as {
      accountStatusesResponse: CoreResponse<{
        statuses: MemberAccountStatus[];
      }>;
      accountTypeResponse: CoreResponse<MembershipAccountType>;
    };
  return (
    <CreateMembershipAccountTypePageClient
      accountStatuses={accountStatusesResponse.data.statuses}
    />
  );
};

export default CreateMembershipClubPage;
