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

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

export default async function ChatPopoutPage({ 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(`/room/${resolvedRoom.publicRoomId}/chat`)
    }

    const roomId = resolvedRoom.roomId
    const streamRow = await db.get<{
        userId: string
        title: string
        startedAt: string | number | null
        uploadedAt: string | number | null
    }>(
        `SELECT room_id AS userId, title, started_at AS startedAt, updated_at AS uploadedAt FROM room_streams WHERE room_id = ?`,
        [roomId]
    )
    const userId = pickRowString(streamRow as Record<string, unknown> | undefined, 'userId', 'user_id') || roomId
    const user = await db.get<Record<string, unknown>>(
        `SELECT u.display_name AS displayName, u.avatar_url AS avatar,
                TRIM(u.display_id) AS ownerDisplayId,
                (SELECT COUNT(1) FROM user_actions f WHERE f.target_id = u.user_id AND f.action_type = 'follow') AS followersCount
         FROM users u WHERE u.user_id = ?`,
        [userId]
    )

    if (!readDisplayName(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<Record<string, unknown>>(
                USER_AUTH_SQL.selectSessionUserId,
                [sessionId]
            )
            const sessionUserId = pickRowString(session, 'userId', 'user_id')
            if (sessionUserId) {
                currentUserId = sessionUserId
                const currentUser = await db.get<Record<string, unknown>>(
                    `SELECT display_name AS displayName FROM users WHERE user_id = ?`,
                    [sessionUserId]
                )
                if (currentUser) {
                    currentUserDisplayName = readDisplayName(currentUser)
                }
            }
        }
    } catch (error) {
        console.error('Failed to get current user ID:', error)
    }
    const streamChannelName = readDisplayName(user)
    const streamAvatar = pickRowString(user, 'avatar', 'avatar_url')
    const streamOwnerDisplayId = pickRowString(user, 'ownerDisplayId', 'display_id') || null
    return (
        <ChatPopoutPageClient
            roomId={roomId}
            roomPublicId={resolvedRoom.publicRoomId}
            streamUserId={userId}
            streamOwnerDisplayId={streamOwnerDisplayId}
            streamChannelName={streamChannelName}
            streamAvatar={streamAvatar}
            currentUserId={currentUserId}
            currentUserDisplayName={currentUserDisplayName}
        />
    )
}


