export async function onRequestGet(context: RequestContext) {
  const { searchParams } = new URL(context.request.url);
  const before = parseInt(searchParams.get("before") || "0");
  const entryType = searchParams.get("type");
  const showClosed = searchParams.get("showClosed") === "true";
  const tables: { [k: string]: string } = {
    appeal: "appeals",
    gma: "game_appeals",
    report: "reports",
  };
  const types: { [k: string]: string } = {
    appeal: "appeal",
    gma: "gameappeal",
    report: "report",
  };
  const permissions: { [k: string]: number[] } = {
    appeal: [1 << 0, 1 << 1],
    gma: [1 << 5],
    report: [1 << 5],
  };
  const { current_user: currentUser } = context.data;

  if (!entryType || !types[entryType])
    return new Response('{"error":"Invalid filter type"}', {
      headers: {
        "content-type": "application/json",
      },
      status: 400,
    });

  if (!permissions[entryType].find((p) => currentUser.permissions & p))
    return new Response('{"error":"You cannot use this filter"}', {
      headers: {
        "content-type": "application/json",
      },
      status: 403,
    });

  if (isNaN(before) || before > Date.now())
    return new Response('{"error":"Invalid `before` parameter"}', {
      headers: {
        "content-type": "application/json",
      },
      status: 400,
    });

  const prefix = types[entryType];
  const table = tables[entryType];
  const items = [];
  const { results }: { results?: { created_at: number; id: string }[] } =
    await context.env.D1.prepare(
      "SELECT created_at, id FROM ? WHERE created_at < ? AND open = ? ORDER BY created_at DESC LIMIT 25;"
    )
      .bind(table, before, showClosed ? 0 : 1)
      .all();

  if (results)
    for (const { id } of results) {
      items.push(
        await context.env.DATA.get(`${prefix}_${id}`, { type: "json" })
      );
    }

  return new Response(JSON.stringify(items.filter((v) => v !== null)), {
    headers: {
      "content-type": "application/json",
    },
  });
}