import 'server-only'

import { randomUUID } from 'node:crypto'
import type { GpLiveDb } from './gpLiveDb'
import { pickRowString } from './pgRow'

/** 新使用者主鍵：UUID v4 */
export function newUserId(): string {
    return randomUUID()
}

/** 將網址參數或 account / display_id 解析為實際 user_id */
export async function resolveUserKeyToUserId(db: GpLiveDb, key: string): Promise<string | null> {
    const t = key.trim()
    if (!t) return null
    const row = await db.get<Record<string, unknown>>(
        `SELECT user_id FROM users WHERE user_id = ? OR account = ? OR display_id = ? LIMIT 1`,
        [t, t, t]
    )
    const userId = pickRowString(row, 'user_id', 'userId')
    return userId || null
}

export type ResolvedUserProfileRoute = {
    userId: string
    /** 對外網址路徑用：有 display_id 則為 display_id，否則為 user_id */
    publicUserId: string
    /** 網址為 user_id 且已設定 display_id 時，應導向 publicUserId */
    shouldRedirect: boolean
}

/** 個人頁 /user/[param]：解析使用者並決定是否需導向 canonical（display_id）網址 */
export async function resolveUserProfileRoute(
    db: GpLiveDb,
    rawParam: string
): Promise<ResolvedUserProfileRoute | null> {
    const param = String(rawParam || '').trim()
    if (!param) return null

    const user = await db.get<Record<string, unknown>>(
        `SELECT user_id AS userId, display_id AS displayId
         FROM users
         WHERE user_id = ? OR display_id = ? OR account = ?
         LIMIT 1`,
        [param, param, param]
    )

    const userId = pickRowString(user, 'userId', 'user_id')
    if (!userId) return null

    const displayId = pickRowString(user, 'displayId', 'display_id')
    const publicUserId = displayId || userId

    return {
        userId,
        publicUserId,
        shouldRedirect: Boolean(displayId && param === userId && displayId !== userId),
    }
}
