const express = require("express");
const path = require("path");

const app = express();
const PORT = process.env.PORT || 8083;
const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
const OPENAI_API_KEY    = process.env.OPENAI_API_KEY;

app.use(express.json());
app.use(express.static(path.join(__dirname, "public")));

const LEVEL_DESCRIPTIONS = {
  A2: "Grundstufe (A2): Lobe den Versuch kurz, kommentiere den Sinn und schlage einfache Alternativen vor",
  B1: "Mittelstufe (B1): Analysiere den Sinn, die Wortstellung und schlage natürlichere Formulierungen vor",
  B2: "Obere Mittelstufe (B2): Analysiere Sinn, Satzstruktur und Stil detailliert und schlage Alternativen vor",
};

// Audio is sent as raw binary body (Content-Type: audio/*)
app.post("/api/transcribe", express.raw({ type: "audio/*", limit: "25mb" }), async (req, res) => {
  if (!req.body || !req.body.length) {
    return res.status(400).json({ error: "No audio data" });
  }
  if (!OPENAI_API_KEY) {
    return res.status(500).json({ error: "OpenAI API key not configured" });
  }

  try {
    const mimeType = req.headers["content-type"] || "audio/webm";
    const form = new FormData();
    form.append("file", new Blob([req.body], { type: mimeType }), "audio.webm");
    form.append("model", "whisper-1");
    form.append("language", "de");

    const response = await fetch("https://api.openai.com/v1/audio/transcriptions", {
      method: "POST",
      headers: { Authorization: `Bearer ${OPENAI_API_KEY}` },
      body: form,
    });

    if (!response.ok) {
      const err = await response.text();
      console.error("Whisper API error:", response.status, err);
      return res.status(502).json({ error: "Transcription service error" });
    }

    const data = await response.json();
    res.json({ transcript: data.text || "" });
  } catch (err) {
    console.error("Transcribe request failed:", err);
    res.status(500).json({ error: "Internal server error" });
  }
});

app.post("/api/check", async (req, res) => {
  const { question, answer, level } = req.body;

  if (!question || !answer) {
    return res.status(400).json({ error: "question and answer are required" });
  }

  if (!ANTHROPIC_API_KEY) {
    return res.status(500).json({ error: "API key not configured" });
  }

  const levelDesc = LEVEL_DESCRIPTIONS[level] || LEVEL_DESCRIPTIONS["B1"];

  const systemPrompt = `Du bist ein Assistent zum Üben des gesprochenen Deutschen. Niveau des Nutzers: ${levelDesc}.

WICHTIG: Der Text wurde durch automatische Spracherkennung erfasst. Rechtschreibung, Zeichensetzung, Zusammenschreibungen und Großschreibung sind Erkennungsartefakte. Ignoriere diese vollständig. Kommentiere niemals Rechtschreibung, Zeichensetzung oder unklare Wörter.

Du bekommst eine Frage auf Deutsch und die Antwort des Nutzers auf Deutsch. Gib genau zwei Punkte:

1. **Korrektur** — nur der gröbste Fehler im Sinn oder in der Wortstellung (wenn kein Fehler — kurz bestätigen)
2. **Alternative Formulierung** — eine andere Möglichkeit, denselben Gedanken auf Deutsch auszudrücken

Füge nichts weiter hinzu. Antworte auf Deutsch. Verwende Markdown zur Formatierung.`;

  const userMessage = `Frage: ${question}\n\nAntwort des Nutzers: ${answer}`;

  try {
    const response = await fetch("https://api.anthropic.com/v1/messages", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-api-key": ANTHROPIC_API_KEY,
        "anthropic-version": "2023-06-01",
      },
      body: JSON.stringify({
        model: "claude-haiku-4-5-20251001",
        max_tokens: 1024,
        system: systemPrompt,
        messages: [{ role: "user", content: userMessage }],
      }),
    });

    if (!response.ok) {
      const error = await response.text();
      console.error("Anthropic API error:", response.status, error);
      return res.status(502).json({ error: "AI service error" });
    }

    const data = await response.json();
    const feedback = data.content?.[0]?.text || "";

    res.json({ feedback });
  } catch (err) {
    console.error("Request failed:", err);
    res.status(500).json({ error: "Internal server error" });
  }
});

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});
