import type { Metadata } from "next";
import { requirePermission } from "@/lib/auth/session";
import { prisma } from "@/lib/prisma";
import { getUserChannels } from "@/lib/chat/queries";
import { getPresenceInfoMap } from "@/lib/presence.server";
import { ChatFrame } from "./ChatFrame";
import { ChannelSidebar } from "./ChannelSidebar";

export const metadata: Metadata = { title: "Chat" };

export default async function ChatLayout({
  children,
}: Readonly<{ children: React.ReactNode }>) {
  const session = await requirePermission("chat.view");
  const canCreate = Boolean(session.user.permissions?.includes("chat.create_channel"));

  const [channels, users] = await Promise.all([
    getUserChannels(session.user.id),
    prisma.user.findMany({
      where: { status: "ACTIVE", id: { not: session.user.id } },
      orderBy: { name: "asc" },
      select: { id: true, name: true, displayName: true },
    }),
  ]);

  const userOptions = users.map((u) => ({
    id: u.id,
    name: u.displayName ?? u.name,
  }));

  const presence = await getPresenceInfoMap(
    channels.map((c) => c.otherUserId).filter((id): id is string => Boolean(id)),
  );

  return (
    <ChatFrame
      sidebar={<ChannelSidebar channels={channels} users={userOptions} initialPresence={presence} canCreate={canCreate} />}
    >
      {children}
    </ChatFrame>
  );
}
