import { headers } from "next/headers";
import { notFound, redirect } from "next/navigation";
import { HydrationBoundary, dehydrate } from "@tanstack/react-query";
import { PublicLayout } from "@/components/layout/public/public-layout";
import { createHelpers } from "@/lib/trpc/server";
import { auth } from "@/lib/auth/auth";
import { Routes } from "@/config/routes";
import { SubscriptionStatus } from "@/server/modules/payment/types/subscription-status.enum";
import { OrganizationDetailsSection } from "@/components/organization/sections/organization-details.section";
import { MembersSection } from "@/components/organization/sections/members.section";
import { SubscriptionsSection } from "@/components/organization/sections/subscriptions.section";

type Props = {
    params: Promise<{ id: string }>;
};

export default async function OrganizationPage({ params }: Props) {
    const { id } = await params;
    const requestHeaders = await headers();
    const helpers = await createHelpers();
    const session = await auth.api.getSession({
        headers: requestHeaders
    });

    if (!session || !session.user) {
        redirect(Routes.AUTH.SIGN_IN);
    }

    const [member, activeSubscription] = await Promise.all([
        helpers.organization.member.get.fetch({
            organizationId: id,
            userId: session.user.id
        }),
        helpers.payment.subscription.get.fetch({
            status: SubscriptionStatus.ACTIVE,
            currentPeriod: true,
            referenceId: id
        }),
        helpers.auth.user.prefetch(),
        helpers.organization.get.prefetch({
            with: ["invitations", "members"],
            id
        }),
        helpers.payment.subscription.list.prefetch({
            with: ["price"],
            organizationId: id
        }),
        helpers.organization.member.list.prefetch({
            with: ["user"],
            organizationId: id
        })
    ]);

    if (!member) {
        notFound();
    }

    return (
        <HydrationBoundary state={dehydrate(helpers.queryClient)}>
            <PublicLayout>
                <OrganizationDetailsSection organizationId={id} />

                <MembersSection organizationId={id} />

                <SubscriptionsSection organizationId={id} />
            </PublicLayout>
        </HydrationBoundary>
    );
}
