import { NextResponse } from 'next/server'
import { fetchUserPageData } from '@/app/user/[id]/_lib/loadUserPageData'
import { getDb } from '@/server/db'
import { fetchUserActiveAvatarFrame } from '@/server/avatarFrames/query'
import { fetchUserGroups } from '@/server/groups/fetchUserGroups'
import { resolveUserKeyToUserId } from '@/server/userIdUtils'
import { pickRowString, readDisplayName } from '@/server/pgRow'

export const runtime = 'nodejs'

function json(data: unknown, init?: ResponseInit) {
    return NextResponse.json(data, init)
}

export async function GET(request: Request, ctx: { params: { id: string } }) {
    const userKey = String(ctx?.params?.id ?? '').trim()
    const url = new URL(request.url)
    const lite = url.searchParams.get('lite') === '1'

    if (lite) {
        const db = await getDb()
        const id = await resolveUserKeyToUserId(db, userKey)
        if (!id) {
            return json({ ok: false, error: 'NOT_FOUND' }, { status: 404 })
        }
        const [row, groups, avatarFrame] = await Promise.all([
            db.get<{
                id: string
                displayName: string
                avatar: string | null
                displayId: string | null
                followersCount: number
            }>(
                `SELECT user_id AS id, display_name AS displayName, avatar_url AS avatar,
                        TRIM(display_id) AS displayId,
                        (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 = ?`,
                [id]
            ),
            fetchUserGroups(db, id),
            fetchUserActiveAvatarFrame(db, id),
        ])
        if (!row) {
            return json({ ok: false, error: 'NOT_FOUND' }, { status: 404 })
        }
        const rowData = row as Record<string, unknown>
        const trimmedDisplay = pickRowString(rowData, 'displayId', 'display_id')
        const profilePathSegment = trimmedDisplay || pickRowString(rowData, 'id', 'user_id')
        return json({
            ok: true,
            data: {
                user: {
                    id: pickRowString(rowData, 'id', 'user_id'),
                    displayName: readDisplayName(rowData),
                    avatar: pickRowString(rowData, 'avatar', 'avatar_url') || null,
                    displayId: trimmedDisplay || null,
                    followersCount: Number(pickRowString(rowData, 'followersCount', 'followerscount')) || 0,
                    profilePathSegment,
                },
                groups,
                avatarFrame,
            },
        })
    }

    const pathSuffix = url.searchParams.get('pathSuffix') ?? ''
    const postId = url.searchParams.get('postId') ?? ''

    const result = await fetchUserPageData(userKey, {
        canonicalPathSuffix: pathSuffix || undefined,
        postId: postId || undefined,
    })

    if (result.kind === 'not_found') {
        return json({ ok: false, kind: 'not_found' }, { status: 404 })
    }
    if (result.kind === 'post_not_found') {
        return json({ ok: false, kind: 'post_not_found' }, { status: 404 })
    }
    if (result.kind === 'redirect') {
        return json({ ok: true, kind: 'redirect', redirectTo: result.redirectTo })
    }
    if (result.kind === 'blocked') {
        return json({ ok: true, kind: 'blocked' })
    }

    return json({
        ok: true,
        kind: 'ok',
        currentUserId: result.currentUserId,
        currentUserAvatar: result.currentUserAvatar,
        selectedPostId: result.selectedPostId,
        selectedPost: result.selectedPost,
        data: result.data,
    })
}
