import type { GroupLogListItem } from '@/lib/groups/groupLogTypes'
import type { getDb } from '@/server/db'

type AppDb = Awaited<ReturnType<typeof getDb>>

export type { GroupLogListItem }

const DEFAULT_LIMIT = 100
const MAX_LIMIT = 200

export async function listGroupLogs(
    db: AppDb,
    groupId: string,
    limit = DEFAULT_LIMIT
): Promise<GroupLogListItem[]> {
    const safeLimit = Math.min(Math.max(1, Math.floor(limit)), MAX_LIMIT)
    const rows = await db.all<{
        id: number
        actorId: string
        actorName: string | null
        targetId: string | null
        targetName: string | null
        actionContent: string
        operationAt: number
    }>(
        `SELECT
            gl.log_id AS id,
            gl.user_id AS actorId,
            ua.display_name AS actorName,
            gl.target_id AS targetId,
            ut.display_name AS targetName,
            gl.action_content AS actionContent,
            gl.operation_at AS operationAt
         FROM group_logs gl
         INNER JOIN users ua ON ua.user_id = gl.user_id
         LEFT JOIN users ut ON ut.user_id = gl.target_id
         WHERE gl.group_id = ?
         ORDER BY gl.operation_at DESC, gl.log_id DESC
         LIMIT ?`,
        [groupId, safeLimit]
    )

    return (rows ?? []).map((r) => ({
        id: r.id,
        actorId: r.actorId,
        actorName: String(r.actorName ?? '').trim() || r.actorId,
        targetId: r.targetId,
        targetName: r.targetName != null ? String(r.targetName).trim() || r.targetId : null,
        actionContent: r.actionContent,
        operationAt: r.operationAt ?? 0,
    }))
}
