import type { GetServerSideProps } from "next";
import Head from "next/head";
import { Sidebar } from "~/components/area-riservata/sidebar";
import { SiteHeader } from "~/components/navbar/site-header";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import type { ChatsChatid } from "~/schemas/public/Chats";
import { Suspense } from "react";
import { ChatSidebar } from "~/components/chat/chat-sidebar";
import Chat from "~/components/chat/chat";
import { LoadingPage } from "~/components/loading";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import type { Session } from "~/server/api/trpc";

type ChatPageProps = {
  chatId: ChatsChatid;
  session: Session;
};

const ChatPage: NextPageWithLayout<ChatPageProps> = ({
  chatId,
  session,
}: ChatPageProps) => {
  const { t } = useTranslation();
  return (
    <>
      <Head>
        <title>{t.heads.area_riservata_titolo}</title>
        <meta name="description" content={t.heads.area_riservata_description} />
      </Head>

      <div className="h-full flex-1 grow">
        <div className="flex h-full w-full flex-row">
          <div className="h-full">
            <Sidebar isAdmin className="h-full" />
          </div>
          <div className="h-full flex-1 grow">
            <div className="flex h-full w-full flex-row">
              <div className="h-full border-r">
                <ChatSidebar chatId={chatId} />
              </div>
              <Suspense fallback={<LoadingPage />}>
                <Chat chatId={chatId} userData={session} />
              </Suspense>
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

ChatPage.getLayout = function getLayout(page) {
  return (
    <div className="h-screen">
      <div className="flex h-full flex-col">
        <SiteHeader />
        <div className="flex min-h-0 grow">{page}</div>
      </div>
    </div>
  );
};

export const getServerSideProps = (async (context) => {
  const chatId = context.params?.chatId as ChatsChatid;
  if (typeof chatId !== "string")
    return {
      redirect: {
        destination: "/area-riservata/admin/chats/",
        permanent: false,
      },
    };
  const access_token = context.req.cookies.access_token;

  const helper = await TrpcAuthedFetchingIstance({ access_token });
  if (helper) {
    await helper.trpc.messagesSSE.infinite.prefetchInfinite({
      chatId,
    });
    await helper.trpc.chat.getUserInfosByChat.prefetch({
      chatId,
    });
    await helper.trpc.chat.getActiveChats.prefetch();
    await helper.trpc.users.getActiveUsersWithoutChat.prefetch();

    return {
      props: {
        chatId,
        session: helper.session,
        trpcState: helper.trpc.dehydrate(),
      },
    };
  }
  return {
    redirect: {
      destination: "/login",
      permanent: false,
    },
  };
}) satisfies GetServerSideProps<ChatPageProps>;

export default ChatPage;
