import { jsonError } from "../../common.js";
import precheck from "./precheck.js";

export async function onRequestPost(context: RequestContext) {
  const authHeader = context.request.headers.get("rbx-auth");

  if (authHeader !== context.env.ROBLOX_APPEALS_TOKEN)
    return jsonError("Unauthorized", 401);

  const { id, reasonForUnban, type, username, whatHappened } =
    context.data.body;

  if (
    typeof id !== "number" ||
    typeof reasonForUnban !== "string" ||
    !["ban", "leaderboard", "server_configurator"].includes(type) ||
    typeof username !== "string" ||
    typeof whatHappened !== "string"
  )
    return jsonError("Invalid data", 400);

  if (!reasonForUnban.length || !whatHappened.length)
    return jsonError("Missing required fields", 400);

  if (reasonForUnban.length > 5000 || whatHappened.length > 5000)
    return jsonError(
      "The maximum length of each text field is 5000 characters",
      400,
    );

  if (reasonForUnban.length < 100)
    return jsonError(
      "Your explanation of why you should be unbanned must be longer",
      400,
    );

  if (whatHappened.length < 50)
    return jsonError("Your explanation of your ban must be longer", 400);

  const precheckData = await precheck(context, id);

  if (precheckData.error)
    return jsonError("Unable to check your eligibility, try again later", 500);

  if (!precheckData.can_appeal)
    return jsonError(precheckData.reason as string, 400);

  if (!precheckData.types?.includes(type))
    return jsonError("Specified punishment type is not applicable", 400);

  const appealId = `${id}${
    context.request.headers.get("cf-ray")?.split("-")[0]
  }${Date.now()}`;

  await context.data.prisma.gameAppeal.create({
    data: {
      id: appealId,
      reason_for_unban: reasonForUnban,
      roblox_id: id,
      roblox_username: username,
      type,
      what_happened: whatHappened,
    },
  });

  await fetch(context.env.REPORTS_WEBHOOK, {
    body: JSON.stringify({
      embeds: [
        {
          color: 3756250,
          description: `${username} has pleaded for forgiveness! Head to https://carcrushers.cc/mod-queue?id=${appealId}&type=gma`,
          title: "Appeal Submitted",
        },
      ],
    }),
    headers: {
      "content-type": "application/json",
    },
    method: "POST",
  });

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