import { NextResponse } from 'next/server';
import { and, eq } from 'drizzle-orm';

import { withAuth, withPermission, withRateLimit } from '@/lib/api/helpers';
import { db } from '@/lib/db';
import { systemSettings } from '@/lib/db/schema/system';
import { requestEmailDraft } from '@/lib/services/email-draft.service';
import { parseBody } from '@/lib/api/route-helpers';
import { requestDraftSchema } from '@/lib/validators/ai';
import { CodedError, errorResponse } from '@/lib/errors';

// Gated on `email.send` - the draft endpoint spends OpenAI tokens and
// renders client/interest-scoped content; only roles permitted to send
// emails should be able to mint drafts (auditor-A3 §7).
export const POST = withAuth(
  withPermission(
    'email',
    'send',
    // 60/min/user cap - the draft endpoint spends OpenAI tokens, so an
    // unbounded loop (or a compromised rep account) could burn the port's
    // AI budget without this gate (auditor H9/H12).
    withRateLimit('ai', async (req, ctx) => {
      try {
        // Feature flag check
        const flag = await db.query.systemSettings.findFirst({
          where: and(
            eq(systemSettings.key, 'ai_email_drafts'),
            eq(systemSettings.portId, ctx.portId),
          ),
        });
        if (flag?.value !== true) {
          throw new CodedError('NOT_FOUND', {
            internalMessage: 'AI email-draft feature flag disabled for this port',
          });
        }

        const body = await parseBody(req, requestDraftSchema);
        const { jobId } = await requestEmailDraft(ctx.userId, {
          interestId: body.interestId,
          clientId: body.clientId,
          portId: ctx.portId,
          context: body.context,
          additionalInstructions: body.additionalInstructions,
        });

        return NextResponse.json({ data: { jobId } }, { status: 202 });
      } catch (error) {
        return errorResponse(error);
      }
    }),
  ),
);
