import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import type { CoreResponse } from "@/lib/features/types";
import { addAdminRole } from "@/lib/features/users/roles/action";
import { getAdminFeatures } from "@/lib/features/users/roles/query";
import type {
  AdminFeature,
  CreateAdminRolePayload,
} from "@/lib/features/users/roles/types";
import { ROUTES } from "@/lib/path";
import { FEATURE_SLUGS } from "@/lib/role-helpers";
import type { Route } from "../+types/page";
import CreateRoleClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        {
          label: "Roles",
          to: ROUTES.roles.path,
        },
        {
          label: "Create",
        },
      ]}
    />
  ),
};

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.roleManagement,
  "read",
  async ({ request }) => {
    const adminFeatures = await getAdminFeatures(request);
    return { adminFeatures };
  },
);

export async function action({ request }: Route.ActionArgs) {
  const { intent, ...payload } = (await request.json()) as {
    intent: string;
  } & CreateAdminRolePayload;
  switch (intent) {
    case "create-admin-role":
      const response = await addAdminRole(payload, request);
      return response;
    default:
      throw Error("Invalid intent");
  }
}

const CreateRolePage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { adminFeatures } = loaderData as unknown as {
    adminFeatures: CoreResponse<AdminFeature[]>;
  };
  return <CreateRoleClientPage adminFeatures={adminFeatures?.data} />;
};

export default CreateRolePage;
