import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { AdminApiError, requireAdminForApi } from '@/lib/admin-auth'
import { getRuntimeSettings, updateRuntimeSettings } from '@/lib/admin-data'
import { logAdminAction } from '@/lib/audit'

const schema = z.object({
  app_name: z.string().trim().min(1).max(120),
  business_name: z.string().trim().min(1).max(120),
  website_url: z.string().max(255).default(''),
  support_email: z.string().max(255).default(''),
  support_phone: z.string().max(60).default(''),
  support_whatsapp: z.string().max(60).default(''),
  wave_number: z.string().max(60).default(''),
  orange_money_number: z.string().max(60).default(''),
  subscription_price_fcfa: z.number().int().min(0).max(100000000),
  payment_instructions: z.string().max(5000).default(''),
})

export async function GET() {
  try {
    await requireAdminForApi()
    const data = await getRuntimeSettings()
    return NextResponse.json(data)
  } catch (error) {
    if (error instanceof AdminApiError) {
      return NextResponse.json({ error: error.message }, { status: error.status })
    }
    console.error(error)
    return NextResponse.json({ error: 'Unexpected error' }, { status: 500 })
  }
}

export async function PUT(request: NextRequest) {
  try {
    const admin = await requireAdminForApi()
    const body = schema.parse(await request.json())
    const data = await updateRuntimeSettings(body)

    await logAdminAction({
      adminUserId: admin.userId,
      action: 'update_runtime_settings',
      targetType: 'runtime_settings',
      targetId: data.key,
      metadata: {
        subscription_price_fcfa: data.subscription_price_fcfa,
        wave_number: data.wave_number,
        orange_money_number: data.orange_money_number,
        support_phone: data.support_phone,
        support_whatsapp: data.support_whatsapp,
      },
    })

    return NextResponse.json(data)
  } catch (error) {
    if (error instanceof AdminApiError) {
      return NextResponse.json({ error: error.message }, { status: error.status })
    }
    if (error instanceof z.ZodError) {
      return NextResponse.json({ error: error.issues[0]?.message ?? 'Invalid payload' }, { status: 400 })
    }
    console.error(error)
    return NextResponse.json({ error: 'Unexpected error' }, { status: 500 })
  }
}
