// Aris PDF AI Reader — service worker (MV3)
// Отвечает за:
//   1. перехват открытия PDF и редирект на собственный просмотрщик (declarativeNetRequest);
//   2. контекстное меню действий над выделенным текстом;
//   3. служебные сообщения от viewer'а (скачивание, открытие в новом окне).

import { ensureDefaults, getSettings } from "../common/storage.js";

const REDIRECT_RULE_ID = 1;
const REDIRECT_RULE_ID_FILE = 2;

// ---------------------------------------------------------------------------
// 1. Перехват PDF → собственный просмотрщик
// ---------------------------------------------------------------------------

const VIEWER_URL = chrome.runtime.getURL("src/viewer/viewer.html");

/**
 * Динамическое правило: только в рантайме известен chrome-extension://<id>,
 * поэтому строим redirect через updateDynamicRules, а не через статический файл.
 * Перехватываем только навигацию верхнего/вложенного фрейма к *.pdf —
 * запросы самого просмотрщика (fetch/xhr за телом документа) не трогаем.
 */
async function installRedirectRule(enabled) {
  const redirect = { regexSubstitution: `${VIEWER_URL}?file=\\1` };
  await chrome.declarativeNetRequest.updateDynamicRules({
    removeRuleIds: [REDIRECT_RULE_ID, REDIRECT_RULE_ID_FILE],
    addRules: enabled
      ? [
          {
            id: REDIRECT_RULE_ID,
            priority: 1,
            action: { type: "redirect", redirect },
            condition: {
              // http/https ссылки, оканчивающиеся на .pdf (с учётом query/anchor).
              // \\1 — группа захвата со всем URL (ссылки \\0 на всё совпадение нет).
              regexFilter: "^(https?://.*\\.pdf(\\?.*)?(#.*)?)$",
              resourceTypes: ["main_frame", "sub_frame"],
            },
          },
          {
            // Локальные файлы file:///…pdf. Сработает, только если для расширения
            // включён доступ к файловым URL («Разрешить доступ к URL-адресам файлов»).
            id: REDIRECT_RULE_ID_FILE,
            priority: 1,
            action: { type: "redirect", redirect },
            condition: {
              regexFilter: "^(file://.*\\.pdf)$",
              resourceTypes: ["main_frame", "sub_frame"],
            },
          },
        ]
      : [],
  });
}

async function syncInterception() {
  const { interceptEnabled } = await getSettings();
  await installRedirectRule(interceptEnabled !== false);
}

chrome.runtime.onInstalled.addListener(async () => {
  await ensureDefaults();
  await syncInterception();
  setupContextMenus();
});

chrome.runtime.onStartup.addListener(async () => {
  await ensureDefaults();
  await syncInterception();
  setupContextMenus();
});

// Реагируем на переключатель «перехватывать PDF» из настроек.
chrome.storage.onChanged.addListener((changes, area) => {
  if (area === "local" && changes.interceptEnabled) {
    installRedirectRule(changes.interceptEnabled.newValue !== false);
  }
});

// ---------------------------------------------------------------------------
// 2. Контекстное меню над выделенным текстом
// ---------------------------------------------------------------------------

const SELECTION_ACTIONS = [
  { id: "aris-explain", title: "Объяснить" },
  { id: "aris-translate", title: "Перевести" },
  { id: "aris-shorten", title: "Сократить" },
  { id: "aris-rewrite", title: "Переписать" },
  { id: "aris-risks", title: "Найти риски" },
  { id: "aris-ask", title: "Спросить AI" },
];

function setupContextMenus() {
  chrome.contextMenus.removeAll(() => {
    chrome.contextMenus.create({
      id: "aris-root",
      title: "Aris PDF AI",
      contexts: ["selection"],
      documentUrlPatterns: [`${VIEWER_URL}*`],
    });
    for (const a of SELECTION_ACTIONS) {
      chrome.contextMenus.create({
        id: a.id,
        parentId: "aris-root",
        title: a.title,
        contexts: ["selection"],
        documentUrlPatterns: [`${VIEWER_URL}*`],
      });
    }
  });
}

chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (!tab?.id || !info.menuItemId?.startsWith("aris-")) return;
  chrome.tabs.sendMessage(tab.id, {
    type: "selection-action",
    action: info.menuItemId.replace("aris-", ""),
    text: info.selectionText || "",
  });
});

// ---------------------------------------------------------------------------
// 3. Сообщения от просмотрщика
// ---------------------------------------------------------------------------

chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => {
  if (msg?.type === "download-pdf" && msg.url) {
    chrome.downloads.download({ url: msg.url, filename: msg.filename || undefined });
    sendResponse({ ok: true });
    return true;
  }
  if (msg?.type === "open-window" && msg.url) {
    chrome.windows.create({ url: msg.url, type: "popup", width: 1200, height: 900 });
    sendResponse({ ok: true });
    return true;
  }
  if (msg?.type === "open-options") {
    chrome.runtime.openOptionsPage();
    sendResponse({ ok: true });
    return true;
  }
  return false;
});
