import { NextRequest, NextResponse } from 'next/server'
import { getDb } from '@/server/db'
import { formatDateTime } from '@/utils/formatDate'
import {
    parseRoomStreamCategory,
    roomStreamCategoryToTagIds,
} from '@/lib/streams/roomStreamCategory'

function formatStreamStartTime(raw: unknown): string | undefined {
    if (raw == null || raw === '') return undefined
    const n = Number(raw)
    if (Number.isFinite(n)) {
        const ms = n < 1e12 ? n * 1000 : n
        return formatDateTime(new Date(ms).toISOString())
    }
    try {
        return formatDateTime(String(raw))
    } catch {
        return String(raw)
    }
}

// 分類映射：將 URL 分類映射到資料庫中的標籤
const categoryMap: Record<string, string> = {
    'all': '',
    'game': 'game',
    'talk': 'talk',
    'sports': 'sports',
    'music': 'music',
    'study': 'study',
    'irl': 'irl',
    'life': 'life',
}

export async function GET(
    request: NextRequest,
    { params }: { params: { category: string } }
) {
    try {
        const category = String(params?.category ?? 'all').toLowerCase()
        const searchParams = request.nextUrl.searchParams
        const sortKey = searchParams.get('sort') || 'viewer-desc' // viewer-desc, viewer-asc, recent
        const limit = parseInt(searchParams.get('limit') || '12', 10)
        const offset = parseInt(searchParams.get('offset') || '0', 10)

        const db = await getDb()

        // 構建 WHERE 條件
        let whereClause =
            "WHERE rs.stream_status IN ('ready', 'initializing', 'connected', 'streaming', 'live', 'live-inprogress', 'reconnected')"
        const queryParams: any[] = []

        const likeCountSql = `(SELECT COUNT(1) FROM room_stream_likes l WHERE l.room_id = rs.room_id)`

        // 如果分類不是 'all'，依 room_streams.category 的 groupId 過濾
        if (category !== 'all' && categoryMap[category]) {
            const groupId = categoryMap[category]
            whereClause += ` AND (
                rs.category LIKE ? OR
                rs.category LIKE ? OR
                rs.category = ?
            )`
            queryParams.push(`%"groupId":"${groupId}"%`, `%"groupId":"${groupId}",%`, `${groupId}`)
        }

        // 構建 ORDER BY 子句（觀看人數改由 socket；此處以愛心數近似「熱門」排序）
        let orderByClause = ''
        if (sortKey === 'viewer-desc') {
            orderByClause = `ORDER BY ${likeCountSql} DESC, COALESCE(rs.started_at, rs.created_at) DESC`
        } else if (sortKey === 'viewer-asc') {
            orderByClause = `ORDER BY ${likeCountSql} ASC, COALESCE(rs.started_at, rs.created_at) DESC`
        } else if (sortKey === 'recent') {
            orderByClause = `ORDER BY COALESCE(rs.started_at, rs.created_at) DESC, ${likeCountSql} DESC`
        } else {
            orderByClause = `ORDER BY ${likeCountSql} DESC, COALESCE(rs.started_at, rs.created_at) DESC`
        }

        const streams = await db.all<{
            roomId: string
            userId: string
            title: string
            viewers: number
            thumbnail: string | null
            displayName: string
            displayId: string | null
            avatar: string | null
            category: string | null
            startedAt: number | string | null
        }>(
            `SELECT 
                rs.room_id AS roomId,
                rs.room_id AS userId,
                rs.title,
                0 AS viewers,
                rs.thumbnail_url AS thumbnail,
                u.display_name AS displayName,
                u.display_id AS displayId,
                u.avatar_url AS avatar,
                rs.category,
                rs.started_at AS startedAt
             FROM room_streams rs
             INNER JOIN users u ON rs.room_id = u.user_id
             ${whereClause}
             ${orderByClause}
             LIMIT ? OFFSET ?`,
            [...queryParams, limit, offset]
        )

        // 獲取總數（用於分頁）
        const countResult = await db.get<{ count: number }>(
            `SELECT COUNT(*) as count
             FROM room_streams rs
             INNER JOIN users u ON rs.room_id = u.user_id
             ${whereClause}`,
            queryParams
        )
        const total = countResult?.count || 0

        const result = (streams ?? []).map((s) => {
            const parsed = parseRoomStreamCategory(s.category)
            const categoryName = parsed?.groupId ?? '直播'
            const tags = roomStreamCategoryToTagIds(s.category)
            const startTime = formatStreamStartTime(s.startedAt)
            return {
                id: String(s.displayId || '').trim() || s.roomId,
                streamerName: s.displayName,
                title: s.title,
                category: categoryName,
                viewerCount: Number(s.viewers ?? 0),
                thumbnail: s.thumbnail || undefined,
                avatar: s.avatar || undefined,
                startTime: startTime,
                tags: tags.length > 0 ? tags : undefined,
            }
        })

        return NextResponse.json({
            ok: true,
            data: result,
            total,
            limit,
            offset,
        })
    } catch (error: any) {
        console.error('Failed to fetch live streams:', error)
        return NextResponse.json(
            { ok: false, message: error?.message || 'Failed to fetch live streams' },
            { status: 500 }
        )
    }
}

