import { NextResponse } from 'next/server';
import { isM365Configured, getAccessToken, pingGraphUser, getAuditBcc, M365Error } from '@/adapters/send/m365-sender-impl';

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

/**
 * Read-only Diagnose: prüft ENV → Token-Endpoint → Graph-Erreichbarkeit.
 * Stoppt bei der ersten fehlschlagenden Stage und gibt `stage` + `detail` zurück,
 * damit die UI sagen kann WO der Test-Versand bricht — ohne Mail zu senden.
 *
 * Optional ?probe=<email> — testet, ob diese Mailbox via Graph erreichbar ist
 * (Default: M365_AUDIT_BCC, da diese ohnehin als Standard-Test-Empfänger dient).
 */
export async function GET(req: Request) {
  const url = new URL(req.url);
  const probe = url.searchParams.get('probe') ?? getAuditBcc();
  const start = Date.now();

  if (!isM365Configured()) {
    return NextResponse.json({
      ok: false,
      stage: 'env',
      detail:
        'Microsoft Graph nicht konfiguriert: M365_TENANT_ID / CLIENT_ID / CLIENT_SECRET (env) oder send_provider_config in /settings.',
      durationMs: Date.now() - start,
    }, { status: 400 });
  }

  try {
    await getAccessToken();
  } catch (err) {
    if (err instanceof M365Error) {
      return NextResponse.json({
        ok: false,
        stage: 'token',
        kind: err.kind,
        endpoint: err.endpoint,
        httpStatus: err.httpStatus,
        detail: err.message,
        durationMs: Date.now() - start,
      }, { status: 502 });
    }
    return NextResponse.json({
      ok: false, stage: 'token', detail: err instanceof Error ? err.message : String(err),
      durationMs: Date.now() - start,
    }, { status: 502 });
  }

  if (!probe) {
    return NextResponse.json({
      ok: true,
      stage: 'token',
      detail: 'Token erfolgreich geholt. Kein probe-Email angegeben — Graph-Ping übersprungen.',
      durationMs: Date.now() - start,
    });
  }

  try {
    const ping = await pingGraphUser(probe);
    return NextResponse.json({
      ok: true,
      stage: 'ok',
      detail: `Token + Graph-Mailbox "${probe}" erreichbar${ping.displayName ? ` (${ping.displayName})` : ''}.`,
      probe,
      durationMs: Date.now() - start,
    });
  } catch (err) {
    if (err instanceof M365Error) {
      return NextResponse.json({
        ok: false,
        stage: 'graph',
        kind: err.kind,
        endpoint: err.endpoint,
        httpStatus: err.httpStatus,
        detail: err.message,
        probe,
        durationMs: Date.now() - start,
      }, { status: 502 });
    }
    return NextResponse.json({
      ok: false, stage: 'graph', detail: err instanceof Error ? err.message : String(err),
      probe, durationMs: Date.now() - start,
    }, { status: 502 });
  }
}
