// Adstop — логика попапа.
const API_BASE = "https://bez-reklamy.ru";

const el = (id) => document.getElementById(id);

function sendMessage(message) {
  return chrome.runtime.sendMessage(message);
}

async function getActiveTab() {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  return tab ?? null;
}

function hostFromUrl(url) {
  try {
    const parsed = new URL(url);
    if (!["http:", "https:"].includes(parsed.protocol)) return null;
    return parsed.hostname.replace(/^www\./, "");
  } catch {
    return null;
  }
}

function formatDate(value) {
  return new Date(value).toLocaleDateString("ru-RU", { day: "numeric", month: "long" });
}

function daysLeft(timestamp) {
  return Math.max(0, Math.ceil((timestamp - Date.now()) / (24 * 60 * 60 * 1000)));
}

// Реальное число заблокированных запросов вкладки. getBadgeText при включённом
// displayActionCountAsBadgeText возвращает плейсхолдер <<declarativeNetRequest...>>,
// поэтому основной источник — getMatchedRules (declarativeNetRequestFeedback).
async function blockedCountForTab(tabId) {
  try {
    const result = await chrome.declarativeNetRequest.getMatchedRules({ tabId });
    return result?.rulesMatchedInfo?.length ?? 0;
  } catch {
    // лимит вызовов getMatchedRules — fallback на бейдж, отфильтровав плейсхолдер
    try {
      const badge = await chrome.action.getBadgeText({ tabId });
      return /^\d+$/.test(badge) ? Number(badge) : 0;
    } catch {
      return 0;
    }
  }
}

function renderStatus(state) {
  const pill = el("status-pill");
  pill.classList.remove("ok", "warn", "off");
  if (state.licenseActive) {
    pill.textContent = "Подписка активна";
    pill.classList.add("ok");
  } else if (state.trialActive) {
    pill.textContent = `Триал: ${daysLeft(state.trialEndsAt)} дн.`;
    pill.classList.add("warn");
  } else {
    pill.textContent = "Подписка не активна";
    pill.classList.add("off");
  }

  el("subscription-banner").classList.toggle("hidden", state.trialActive || state.licenseActive);

  el("toggle-enabled").checked = state.enabled;
  el("state-note").textContent = state.blockingActive
    ? "реклама блокируется на всех сайтах"
    : state.enabled
      ? "нужна активная подписка"
      : "выключена вами";
}

function maskKey(key) {
  // ADS-ABCD-EFGH-IJKL → ADS-••••-••••-IJKL
  const parts = String(key).split("-");
  if (parts.length !== 4) return key;
  return `${parts[0]}-••••-••••-${parts[3]}`;
}

function renderAccount(state) {
  const hasKey = Boolean(state.licenseKey);
  el("key-form").classList.toggle("hidden", hasKey);
  el("key-info").classList.toggle("hidden", !hasKey);
  if (hasKey) {
    el("key-display").textContent = maskKey(state.licenseKey);
    el("key-note").textContent = state.licenseActive && state.license?.expiresAt
      ? `активна до ${formatDate(state.license.expiresAt)}`
      : "подписка не активна";
  }
}

async function renderSite(state) {
  const tab = await getActiveTab();
  const host = tab ? hostFromUrl(tab.url ?? "") : null;
  const siteToggle = el("toggle-site");
  if (!host) {
    el("site-host").textContent = "служебная страница";
    el("site-note").textContent = "здесь блокировать нечего";
    siteToggle.checked = false;
    siteToggle.disabled = true;
    return;
  }
  const allowlisted = state.allowlist.includes(host);
  el("site-host").textContent = host;
  el("site-note").textContent = allowlisted ? "сайт в белом списке" : "реклама блокируется";
  siteToggle.checked = !allowlisted;
  siteToggle.disabled = false;
  siteToggle.dataset.host = host;

  // статистика вкладки
  if (tab?.id != null) {
    el("stat-network").textContent = String(await blockedCountForTab(tab.id));
    try {
      const stats = await chrome.tabs.sendMessage(tab.id, { type: "getCosmeticStats" });
      el("stat-cosmetic").textContent = String(stats?.hidden ?? 0);
    } catch {
      el("stat-cosmetic").textContent = "0";
    }
  }
}

function formatRelative(timestamp) {
  if (!timestamp) return null;
  const diff = Date.now() - timestamp;
  const hours = Math.floor(diff / (60 * 60 * 1000));
  if (hours < 1) return "только что";
  if (hours < 24) return `${hours} ч назад`;
  const days = Math.floor(hours / 24);
  return days === 1 ? "вчера" : `${days} дн назад`;
}

function renderFilters(state) {
  const note = el("filters-note");
  if (state.filtersUpdatedAt) {
    note.textContent = `обновлены ${formatRelative(state.filtersUpdatedAt)}`;
  } else {
    note.textContent = "встроенные · обновятся автоматически";
  }
}

async function refresh(state) {
  const current = state ?? (await sendMessage({ type: "getState" }));
  renderStatus(current);
  renderAccount(current);
  renderFilters(current);
  await renderSite(current);
}

el("toggle-enabled").addEventListener("change", async (event) => {
  await refresh(await sendMessage({ type: "setEnabled", enabled: event.target.checked }));
});

el("toggle-site").addEventListener("change", async (event) => {
  const host = event.target.dataset.host;
  if (!host) return;
  await refresh(await sendMessage({ type: "toggleAllowlist", host }));
});

el("update-filters-button").addEventListener("click", async () => {
  const button = el("update-filters-button");
  const note = el("filters-note");
  button.disabled = true;
  button.textContent = "…";
  const result = await sendMessage({ type: "updateFilters", force: true });
  button.disabled = false;
  button.textContent = "Обновить";
  if (result?.error) {
    note.textContent = "не удалось обновить — нет связи";
  } else if (result?.updated) {
    note.textContent = `обновлены до ${result.version}`;
  } else {
    note.textContent = "уже актуальны";
  }
  await refresh();
});

async function activate() {
  const key = el("key-input").value;
  const errorEl = el("key-error");
  errorEl.classList.add("hidden");
  if (!key.trim()) {
    errorEl.textContent = "Вставьте лицензионный ключ";
    errorEl.classList.remove("hidden");
    return;
  }
  el("activate-button").disabled = true;
  const result = await sendMessage({ type: "activateKey", key });
  el("activate-button").disabled = false;
  if (result?.error) {
    errorEl.textContent = result.error;
    errorEl.classList.remove("hidden");
    return;
  }
  el("key-input").value = "";
  await refresh(result);
}

el("activate-button").addEventListener("click", activate);
el("key-input").addEventListener("keydown", (event) => {
  if (event.key === "Enter") activate();
});

el("buy-button").addEventListener("click", () => {
  chrome.tabs.create({ url: `${API_BASE}/#pricing` });
});

el("remove-key-button").addEventListener("click", async () => {
  await refresh(await sendMessage({ type: "removeKey" }));
});

el("manage-button").addEventListener("click", () => {
  chrome.tabs.create({ url: `${API_BASE}/#pricing` });
});

el("subscribe-button").addEventListener("click", () => {
  chrome.tabs.create({ url: `${API_BASE}/#pricing` });
});

refresh();
