import { readBody } from "h3";
import { getAuthContext } from "../../../utils/auth";
import { prisma } from "../../../utils/prisma";
import { enqueueOutboundDelivery } from "../../../queues/outboundDelivery";

type EnqueueBody = {
  omniMessageId?: string;
  endpoint?: string;
  method?: "POST" | "PUT" | "PATCH";
  headers?: Record<string, string>;
  payload?: unknown;
  provider?: string;
  channel?: string;
  attempts?: number;
};

export default defineEventHandler(async (event) => {
  const auth = await getAuthContext(event);
  const body = await readBody<EnqueueBody>(event);

  const omniMessageId = String(body?.omniMessageId ?? "").trim();
  const endpoint = String(body?.endpoint ?? "").trim();
  if (!omniMessageId) {
    throw createError({ statusCode: 400, statusMessage: "omniMessageId is required" });
  }
  if (!endpoint) {
    throw createError({ statusCode: 400, statusMessage: "endpoint is required" });
  }

  const msg = await prisma.omniMessage.findFirst({
    where: { id: omniMessageId, teamId: auth.teamId },
    select: { id: true },
  });
  if (!msg) {
    throw createError({ statusCode: 404, statusMessage: "omni message not found" });
  }

  const attempts = Math.max(1, Math.min(Number(body?.attempts ?? 12), 50));
  const job = await enqueueOutboundDelivery(
    {
      omniMessageId,
      endpoint,
      method: body?.method ?? "POST",
      headers: body?.headers ?? {},
      payload: body?.payload ?? {},
      provider: body?.provider ?? undefined,
      channel: body?.channel ?? undefined,
    },
    {
      attempts,
    },
  );

  return {
    ok: true,
    queue: "omni-outbound",
    jobId: job.id,
    omniMessageId,
  };
});
