import { awardPoints } from "../../utils/scoring";
import { createPost } from "../../db/community";

const MODERATION_PROMPT = `Du moderierst Beiträge in einer anonymen Selbsthilfe-Community für Menschen mit Glücksspielsucht.
Entferne Beiträge die:
- Casino-Werbung oder Links zu Glücksspielseiten enthalten
- Tipps zum Umgehen von Blockern geben
- Andere Nutzer manipulieren oder angreifen
- Offensichtlichen Spam darstellen
Erlaube: persönliche Erfahrungen, Hilferufe, Erfolgsgeschichten, Fragen.
Antworte NUR mit JSON: {"approved": boolean, "reason": string}`;

export default defineEventHandler(async (event) => {
  const user = await requireUser(event);

  const body = await readBody(event);
  const { category, content, imageUrl, gameName } = body as {
    category: string;
    content: string;
    imageUrl?: string;
    gameName?: string | null;
  };

  if (!content?.trim() || !category) {
    throw createError({
      statusCode: 400,
      message: "category und content erforderlich",
    });
  }

  const config = useRuntimeConfig();

  // Moderate via OpenRouter (optional – skip if no API key)
  if (config.openrouterApiKey) {
    try {
      const modResponse = await $fetch<{
        choices: { message: { content: string } }[];
      }>("https://openrouter.ai/api/v1/chat/completions", {
        method: "POST",
        headers: {
          Authorization: `Bearer ${config.openrouterApiKey}`,
          "Content-Type": "application/json",
          "HTTP-Referer": "https://rebreak.org",
          "X-Title": "ReBreak Moderation",
        },
        body: {
          model: "meta-llama/llama-3.2-3b-instruct:free",
          max_tokens: 100,
          messages: [
            { role: "system", content: MODERATION_PROMPT },
            {
              role: "user",
              content: `Kategorie: ${category}\nInhalt: ${content}`,
            },
          ],
        },
      });

      const raw = modResponse.choices?.[0]?.message?.content ?? "";
      const jsonMatch = raw.match(/\{[\s\S]*\}/);
      const modResult: { approved: boolean; reason: string } = jsonMatch
        ? JSON.parse(jsonMatch[0])
        : { approved: true, reason: "" };

      if (!modResult.approved) {
        throw createError({
          statusCode: 422,
          message: `Beitrag abgelehnt: ${modResult.reason}`,
        });
      }
    } catch (err: any) {
      if (err.statusCode === 422) throw err;
    }
  }

  const data = await createPost(user.id, category, content.trim(), imageUrl, gameName ?? null);

  // Punkte vergeben
  await awardPoints(user.id, "post_created", { post_id: data.id });

  return data;
});
