// tdd-guard:skip — Next.js route handler; demo removal logic mirrors lib/demo/seeder remove* (tested there).
import { NextRequest, NextResponse } from 'next/server'
import { getUserSession } from '@/lib/auth/permissions'
import { isAtLeastRole } from '@/lib/auth/permissions-shared'
import { createAdminClient } from '@/lib/supabase/admin'
import {
  DEMO_PROJECT_IDS,
  DEMO_ASSESSMENT_IDS,
  DEMO_PROCESS_STEP_IDS,
  DEMO_PLANNING_PROJECT_IDS,
  DEMO_INTAKE_IDS,
  DEMO_VSM_IDS,
} from '@/lib/demo/demo-ids'
import type { DemoModule } from '@/lib/demo/demo-service'
import { removePack } from '@/lib/demo/seeder'

export async function POST(req: NextRequest) {
  const session = await getUserSession()
  if (!session || !isAtLeastRole(session, 'admin')) {
    return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
  }

  const body = await req.json().catch(() => ({}))
  const modules: DemoModule[] = body.modules ?? [
    'projektanlage', 'kalender', 'lsc-workshop', 'fabrikanalyse', 'oee',
  ]

  const admin = createAdminClient()
  const errors: string[] = []
  const projectIds = [...DEMO_PROJECT_IDS]

  // lsc-workshop data lives on the demo projects — delete before projects
  if (modules.includes('lsc-workshop')) {
    // Cascade via FK on process_steps/cycle_measurements handles those,
    // but lsc_shifts and lsc_measures may not have CASCADE — delete explicitly.
    await admin.from('lsc_shifts').delete().in('project_id', projectIds)
    await admin.from('lsc_measures').delete().in('project_id', projectIds)

    // Cascade: deleting process_steps cascades to cycle_measurements
    const { error } = await admin
      .from('cycle_measurements')
      .delete()
      .in('process_step_id', [...DEMO_PROCESS_STEP_IDS])
    if (error) errors.push(`cycle_measurements: ${error.message}`)

    // All legacy-module deletes below are scoped to the shared dddd pool:
    // other pack families (ddd7 top_management_demo) also tag is_demo=true,
    // and a blanket is_demo delete on projects/steps/assessments/VSMs would
    // cascade their whole pack away. The ddd7 family is only ever removed via
    // the explicit 'top-management-demo' module (removePack) below.
    const { error: psErr } = await admin
      .from('process_steps')
      .delete()
      .eq('is_demo', true)
      .in('project_id', projectIds)
    if (psErr) errors.push(`process_steps: ${psErr.message}`)
  }

  if (modules.includes('kalender')) {
    const { error } = await admin
      .from('assignments')
      .delete()
      .eq('is_demo', true)
    if (error) errors.push(`assignments: ${error.message}`)

    // Delete demo planning_projects (ON DELETE SET NULL clears assignment FK automatically)
    const { error: ppErr } = await admin
      .from('planning_projects')
      .delete()
      .in('id', [...DEMO_PLANNING_PROJECT_IDS])
    if (ppErr) errors.push(`planning_projects: ${ppErr.message}`)
  }

  if (modules.includes('fabrikanalyse')) {
    await admin
      .from('assessment_responses')
      .delete()
      .in('assessment_id', [...DEMO_ASSESSMENT_IDS])

    const { error } = await admin
      .from('assessments')
      .delete()
      .eq('is_demo', true)
      .in('id', [...DEMO_ASSESSMENT_IDS])
    if (error) errors.push(`assessments: ${error.message}`)
  }

  if (modules.includes('oee')) {
    await admin.from('oee_loss_categories').delete().eq('is_demo', true)

    const { error } = await admin
      .from('oee_records')
      .delete()
      .eq('is_demo', true)
    if (error) errors.push(`oee_records: ${error.message}`)
  }

  if (modules.includes('wertstrom')) {
    const { error } = await admin
      .from('value_stream_maps')
      .delete()
      .eq('is_demo', true)
      .in('id', [...DEMO_VSM_IDS])
    if (error) errors.push(`value_stream_maps: ${error.message}`)
  }

  if (modules.includes('auftragseingang')) {
    // intakes has no is_demo flag — remove by stable demo ids.
    // intake_status_history / intake_field_values FK ON DELETE CASCADE.
    const { error } = await admin
      .from('intakes')
      .delete()
      .in('id', [...DEMO_INTAKE_IDS])
    if (error) errors.push(`intakes: ${error.message}`)
  }

  if (modules.includes('projektanlage')) {
    // Also clean up datenablage + audit/email when resetting projektanlage
    await admin.from('documents').delete().eq('is_demo', true)
    await admin.from('user_audit_log').delete().eq('is_demo', true)
    await admin.from('email_queue').delete().eq('is_demo', true)
    await admin
      .from('project_consultants')
      .delete()
      .in('project_id', projectIds)

    const { error } = await admin
      .from('projects')
      .delete()
      .eq('is_demo', true)
      .in('id', projectIds)
    if (error) errors.push(`projects: ${error.message}`)
  }

  if (modules.includes('top-management-demo')) {
    // Own pack — its own project (not the shared DEMO_PROJECT_IDS pool), so
    // it goes through the seeder's removePack rather than duplicating its
    // ~15-table removal sequence inline here.
    const result = await removePack(admin, 'top_management_demo')
    if (!result.success) errors.push(...result.errors)
  }

  if (errors.length > 0) {
    return NextResponse.json({ ok: false, errors }, { status: 500 })
  }

  return NextResponse.json({ ok: true, modules })
}
