import fs from 'node:fs'
import path from 'node:path'
import { open } from 'sqlite'
import sqlite3 from 'sqlite3'

const USER_ID = process.argv[2]?.trim() || 'cfe93e89-e6aa-4a02-ab90-bdd9863dcaba'
/** Awards 2024（原 JP:1032） */
const EQUIPPED_FRAME_ID = process.argv[3]?.trim() || 'd2891b64e15787d1'
const DEFAULT_DB_PATH = path.join(process.cwd(), 'data', 'gp-live.sqlite')

async function main() {
    const dbPath = process.env.GP_LIVE_DB_PATH?.trim() || DEFAULT_DB_PATH
    if (!fs.existsSync(dbPath)) {
        console.error(`Database not found: ${dbPath}`)
        process.exit(1)
    }

    const db = await open({ filename: dbPath, driver: sqlite3.Database })
    await db.exec('PRAGMA foreign_keys = ON')

    const user = await db.get<{ user_id: string }>(
        'SELECT user_id FROM users WHERE user_id = ?',
        USER_ID
    )
    if (!user) {
        console.error(`User not found: ${USER_ID}`)
        process.exit(1)
    }

    const catalogCount = await db.get<{ c: number }>(
        'SELECT COUNT(*) AS c FROM config_avatar_frames'
    )
    if (!catalogCount?.c) {
        console.error('config_avatar_frames is empty — run: npx tsx scripts/seed-avatar-frames.ts')
        process.exit(1)
    }

    const nowSec = Math.floor(Date.now() / 1000)

    await db.exec('BEGIN')
    try {
        await db.run('DELETE FROM user_avatar_frames WHERE user_id = ?', USER_ID)
        await db.run(
            `INSERT INTO user_avatar_frames (user_id, frame_id, is_used, acquired_at)
             SELECT ?, item_id, 0, ? + (ROW_NUMBER() OVER (ORDER BY item_id) - 1)
             FROM config_avatar_frames`,
            USER_ID,
            nowSec
        )
        await db.run('UPDATE user_avatar_frames SET is_used = 0 WHERE user_id = ?', USER_ID)
        const equipped = await db.get<{ frame_id: string }>(
            'SELECT item_id AS frame_id FROM config_avatar_frames WHERE item_id = ?',
            EQUIPPED_FRAME_ID
        )
        if (equipped) {
            await db.run(
                'UPDATE user_avatar_frames SET is_used = 1 WHERE user_id = ? AND frame_id = ?',
                USER_ID,
                EQUIPPED_FRAME_ID
            )
        }
        await db.exec('COMMIT')
    } catch (e) {
        await db.exec('ROLLBACK')
        throw e
    }

    const count = await db.get<{ c: number }>(
        'SELECT COUNT(*) AS c FROM user_avatar_frames WHERE user_id = ?',
        USER_ID
    )
    const used = await db.get<{ frame_id: string }>(
        'SELECT frame_id FROM user_avatar_frames WHERE user_id = ? AND is_used = 1',
        USER_ID
    )
    await db.close()

    console.log(`User ${USER_ID}`)
    console.log(`  user_avatar_frames: ${count?.c ?? 0}`)
    console.log(`  equipped: ${used?.frame_id ?? '(none)'}`)
}

main().catch((e) => {
    console.error(e)
    process.exit(1)
})
