import type { GetServerSideProps } from "next";
import { AreaRiservataLayoutUserView } from "~/components/Layout";
import { LoadingPage } from "~/components/loading";
import { Servizio } from "~/components/servizio/servizio";
import { AnnunciRichiesti } from "~/components/servizio/servizio_annunci_accordions";
import { Status500 } from "~/components/status-page";
import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app";
import type { ServizioServizioId } from "~/schemas/public/Servizio";
import type { UsersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zServizioId, zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api";

type ServizioUserProps = {
	servizioId: ServizioServizioId;
	userId: UsersId;
};
/**
 * Pagina di visualizzazione servizio per admin: /area-riservata/admin/user-view/servizio/[userId]/[servizioId]
 */
const ServizioUser: NextPageWithLayout<ServizioUserProps> = ({
	servizioId,
	userId,
}: ServizioUserProps) => {
	const { data, isLoading } = api.servizio.getServizioData.useQuery({
		servizioId,
	});

	if (isLoading) {
		return <LoadingPage />;
	}
	if (!data) {
		return <Status500 />;
	}
	return (
		<div className="mx-auto max-w-8xl grow space-y-4">
			<AnnunciRichiesti servizioId={servizioId} userId={userId} />
			<Servizio
				isAdmin={true}
				key={data.servizio_id}
				servizio={data}
				userId={userId}
			/>
		</div>
	);
};
export default ServizioUser;

export const getServerSideProps = (async (context) => {
	const user_id = context.params?.slug?.[0];
	const servizio_id = context.params?.slug?.[1];

	if (typeof servizio_id !== "string" || typeof user_id !== "string") {
		console.error("Error: servizioId or userId is not a string");
		return redirectTo500;
	}
	const parsedUserId = zUserId.safeParse(user_id);
	if (!parsedUserId.success) {
		console.error("Error parsing userId", parsedUserId.error);
		return redirectTo500;
	}

	const parsedServizioId = zServizioId.safeParse(servizio_id);
	if (!parsedServizioId.success) {
		console.error("Error parsing servizioId", parsedServizioId.error);
		return redirectTo500;
	}
	const servizioId = parsedServizioId.data;
	const userId = parsedUserId.data;

	const access_token = context.req.cookies.access_token;

	const helper = await TrpcAuthedFetchingIstance({ access_token });
	if (helper) {
		await helper.trpc.servizio.getServizioData.prefetch({
			servizioId,
		});

		return {
			props: {
				servizioId,
				trpcState: helper.trpc.dehydrate(),
				userId,
			},
		};
	}

	return redirectTo500;
}) satisfies GetServerSideProps<ServizioUserProps>;

ServizioUser.getLayout = function getLayout(page) {
	return <AreaRiservataLayoutUserView>{page}</AreaRiservataLayoutUserView>;
};
