import validateInactivity from "./validate.js";

export async function onRequestPost(context: RequestContext) {
  const { departments, end, hiatus, reason, senderTokenId, start } =
    context.data.body;

  const validationFailureResponse = validateInactivity(
    departments,
    end,
    hiatus,
    reason,
    start,
    context.data.departments,
  );

  if (validationFailureResponse) return validationFailureResponse;

  const inactivityId =
    context.data.current_user.id +
    (context.request.headers.get("cf-ray") as string).split("-")[0] +
    Date.now().toString();

  await context.env.DATA.put(
    `inactivity_${inactivityId}`,
    JSON.stringify({
      created_at: Date.now(),
      departments,
      end,
      fcm_token: typeof senderTokenId === "string" ? senderTokenId : undefined,
      hiatus,
      open: true,
      reason,
      start,
      user: {
        id: context.data.current_user.id,
        email: context.data.current_user.email,
        username: context.data.current_user.username,
      },
    }),
    {
      expirationTtl: 63072000,
    },
  );

  await context.env.D1.prepare(
    "INSERT INTO inactivity_notices (created_at, id, user) VALUES (?, ?, ?);",
  )
    .bind(Date.now(), inactivityId, context.data.current_user.id)
    .run();

  const departmentsToNotify = [];
  const departmentRoles = [];
  const { env } = context;

  for (const department of departments) {
    departmentsToNotify.push(env[`${department}_INACTIVITY_WEBHOOK`]);
    departmentRoles.push(env[`${department}_INACTIVITY_ROLE`]);
  }

  const webhookPromises = [];
  for (let i = 0; i < departmentsToNotify.length; i++)
    webhookPromises.push(
      fetch(departmentsToNotify[i], {
        body: JSON.stringify({
          content: `<@&${departmentRoles[i]}>`,
          embeds: [
            {
              title: "Inactivity Notice Submitted",
              color: 3756250,
              description: `View this notice at https://carcrushers.cc/mod-queue?id=${inactivityId}&type=inactivity`,
            },
          ],
        }),
        headers: {
          "content-type": "application/json",
        },
        method: "POST",
      }),
    );

  await Promise.allSettled(webhookPromises);

  return new Response(null, {
    status: 204,
  });
}