import { notFound } from "next/navigation";
import { eq } from "drizzle-orm";
import { db } from "@/db";
import { channels, liveChatMessages, liveStreams, users } from "@/db/schema";
import { and, asc, eq as eqOp } from "drizzle-orm";
import { getSessionUser } from "@/lib/auth";
import { LiveWatch } from "@/components/live-watch";
import { ensureSeeded } from "@/lib/seed";

export const dynamic = "force-dynamic";

export default async function LiveWatchPage({ params }: { params: Promise<{ id: string }> }) {
  await ensureSeeded();
  const { id } = await params;
  const [row] = await db
    .select({ stream: liveStreams, channel: channels })
    .from(liveStreams)
    .innerJoin(channels, eq(channels.id, liveStreams.channelId))
    .where(eq(liveStreams.id, id))
    .limit(1);
  if (!row) notFound();

  const messages = await db
    .select({
      id: liveChatMessages.id,
      message: liveChatMessages.message,
      amountCents: liveChatMessages.amountCents,
      isSuperChat: liveChatMessages.isSuperChat,
      createdAt: liveChatMessages.createdAt,
      isModerated: liveChatMessages.isModerated,
      authorName: users.displayName,
      authorHandle: users.handle,
      authorAvatar: users.avatarUrl,
      authorId: users.id,
    })
    .from(liveChatMessages)
    .innerJoin(users, eqOp(users.id, liveChatMessages.userId))
    .where(and(eq(liveChatMessages.streamId, id), eq(liveChatMessages.isModerated, false)))
    .orderBy(asc(liveChatMessages.id))
    .limit(120);

  const session = await getSessionUser();
  const isOwner = session?.user.id === row.channel.userId;

  return (
    <LiveWatch
      stream={row.stream}
      channel={{ name: row.channel.name, handle: row.channel.handle, avatarUrl: row.channel.avatarUrl, subscriberCountHint: row.channel.isVerified }}
      initialMessages={messages.map((m) => ({
        id: m.id,
        message: m.message,
        amountCents: m.amountCents,
        isSuperChat: m.isSuperChat,
        createdAt: m.createdAt.toISOString(),
        author: { id: m.authorId, name: m.authorName, handle: m.authorHandle, avatarUrl: m.authorAvatar },
      }))}
      isOwner={Boolean(isOwner)}
      signedIn={Boolean(session)}
    />
  );
}
