import { cookies } from 'next/headers'
import { getDb } from '@/server/db'
import { USER_AUTH_SQL } from '@/server/userAuthSql'
import {
    isStreamLiveByLifecycleStatus,
    sqlRoomStreamIsLive,
} from '@/lib/streams/lifecycleStatus'
import { parseRoomStreamCategory } from '@/lib/streams/roomStreamCategory'
import HomeClient from './HomeClient'
import { SESSION_ID_COOKIE } from './_helpers/constants'
import type { UserInfo } from './_helpers/types'
import { pickRowString, readDisplayName } from '@/server/pgRow'

export const revalidate = 60

type LiveStreamBanner = {
    roomId: string
    userId: string
    title: string
    viewers: number
    thumbnail: string | null
    src: string | null
    isLive: boolean
    streamerName: string
    avatar: string | null
    category: string | null
}

export default async function Home() {
    let userInfo: UserInfo | null = null
    try {
        const jar = cookies()
        const sessionId = jar.get(SESSION_ID_COOKIE)?.value
        if (sessionId) {
            const db = await getDb()
            const session = await db.get<Record<string, unknown>>(
                USER_AUTH_SQL.selectSessionUserId,
                [sessionId]
            )
            const sessionUserId = pickRowString(session, 'userId', 'user_id')
            if (sessionUserId) {
                const user = await db.get<Record<string, unknown>>(
                    `SELECT user_id AS id, display_name AS displayName, avatar_url AS avatar
                     FROM users
                     WHERE user_id = ?`,
                    [sessionUserId]
                )
                if (user) {
                    userInfo = {
                        nickname: readDisplayName(user),
                        id: pickRowString(user, 'id', 'user_id'),
                        avatarUrl: pickRowString(user, 'avatar', 'avatar_url') || null,
                    }
                }
            }
        }
    } catch (error) {
        console.error('Failed to get user info:', error)
    }

    let liveStreams: LiveStreamBanner[] = []
    try {
        const db = await getDb()
        const streams = await db.all<{
            roomId: string
            userId: string
            title: string
            viewers: number
            thumbnail: string | null
            src: string | null
            displayName: string
            displayId: string | null
            avatar: string | null
            category: string | null
            streamStatus: string | null
        }>(
            `SELECT 
                rs.room_id AS roomId,
                rs.room_id AS userId,
                rs.title,
                0 AS viewers,
                rs.thumbnail_url AS thumbnail,
                rs.stream_token AS src,
                u.display_name AS displayName,
                u.display_id AS displayId,
                u.avatar_url AS avatar,
                rs.category,
                rs.stream_status AS streamStatus
             FROM room_streams rs
             INNER JOIN users u ON rs.room_id = u.user_id
             WHERE ${sqlRoomStreamIsLive('rs')}
             ORDER BY COALESCE(rs.started_at, rs.updated_at, rs.created_at, 0) DESC
             LIMIT 10`,
            []
        )

        liveStreams = (streams ?? []).map((s) => {
            const row = s as Record<string, unknown>
            const parsedCategory = parseRoomStreamCategory(
                pickRowString(row, 'category') || null
            )
            const category = parsedCategory?.groupId ?? ''
            const thumb = pickRowString(row, 'thumbnail', 'thumbnail_url')
            const src = pickRowString(row, 'src', 'stream_token')
            const live = isStreamLiveByLifecycleStatus(
                pickRowString(row, 'streamStatus', 'stream_status') || null
            )
            const displayId = pickRowString(row, 'displayId', 'display_id')
            const roomId = displayId || pickRowString(row, 'roomId', 'room_id')
            return {
                roomId,
                userId: pickRowString(row, 'userId', 'user_id'),
                title: pickRowString(row, 'title'),
                viewers: Number(pickRowString(row, 'viewers')) || 0,
                thumbnail: thumb || null,
                src: src || null,
                isLive: live,
                streamerName: readDisplayName(row),
                avatar: pickRowString(row, 'avatar', 'avatar_url') || null,
                category: category || (live ? 'live' : 'vod'),
            }
        })
    } catch (error) {
        console.error('Failed to get live streams:', error)
    }

    return <HomeClient initialUserInfo={userInfo} initialLiveStreams={liveStreams} />
}

