/* ============================================================================
 * AIVA ENGINE — Backend-Kommunikation
 * ----------------------------------------------------------------------------
 * Sendet Chat-Verlauf an /api/chat (OpenAI gpt-4o-mini, server-seitig).
 *
 * BACKEND-VERTRAG (was dein Server unter AIVA_ENDPOINT implementieren muss):
 * ---------------------------------------------------------------------------
 * POST /api/chat
 *   Request:
 *     {
 *       "messages": [
 *         { "role": "system", "content": "..." },
 *         { "role": "user",   "content": "Hallo" },
 *         { "role": "assistant", "content": "..." },
 *         ...
 *       ],
 *       "calculatorState": {
 *         "users": 10, "term": 24, "tier": "Core",
 *         "support": false, "email": true, "phone": false,
 *         "aiRecep": false, "aiMinutes": "none",
 *         "partnerDS": false, "partnerE5": false, "partnerCam": false, "partnerAuto": false,
 *         "totalMRR": 700, "setup": 5500
 *       }
 *     }
 *   Response:
 *     { "reply": "Aivas Antwort inkl. ```actions``` und ```quickReplies``` Fences" }
 *
 *   Der Server ruft OpenAI auf, hängt den Systemprompt an, und liefert die
 *   Antwort zurück. Modell: gpt-4o-mini (per ENV überschreibbar).
 * ========================================================================= */

(function () {
  const { systemPrompt, endpoint } = window.AIVA_CONFIG;

  /* Extrahiert ```actions``` und ```quickReplies``` Code-Fences aus der Antwort. */
  function parseAivaResponse(raw) {
    let text = raw || '';
    let actions = [];
    let quickReplies = [];

    const actionsMatch = text.match(/```actions\s*\n?([\s\S]*?)```/);
    if (actionsMatch) {
      try {
        actions = JSON.parse(actionsMatch[1].trim());
        if (!Array.isArray(actions)) actions = [];
      } catch (e) { console.warn('[Aiva] actions-JSON parse error', e); }
      text = text.replace(actionsMatch[0], '').trim();
    }

    const qrMatch = text.match(/```quickReplies\s*\n?([\s\S]*?)```/);
    if (qrMatch) {
      try {
        quickReplies = JSON.parse(qrMatch[1].trim());
        if (!Array.isArray(quickReplies)) quickReplies = [];
      } catch (e) { console.warn('[Aiva] quickReplies-JSON parse error', e); }
      text = text.replace(qrMatch[0], '').trim();
    }

    return { text: text.trim(), actions, quickReplies };
  }

  /* Schickt die Nachrichten an /api/chat. Bei Fehler liefert eine kurze
     Notfall-Antwort mit Kontaktdaten zurück — keine LLM-Fallbacks. */
  async function callBackend(messages, calculatorState) {
    try {
      const res = await fetch(endpoint, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          messages: [{ role: 'system', content: systemPrompt }, ...messages],
          calculatorState
        })
      });

      // Server liefert bei Rate-Limit / Fehler oft schon einen vorgefertigten
      // `reply` mit Kontakt-Aktion mit — den zeigen wir direkt an.
      const data = await res.json().catch(() => ({}));
      if (data && data.reply) return data.reply;

      if (!res.ok) {
        console.warn('[Aiva] Backend antwortete mit', res.status);
      }
    } catch (e) {
      console.warn('[Aiva] Backend nicht erreichbar', e.message);
    }

    return 'Ich kann gerade leider keine Verbindung zu unserem Beratungssystem aufbauen. Bitte erreichen Sie uns direkt unter +49 521 163913-10 oder kontakt@malitech-solutions.de.\n\n```actions\n[{"type":"show_contact"}]\n```';
  }

  async function sendMessage(history, userMessage, calculatorState) {
    const messages = [...history, { role: 'user', content: userMessage }];
    const raw = await callBackend(messages, calculatorState);
    return parseAivaResponse(raw);
  }

  /* Aktionen anwenden — dispatcht Events, auf die der Konfigurator hört. */
  function applyActions(actions) {
    if (!Array.isArray(actions)) return;
    actions.forEach((a) => {
      if (!a || typeof a !== 'object') return;
      window.dispatchEvent(new CustomEvent('aiva:action', { detail: a }));
    });
  }

  window.AivaEngine = { sendMessage, applyActions, parseAivaResponse };
})();
