import { NextResponse } from 'next/server';

import { withAuth, withPermission } from '@/lib/api/helpers';
import { errorResponse } from '@/lib/errors';
import { getPortDocumensoConfig } from '@/lib/services/port-config';
import { getEoiTemplateSyncReport } from '@/lib/services/documenso-template-sync.service';

/**
 * GET `/api/v1/documents/signing-defaults`
 *
 * Returns the per-port developer + approver defaults the
 * UploadForSigningDialog uses to prefill the recipient configurator.
 * No secrets are exposed - just the display name, email, and the
 * sendMode flag so the UI can show the right CTA copy ("Send now" vs
 * "Save draft, send manually").
 *
 * Permission: documents.send_for_signing - the only caller is the
 * upload-for-signing dialog which already requires this permission to
 * complete the flow.
 */
export const GET = withAuth(
  withPermission('documents', 'send_for_signing', async (_req, ctx) => {
    try {
      const cfg = await getPortDocumensoConfig(ctx.portId);

      // Signing order resolution chain (highest → lowest priority):
      //   1. Cached `documento_eoi_template_sync_report.templateMeta.signingOrder`
      //      - populated by the admin "Sync from Documenso" button and
      //      represents the live template's bound order. On v2 this is the
      //      authoritative value because `/template/use` doesn't accept a
      //      per-call override.
      //   2. Per-port `documenso_signing_order` setting from
      //      getPortDocumensoConfig (used by v1 + as a UI fallback when the
      //      admin hasn't run a sync yet).
      //   3. Documenso's own default (`PARALLEL` = concurrent signing).
      const syncReport = await getEoiTemplateSyncReport(ctx.portId).catch(() => null);
      const signingOrder: 'PARALLEL' | 'SEQUENTIAL' =
        syncReport?.templateMeta?.signingOrder ?? cfg.signingOrder ?? 'PARALLEL';

      return NextResponse.json({
        data: {
          developer: {
            name: cfg.developerName ?? '',
            email: cfg.developerEmail ?? '',
            label: cfg.developerLabel ?? 'Developer',
          },
          approver: {
            name: cfg.approverName ?? '',
            email: cfg.approverEmail ?? '',
            label: cfg.approverLabel ?? 'Approver',
          },
          sendMode: cfg.sendMode,
          signingOrder,
          // Surface where the value came from so the UI tooltip can be
          // honest about the source. Helps reps debug "I changed it in
          // Documenso but the CRM still says X" - they need to re-run
          // Sync to pull the change.
          signingOrderSource: syncReport?.templateMeta?.signingOrder
            ? 'template'
            : cfg.signingOrder
              ? 'port-setting'
              : 'default',
        },
      });
    } catch (error) {
      return errorResponse(error);
    }
  }),
);
