// tdd-guard:skip — Next.js route handler is integration-level glue; the
// deletion logic lives in lib/gdpr/deletion.ts with its own tests.
import { NextResponse } from "next/server"

import { createClient } from "@/lib/supabase/server"
import { requestDeletion } from "@/lib/gdpr/deletion"
import { logger } from "@/lib/logger"

/**
 * GDPR Article 17 — Right to be forgotten (KAR-529).
 *
 * Marks the authenticated user's profile for deletion. The actual scrub is
 * operator-supervised and runs separately; this endpoint guarantees only
 * the user-visible irreversible step (mark + logout-on-next-request).
 *
 * Auth: required (Supabase session via cookie).
 * Method: DELETE on /api/users/me.
 * Response: 200 with { deletion_requested_at }, or 401 / 404 / 500.
 */
export async function DELETE() {
  const supabase = await createClient()
  const { data: claimsData } = await supabase.auth.getClaims()
  if (!claimsData?.claims) {
    return NextResponse.json({ error: "unauthorized" }, { status: 401 })
  }

  const userId = claimsData.claims.sub
  const result = await requestDeletion(supabase, userId)

  if (!result.ok) {
    logger.warn("gdpr.deletion.failed", {
      user_id: userId,
      error: result.error,
    })
    const status = result.error === "profile_not_found" ? 404 : 500
    return NextResponse.json({ error: result.error }, { status })
  }

  logger.info("gdpr.deletion.requested", {
    user_id: userId,
    deletion_requested_at: result.deletion_requested_at,
  })

  return NextResponse.json(
    {
      ok: true,
      deletion_requested_at: result.deletion_requested_at,
      message:
        "Account fuer Loeschung markiert. Sie werden auf die naechste Anfrage abgemeldet. Die Endgueltige Datenloeschung erfolgt durch den Operator gemaess Retention-Regeln.",
    },
    {
      status: 200,
      headers: { "Cache-Control": "no-store, max-age=0" },
    },
  )
}
