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

export async function GET(request: NextRequest) {
    try {
        const userId = await getUserIdFromRequest(request)

        if (!userId) {
            return NextResponse.json(
                { ok: false, message: 'Unauthorized' },
                { status: 401 }
            )
        }
        const db = await getDb()
        const nowSec = Math.floor(Date.now() / 1000)
        await db.run(
            `INSERT OR IGNORE INTO users (user_id, display_id, display_name, account, created_at, updated_at)
             VALUES (?, ?, ?, ?, ?, ?)`,
            [userId, userId, 'Temporary User', userId, nowSec, nowSec]
        )
        const settings = await db.get<{
            loginNotice: number
            foreignLoginBlock: number
        }>(
            `SELECT login_notice AS loginNotice, foreign_login_block AS foreignLoginBlock
             FROM user_login_settings
             WHERE user_id = ?`,
            [userId]
        )
        if (!settings) {
            return NextResponse.json({
                ok: true,
                loginNotice: -11,
                foreignLoginBlock: 0,
            })
        }
        return NextResponse.json({
            ok: true,
            loginNotice: settings.loginNotice,
            foreignLoginBlock: settings.foreignLoginBlock,
        })
    } catch (error: any) {
        console.error('Failed to fetch login settings:', error)
        return NextResponse.json(
            { ok: false, message: error?.message || 'Failed to fetch login settings' },
            { status: 500 }
        )
    }
}

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 { loginNotice, foreignLoginBlock } = body
        const db = await getDb()
        const nowSec = Math.floor(Date.now() / 1000)
        await db.run(
            `INSERT OR IGNORE INTO users (user_id, display_id, display_name, account, created_at, updated_at)
             VALUES (?, ?, ?, ?, ?, ?)`,
            [userId, userId, 'Temporary User', userId, nowSec, nowSec]
        )
        if (loginNotice !== undefined) {
            await db.run(
                `INSERT OR REPLACE INTO user_login_settings (user_id, login_notice, foreign_login_block, updated_at)
                 VALUES (?, ?, COALESCE((SELECT foreign_login_block FROM user_login_settings WHERE user_id = ?), 0), ?)`,
                [userId, loginNotice, userId, nowSec]
            )
        }
        if (foreignLoginBlock !== undefined) {
            await db.run(
                `INSERT OR REPLACE INTO user_login_settings (user_id, login_notice, foreign_login_block, updated_at)
                 VALUES (?, COALESCE((SELECT login_notice FROM user_login_settings WHERE user_id = ?), -11), ?, ?)`,
                [userId, userId, foreignLoginBlock, nowSec]
            )
        }

        return NextResponse.json({ ok: true })
    } catch (error: any) {
        console.error('Failed to update login settings:', error)
        return NextResponse.json(
            { ok: false, message: error?.message || 'Failed to update login settings' },
            { status: 500 }
        )
    }
}

