import { redirect } from 'next/navigation'
import { getDb } from '@/server/db'
import { USER_AUTH_SQL } from '@/server/userAuthSql'
import { resolveRoomRouteParam } from '@/server/roomRoute'
import { cookies } from 'next/headers'
import { SESSION_ID_COOKIE } from '@/app/_helpers/constants'
import ChatObsEmbedClient from './ChatObsEmbedClient'

export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'

export default async function EmbedChatPage({ params }: { params: { id: string } }) {
    const routeParam = String(params?.id ?? '').trim()
    const db = await getDb()
    const resolvedRoom = await resolveRoomRouteParam(db, routeParam)

    if (!resolvedRoom) {
        redirect('/')
    }
    if (resolvedRoom.shouldRedirect) {
        redirect(`/embed/chat/${encodeURIComponent(resolvedRoom.publicRoomId)}`)
    }

    const roomId = resolvedRoom.roomId
    const streamRow = await db.get<{ userId: string }>(
        `SELECT room_id AS userId FROM room_streams WHERE room_id = ?`,
        [roomId]
    )
    const userId = streamRow?.userId ?? roomId
    const user = await db.get<{ displayName: string; avatar: string | null }>(
        `SELECT display_name AS displayName, avatar_url AS avatar FROM users WHERE user_id = ?`,
        [userId]
    )

    if (!user) {
        redirect('/')
    }

    let currentUserId: string | null = null
    let currentUserDisplayName: string | null = null
    try {
        const sessionId = cookies().get(SESSION_ID_COOKIE)?.value
        if (sessionId) {
            const session = await db.get<{ userId: string }>(
                USER_AUTH_SQL.selectSessionUserId,
                [sessionId]
            )
            if (session) {
                currentUserId = session.userId
                const currentUser = await db.get<{ displayName: string }>(
                    `SELECT display_name AS displayName FROM users WHERE user_id = ?`,
                    [session.userId]
                )
                if (currentUser) {
                    currentUserDisplayName = currentUser.displayName
                }
            }
        }
    } catch (error) {
        console.error('Failed to get current user ID:', error)
    }

    return (
        <ChatObsEmbedClient
            roomId={roomId}
            roomPublicId={resolvedRoom.publicRoomId}
            streamUserId={userId}
            streamChannelName={user.displayName ?? ''}
            streamAvatar={user.avatar ?? ''}
            currentUserId={currentUserId}
            currentUserDisplayName={currentUserDisplayName}
        />
    )
}

export async function generateMetadata({ params }: { params: { id: string } }) {
    return {
        title: 'Chat Overlay',
        robots: { index: false, follow: false },
    }
}
