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

export const runtime = 'nodejs'

function json(data: unknown, init?: ResponseInit) {
    return NextResponse.json(data, init)
}

export async function GET(_: Request, ctx: { params: { id: string } }) {
    const catchId = String(ctx?.params?.id ?? '').trim()
    if (!catchId) return json({ ok: false, error: 'BAD_REQUEST' }, { status: 400 })

    const userId = await getUserIdFromCookie()
    const db = await getDb()

    const exists = await db.get<{ x: number }>(`SELECT 1 AS x FROM catch WHERE catch_id = ? LIMIT 1`, [catchId])
    if (!exists) return json({ ok: false, error: 'NOT_FOUND' }, { status: 404 })

    const liked = userId
        ? await db.get<{ c: number }>(
            `SELECT 1 as c FROM catch_likes WHERE catch_id = ? AND user_id = ? LIMIT 1`,
            [catchId, userId]
        )
        : null

    const isLiked = Boolean(liked?.c)

    const c = await db.get<{ likes: number }>(
        `SELECT COUNT(1) as likes FROM catch_likes WHERE catch_id = ?`,
        [catchId]
    )
    const likes = Number(c?.likes ?? 0)

    return json({ ok: true, data: { catchId, isLiked, likes } })
}

export async function POST(request: NextRequest, ctx: { params: { id: string } }) {
    const catchId = String(ctx?.params?.id ?? '').trim()
    if (!catchId) return json({ ok: false, error: 'BAD_REQUEST' }, { status: 400 })

    const userId = await getUserIdFromRequest(request)
    if (!userId) {
        return json({ ok: false, error: 'UNAUTHORIZED', message: '請先登入' }, { status: 401 })
    }

    const db = await getDb()

    const row = await db.get<{ x: number }>(`SELECT 1 AS x FROM catch WHERE catch_id = ? LIMIT 1`, [catchId])
    if (!row) return json({ ok: false, error: 'NOT_FOUND' }, { status: 404 })

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

    const exists = await db.get<{ c: number }>(
        `SELECT 1 as c FROM catch_likes WHERE catch_id = ? AND user_id = ? LIMIT 1`,
        [catchId, userId]
    )

    let isLiked = false
    if (exists?.c) {
        await db.run(`DELETE FROM catch_likes WHERE catch_id = ? AND user_id = ?`, [catchId, userId])
        isLiked = false
    } else {
        await db.run(`INSERT OR IGNORE INTO catch_likes (catch_id, user_id, created_at) VALUES (?, ?, ?)`, [
            catchId,
            userId,
            nowSec,
        ])
        isLiked = true
    }

    const c = await db.get<{ likes: number }>(
        `SELECT COUNT(1) as likes FROM catch_likes WHERE catch_id = ?`,
        [catchId]
    )
    const likes = Number(c?.likes ?? 0)

    await db.run(`UPDATE catch SET updated_at = ? WHERE catch_id = ?`, [nowSec, catchId])

    return json({ ok: true, data: { catchId, isLiked, likes } })
}
