import { NextRequest, NextResponse } from 'next/server';
import { eq } from 'drizzle-orm';
import { db } from '@/lib/db/client';
import { workspaces } from '@/lib/db/schema';
import { validateServiceAccount } from '@/modules/stats/lib/ga4-client';
import { generateWebhookSecret } from '@/modules/stats/lib/webhook-signature';
import { withAuth } from '@/core/auth';

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';

/**
 * PATCH-Endpoint für die "sensitiven" Workspace-Felder: GA4-Credentials + Webhook-Secret.
 *
 * Wir trennen das bewusst von /api/workspaces/ (= upsertWorkspace), weil:
 *  - GA4-JSON muss validiert werden vor dem Speichern (sonst harter Auth-Fail später)
 *  - Webhook-Secret-Rotation ist destructive — UI zeigt Confirm-Dialog
 *  - Logging-Sensitivität: dieser Endpoint loggt nie den Body-Inhalt
 *
 * Body-Schema (alle Felder optional, mindestens eines muss gesetzt sein):
 * {
 *   "ga4CredentialsJson": { ... }        // Service-Account-JSON oder null zum Löschen
 *   "rotateWebhookSecret": true,         // wenn true → neues Secret generieren
 *   "clearWebhookSecret": true,          // wenn true → Secret entfernen (Webhook-Endpoint wird 401)
 * }
 *
 * Response: { ok: true, webhookSecret?: "<new-secret>" }
 * Das neue Secret wird NUR in dieser einen Response zurückgegeben, danach nicht mehr abrufbar.
 */

interface PatchBody {
  ga4CredentialsJson?: unknown;
  rotateWebhookSecret?: boolean;
  clearWebhookSecret?: boolean;
}

export const PATCH = withAuth<{ params: Promise<{ slug: string }> }>(async (req: NextRequest, _ctx, { params }: { params: Promise<{ slug: string }> }) => {
  const { slug } = await params;
  if (!slug) return NextResponse.json({ error: 'Missing workspace slug' }, { status: 400 });

  const workspace = db.select({ id: workspaces.id }).from(workspaces).where(eq(workspaces.slug, slug)).get();
  if (!workspace) return NextResponse.json({ error: 'Workspace not found' }, { status: 404 });

  let body: PatchBody;
  try {
    body = (await req.json()) as PatchBody;
  } catch {
    return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 });
  }

  const updates: Record<string, unknown> = {};
  let newSecret: string | undefined;

  // GA4-Credentials: validieren oder explizit löschen
  if (body.ga4CredentialsJson !== undefined) {
    if (body.ga4CredentialsJson === null) {
      updates.ga4CredentialsJson = null;
    } else {
      try {
        validateServiceAccount(body.ga4CredentialsJson);
      } catch (e) {
        return NextResponse.json(
          { error: `Invalid service account: ${e instanceof Error ? e.message : 'unknown'}` },
          { status: 400 },
        );
      }
      updates.ga4CredentialsJson = body.ga4CredentialsJson;
    }
  }

  // Webhook-Secret: rotieren oder löschen
  if (body.rotateWebhookSecret) {
    newSecret = generateWebhookSecret();
    updates.webhookSecret = newSecret;
  } else if (body.clearWebhookSecret) {
    updates.webhookSecret = null;
  }

  if (Object.keys(updates).length === 0) {
    return NextResponse.json({ error: 'No updates provided' }, { status: 400 });
  }

  try {
    updates.updatedAt = new Date();
    db.update(workspaces).set(updates).where(eq(workspaces.id, workspace.id)).run();
    return NextResponse.json({ ok: true, ...(newSecret ? { webhookSecret: newSecret } : {}) });
  } catch (e) {
    return NextResponse.json({ error: e instanceof Error ? e.message : 'Update failed' }, { status: 500 });
  }
});
