import { NextRequest, NextResponse } from 'next/server'
import { apiProviderRepo } from '@/lib/database/repositories/api-provider.repo'
import { isAuthError, requireUser } from '@/lib/auth/session'
import { BUILTIN_API_PROVIDERS } from '@/lib/api-provider-catalog'

type ProviderRow = {
  id: string
  name: string
  provider: string
  apiKey: string
  baseUrl: string
  modelName: string
  isActive: number
  status: string
  statusError: string
  createdAt: string
  updatedAt: string
}

function defaultProviderRow(entry: (typeof BUILTIN_API_PROVIDERS)[number]): ProviderRow {
  return {
    id: entry.provider,
    name: entry.name,
    provider: entry.provider,
    apiKey: '',
    baseUrl: '',
    modelName: '',
    isActive: 0,
    status: 'not_configured',
    statusError: '',
    createdAt: '',
    updatedAt: '',
  }
}

export async function GET() {
  try {
    const user = await requireUser()
    const savedRows = apiProviderRepo.listByUser(user.id)
    const savedBuiltins = new Map(savedRows.filter(row => row.provider !== 'custom').map(row => [row.provider, row]))
    const customRows = savedRows.filter(row => row.provider === 'custom')
    const rows = [
      ...BUILTIN_API_PROVIDERS.map(entry => savedBuiltins.get(entry.provider) || defaultProviderRow(entry)),
      ...customRows,
    ]
    return NextResponse.json(rows)
  } catch (err) {
    if (isAuthError(err)) return err
    throw err
  }
}

export async function POST(req: NextRequest) {
  let user
  try {
    user = await requireUser()
  } catch (err) {
    if (isAuthError(err)) return err
    throw err
  }
  let body: { name?: string; baseUrl?: string; apiKey?: string; modelName?: string }
  try {
    body = await req.json()
  } catch {
    return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 })
  }

  const { name, baseUrl, apiKey, modelName } = body

  if (!name || !baseUrl) {
    return NextResponse.json({ error: 'name and baseUrl are required' }, { status: 400 })
  }

  const id = `custom-${Date.now()}`
  apiProviderRepo.createCustom({ id, name, baseUrl, apiKey: apiKey || '', modelName: modelName || '', userId: user.id })

  const created = apiProviderRepo.findByIdAndUser(id, user.id)
  return NextResponse.json(created, { status: 201 })
}
