import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import {
  addUserToAccessList,
  removeUserFromAccessList,
} from "@/lib/features/access-list/action";
import { getUsersForAccessList } from "@/lib/features/access-list/query";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import type { AccessScope, CoreAPIPagination, CoreResponse } from "@/lib/features/types";
import type { AdminUser } from "@/lib/features/users/types";
import { FEATURE_SLUGS, getCheckedAccess } from "@/lib/role-helpers";
import type { Route } from "./+types/page";
import AccessListClientPage from "./_client";

export const handle = {
  breadcrumb: () => <BreadCrumbLink links={[{ label: "Access List" }]} />,
};

export async function action({ request }: Route.ActionArgs) {
  const { intent, userId } = (await request.json()) as {
    intent: string;
    userId: string;
  };
  switch (intent) {
    case "add-user-to-access-list":
      return await addUserToAccessList(userId, request);
    case "remove-user-from-access-list":
      return await removeUserFromAccessList(userId, request);
    default:
      throw Error("Invalid intent");
  }
}

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.promocodeAccessList,
  "read",
  async ({ request }) => {
    const url = new URL(request.url);
    const page = parseInt(url.searchParams.get("page") ?? "1");
    const pageSize = parseInt(url.searchParams.get("pageSize") ?? "15");
    const search = url.searchParams.get("search") ?? undefined;
    const adminUsers = await getUsersForAccessList(page, pageSize, search, request);
    const accessScope = getCheckedAccess(request, FEATURE_SLUGS.promocodeAccessList);
    return { adminUsers, accessScope };
  },
);

const AccessListPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { adminUsers, accessScope } = loaderData as unknown as {
    adminUsers: CoreResponse<{
      users: AdminUser[];
      pagination: CoreAPIPagination;
    }>;
    accessScope: AccessScope;
  };
  return (
    <AccessListClientPage
      tableProps={{
        data: adminUsers?.data?.users ?? [],
        totalRows: adminUsers?.data?.pagination?.total,
      }}
      accessScope={accessScope}
    />
  );
};

export default AccessListPage;
