import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { requireCompanyAdminContext } from '@/lib/api-guard'
import { publicOrigin } from '@/lib/app-url'
import { createCompanyRule, listCompanyRules, toViews } from '@/lib/data/auto-participant-rules'

/** Company Auto-Participants of the ACTIVE company (Task 7.2). Company Admin only, checked server-side (§35). */
export async function GET(req: NextRequest) {
  const guard = await requireCompanyAdminContext({ companyId: req.nextUrl.searchParams.get('company_id') })
  if (!guard.ok) return guard.response
  const data = await listCompanyRules(guard.companyId)
  return NextResponse.json({ company: { id: guard.company.id, name: guard.company.display_name || guard.company.legal_name, type: guard.company.company_type }, ...data })
}

const createSchema = z.object({
  member_user_id: z.string().uuid().optional().nullable(),
  email: z.string().trim().email().optional().nullable(),
  first_name: z.string().trim().max(80).optional().nullable(),
  last_name: z.string().trim().max(80).optional().nullable(),
  scope_type: z.string(),
  confirm_external: z.boolean().optional(),
  company_id: z.string().uuid().optional().nullable(),
})

/** Add a Company Auto-Participant (Task 7.3). */
export async function POST(req: NextRequest) {
  const body = await req.json().catch(() => ({}))
  const parsed = createSchema.safeParse(body)
  if (!parsed.success) return NextResponse.json({ error: 'Pick a person and a scope.' }, { status: 400 })
  const guard = await requireCompanyAdminContext({ companyId: parsed.data.company_id })
  if (!guard.ok) return guard.response
  const res = await createCompanyRule({
    actor: guard.user,
    companyId: guard.companyId,
    companyName: guard.company.display_name || guard.company.legal_name,
    member_user_id: parsed.data.member_user_id,
    email: parsed.data.email,
    first_name: parsed.data.first_name,
    last_name: parsed.data.last_name,
    scope_type: parsed.data.scope_type,
    confirm_external: parsed.data.confirm_external,
    origin: publicOrigin(req),
  })
  if (!res.ok) return NextResponse.json({ error: res.error }, { status: res.status ?? 400 })
  const [view] = await toViews([res.rule])
  return NextResponse.json({ ok: true, rule: view, external: res.external })
}
