import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import type { AccessScope, CoreResponse } from "@/lib/features/types";
import { updateAdminUser } from "@/lib/features/users/action";
import { getAdminUserById } from "@/lib/features/users/query";
import { getAdminRoles } from "@/lib/features/users/roles/query";
import type { AdminRole } from "@/lib/features/users/roles/types";
import type {
  AdminUserDetailed,
  UpdateAdminUserPayload,
} from "@/lib/features/users/types";
import { FEATURE_SLUGS, getCheckedAccess } from "@/lib/role-helpers";
import type { Route } from "../+types/page";
import UpdateUserClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        {
          label: "Users",
          to: "/admin/settings/users",
        },
        {
          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;
  } & UpdateAdminUserPayload;
  switch (intent) {
    case "update-admin-user":
      const response = await updateAdminUser(id, payload, request);
      return response;
    default:
      throw Error("Invalid intent");
  }
}

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.userManagement,
  "read",
  async ({ request, params }) => {
    const { id } = params as { id: string };
    const userRes = await getAdminUserById(id, request);
    const adminRoles = await getAdminRoles(1, 200, undefined, request);
    const accessScope = getCheckedAccess(request, FEATURE_SLUGS.userManagement);
    return { userRes, adminRoles, accessScope };
  },
);

const AdminUserPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { userRes, adminRoles, accessScope } = loaderData as unknown as {
    userRes: CoreResponse<AdminUserDetailed>;
    adminRoles: CoreResponse<{
      roles: AdminRole[];
    }>;
    accessScope: AccessScope;
  };
  return (
    <UpdateUserClientPage
      adminUser={userRes?.data}
      roles={adminRoles?.data?.roles ?? []}
      accessScope={accessScope}
    />
  );
};

export default AdminUserPage;
