/**
 * KI-Shield Proxy — Safari-Zugriffswächter.
 *
 * WARUM ES DIESE DATEI GIBT (sicherheitskritisch):
 *
 * Chrome erteilt host_permissions bei der Installation. Safari nicht: Dort
 * entscheidet der Nutzer pro Website über das Symbol in der Symbolleiste
 * ("Für einen Tag erlauben" / "Immer erlauben"). Solange er das nicht getan
 * hat, laufen WEDER content.js NOCH injected.js — der fetch/XHR-Hook existiert
 * nicht, es gibt niemanden, der einen Send blockieren könnte.
 *
 * Das unterläuft die fail-closed-Zusage des Produkts an einer Stelle, die
 * NICHT im Code liegt: Ohne Hook gibt es keinen Fehlerpfad, der zuschlägt —
 * der Klartext geht einfach raus, so als wäre die Erweiterung nicht da. Das
 * ist der einzige Zustand, in dem KI-Shield still versagt.
 *
 * Deshalb ist die Warnung hier bewusst am Symbol (Badge) und nicht nur im
 * Popup: Sie muss sichtbar sein, OHNE dass der Nutzer etwas anklickt.
 *
 * Der Wächter ist reine Anzeige — er kann den fehlenden Schutz nicht ersetzen,
 * nur benennen.
 */

(() => {
  'use strict';

  const GUARD_TAG = '[KI-Shield Proxy][Safari-Zugriff]';

  // Die Chat-Plattformen aus dem Manifest. kishieldguard.de ist bewusst NICHT
  // dabei: Das ist der eigene API-Host, keine Seite, auf der geschützt wird.
  function platformOrigins() {
    try {
      const hosts = chrome.runtime.getManifest().host_permissions || [];
      return hosts.filter((origin) => !/kishieldguard\.de/i.test(origin));
    } catch (_) {
      return [];
    }
  }

  async function missingOrigins() {
    const origins = platformOrigins();
    const missing = [];
    for (const origin of origins) {
      try {
        const granted = await chrome.permissions.contains({ origins: [origin] });
        if (!granted) missing.push(origin);
      } catch (e) {
        // Unklarer Zustand wird als "nicht gewährt" gewertet. Lieber einmal zu
        // viel warnen als den Nutzer im Glauben lassen, er sei geschützt.
        console.warn(GUARD_TAG, 'Zugriffsprüfung fehlgeschlagen für', origin, e);
        missing.push(origin);
      }
    }
    return missing;
  }

  function hostLabel(origin) {
    return String(origin).replace(/^https?:\/\//, '').replace(/\/\*$/, '');
  }

  async function refreshBadge() {
    const missing = await missingOrigins();
    try {
      if (!missing.length) {
        await chrome.action.setBadgeText({ text: '' });
        await chrome.action.setTitle({
          title: 'KI-Shield Proxy — Zugriff auf alle Chat-Plattformen erteilt.',
        });
        return;
      }
      await chrome.action.setBadgeText({ text: '!' });
      await chrome.action.setBadgeBackgroundColor({ color: '#dc2626' });
      await chrome.action.setTitle({
        title:
          'KI-Shield Proxy schützt NICHT auf: ' +
          missing.map(hostLabel).join(', ') +
          '\nSafari hat der Erweiterung dort keinen Zugriff erteilt. ' +
          'Auf das Symbol klicken und den Zugriff erlauben.',
      });
    } catch (e) {
      console.warn(GUARD_TAG, 'Badge konnte nicht gesetzt werden:', e);
    }
  }

  // Der Nutzer kann den Zugriff jederzeit im Safari-Popover ändern — auch
  // wieder entziehen. Beide Richtungen müssen die Anzeige nachziehen.
  try {
    if (chrome.permissions && chrome.permissions.onAdded) {
      chrome.permissions.onAdded.addListener(() => { void refreshBadge(); });
    }
    if (chrome.permissions && chrome.permissions.onRemoved) {
      chrome.permissions.onRemoved.addListener(() => { void refreshBadge(); });
    }
  } catch (_) {}

  try {
    chrome.tabs.onActivated.addListener(() => { void refreshBadge(); });
    chrome.tabs.onUpdated.addListener((_tabId, changeInfo) => {
      if (changeInfo && changeInfo.status === 'complete') void refreshBadge();
    });
  } catch (_) {}

  chrome.runtime.onStartup.addListener(() => { void refreshBadge(); });
  chrome.runtime.onInstalled.addListener(() => { void refreshBadge(); });

  // Das Popup fragt denselben Zustand ab, um statt "Seite neu laden" die
  // zutreffende Safari-Anleitung zu zeigen (ein Reload hilft dort nicht).
  chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => {
    if (!msg || msg.type !== 'kishield-safari-access-query') return false;
    missingOrigins()
      .then((missing) => sendResponse({
        ok: true,
        safari: true,
        missing,
        labels: missing.map(hostLabel),
      }))
      .catch((e) => sendResponse({ ok: false, error: String((e && e.message) || e) }));
    return true;
  });

  void refreshBadge();
})();
