import { fetchUserActiveAvatarFrame } from '@/server/avatarFrames/query'
import type { AvatarFramePayload } from '@/lib/avatarFrames/types'
import type { GpLiveDb } from '@/server/gpLiveDb'

type Db = GpLiveDb

export async function setUserEquippedAvatarFrame(
    db: Db,
    userId: string,
    frameId: string | null
): Promise<{ ok: true; activeFrame: AvatarFramePayload | null } | { ok: false; error: string }> {
    if (frameId === null || frameId === '') {
        await db.run(`UPDATE user_avatar_frames SET is_used = 0 WHERE user_id = ?`, [userId])
        return { ok: true, activeFrame: null }
    }

    const owned = await db.get<{ frame_id: string }>(
        `SELECT frame_id FROM user_avatar_frames WHERE user_id = ? AND frame_id = ?`,
        [userId, frameId]
    )
    if (!owned) {
        return { ok: false, error: 'NOT_OWNED' }
    }

    await db.exec('BEGIN')
    try {
        await db.run(`UPDATE user_avatar_frames SET is_used = 0 WHERE user_id = ?`, [userId])
        await db.run(
            `UPDATE user_avatar_frames SET is_used = 1 WHERE user_id = ? AND frame_id = ?`,
            [userId, frameId]
        )
        await db.exec('COMMIT')
    } catch (e) {
        await db.exec('ROLLBACK')
        throw e
    }

    const activeFrame = await fetchUserActiveAvatarFrame(db, userId)
    return { ok: true, activeFrame }
}
