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 { createMembershipClub } from "@/lib/features/membership-clubs/action";
import type { MembershipClub } from "@/lib/features/membership-clubs/models";
import type { Membership } from "@/lib/features/memberships/models";
import { searchMemberships } from "@/lib/features/memberships/query";
import type { CoreResponse } from "@/lib/features/types";
import type { Route } from "../+types/page";
import CreateMembershipClubPageClient from "./_client";

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

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

export async function loader() {
  const account_statuses = await searchMemberAccountStatuses();
  const memberships = await searchMemberships();
  const chargeCenterResponse = await searchMembershipChargeCenters();
  return { account_statuses, memberships, chargeCenterResponse };
}

const CreateMembershipClubPage: React.FC<Route.ComponentProps> = ({
  loaderData,
}) => {
  const { account_statuses, memberships, chargeCenterResponse } =
    loaderData as unknown as {
      account_statuses: CoreResponse<{
        statuses: MemberAccountStatus[];
      }>;
      memberships: CoreResponse<Membership[]>;
      chargeCenterResponse: CoreResponse<MembershipClubChargeCenter[]>;
    };
  return (
    <CreateMembershipClubPageClient
      memberships={memberships.data}
      account_statuses={account_statuses.data.statuses}
      chargeCenters={chargeCenterResponse?.data ?? []}
    />
  );
};

export default CreateMembershipClubPage;
