import { NextRequest, NextResponse } from 'next/server'
import { getDb } from '@/server/db'
import { getUserIdFromRequest } from '../../_helpers/session'

export async function POST(request: NextRequest) {
    try {
        const userId = await getUserIdFromRequest(request)
        if (!userId) {
            return NextResponse.json(
                { ok: false, message: 'Unauthorized' },
                { status: 401 }
            )
        }
        const body = await request.json()
        const { nickname } = body
        if (!nickname || nickname.trim().length < 2 || nickname.trim().length > 12) {
            return NextResponse.json(
                { ok: false, message: 'Invalid nickname' },
                { status: 400 }
            )
        }
        const db = await getDb()
        const user = await db.get<{ hasChangedNickname: number }>(
            `SELECT has_change_nickname AS hasChangedNickname FROM users WHERE user_id = ?`,
            [userId]
        )
        if (!user) {
            return NextResponse.json(
                { ok: false, message: 'User not found' },
                { status: 404 }
            )
        }
        if (user.hasChangedNickname === 1) {
            return NextResponse.json(
                { ok: false, message: 'Nickname can only be changed once' },
                { status: 403 }
            )
        }
        const existing = await db.get<{ id: string }>(
            `SELECT user_id AS id FROM users WHERE display_name = ? AND user_id != ?`,
            [nickname.trim(), userId]
        )
        if (existing) {
            return NextResponse.json(
                { ok: false, message: 'Nickname already in use' },
                { status: 409 }
            )
        }
        const nowSec = Math.floor(Date.now() / 1000)
        await db.run(
            `UPDATE users SET display_name = ?, has_change_nickname = 1, updated_at = ? WHERE user_id = ?`,
            [nickname.trim(), nowSec, userId]
        )
        return NextResponse.json({ ok: true })
    } catch (error: any) {
        console.error('Failed to change nickname:', error)
        return NextResponse.json(
            { ok: false, message: error?.message || 'Failed to change nickname' },
            { status: 500 }
        )
    }
}

