import { NextRequest, NextResponse } from 'next/server'
import { getUserIdFromRequest } from '@/app/api/_helpers/session'
import { resolveMediaUrl } from '@/lib/media/resolveMediaUrl'
import { createGroup, CreateGroupError } from '@/server/groups/createGroup'
import { fetchGroupList } from '@/server/groups/fetchGroupList'
import { getDb } from '@/server/db'

export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'

export async function GET() {
    try {
        const db = await getDb()
        const rows = await fetchGroupList(db)

        const data = rows.map((row) => ({
            ...row,
            avatar: resolveMediaUrl(row.avatar) || null,
        }))

        return NextResponse.json({
            ok: true,
            data,
        })
    } catch (error: unknown) {
        console.error('Failed to fetch families data:', error)
        return NextResponse.json(
            {
                ok: false,
                message: error instanceof Error ? error.message : 'Failed to fetch families data',
            },
            { 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().catch(() => ({}))) as Record<string, unknown>
        const db = await getDb()
        const result = await createGroup(db, userId, {
            name: body.name,
        })

        return NextResponse.json({
            ok: true,
            data: {
                id: result.displayId,
                name: result.name,
                coinBalance: result.coinBalance,
            },
        })
    } catch (error: unknown) {
        if (error instanceof CreateGroupError) {
            const status =
                error.code === 'DISPLAY_ID_TAKEN'
                    ? 409
                    : error.code === 'INVALID_NAME' ||
                        error.code.startsWith('DISPLAY_ID_')
                      ? 400
                      : 400
            return NextResponse.json(
                { ok: false, code: error.code, message: error.message },
                { status }
            )
        }
        console.error('Failed to create family:', error)
        return NextResponse.json(
            {
                ok: false,
                message: error instanceof Error ? error.message : 'Failed to create family',
            },
            { status: 500 }
        )
    }
}
