import { HydrationBoundary, dehydrate } from "@tanstack/react-query";
import PageContainer from "@/components/layout/page-container";
import { DashboardPage } from "@/components/dashboard/dashboard/dashboard-page";
import { createHelpers } from "@/lib/trpc/server";
import { PostStatusEnum } from "@/config/enums/post-status";
import { UserRole } from "@/server/modules/user/user-role.enum";

export default async function Page() {
    const helpers = await createHelpers();

    const [
        canListUser
    ] = await Promise.all([
        helpers.gate.can.fetch({ action: "list", resource: "user" })
    ]);

    const userStats = () => {
        return [
            helpers.user.count.prefetch({
                role: UserRole.USER
            }),
            helpers.user.count.prefetch({
                role: UserRole.ADMIN
            }),
            helpers.user.count.prefetch({
                role: UserRole.JOURNALIST
            }),
            helpers.user.count.prefetch({
                role: UserRole.SENIOR_JOURNALIST
            }),
            helpers.user.count.prefetch({
                role: UserRole.BUSINESS_MASTER_SUBSCRIBER
            }),
            helpers.user.count.prefetch({
                role: UserRole.BUSINESS_EMPLOYEE_SUBSCRIBER
            }),
            helpers.user.count.prefetch({
                banned: false
            }),
            helpers.user.count.prefetch({
                banned: true
            })
        ];
    };

    await Promise.all([
        helpers.auth.user.prefetch(),
        helpers.posts.count.prefetch({
            access: "dashboard",
            status: PostStatusEnum.PUBLISHED
        }),
        helpers.posts.count.prefetch({
            access: "dashboard",
            status: PostStatusEnum.DRAFT
        }),
        helpers.posts.count.prefetch({
            access: "dashboard",
            status: PostStatusEnum.ARCHIVED
        }),
        ...canListUser ? userStats() : []
    ]);

    return (
        <HydrationBoundary state={dehydrate(helpers.queryClient)}>
            <PageContainer scrollable={true}>
                <DashboardPage />
            </PageContainer>
        </HydrationBoundary>
    );
}
