/**
 * Человекочитаемые title/detail для центра уведомлений.
 */
(function (global) {
  const MONTHS = [
    "января",
    "февраля",
    "марта",
    "апреля",
    "мая",
    "июня",
    "июля",
    "августа",
    "сентября",
    "октября",
    "ноября",
    "декабря",
  ];

  function formatWhen(date) {
    const d = date instanceof Date ? date : new Date();
    const day = d.getDate();
    const month = MONTHS[d.getMonth()];
    const year = d.getFullYear();
    const hh = String(d.getHours()).padStart(2, "0");
    const mm = String(d.getMinutes()).padStart(2, "0");
    return `${day} ${month} ${year}, ${hh}:${mm}`;
  }

  function normalizeTitle(text) {
    const t = String(text || "").trim();
    if (/^Сохранено\b/i.test(t)) return "Сохранено";
    return t || "Уведомление";
  }

  function detectCategory(page, text, record) {
    if (record.category) return record.category;
    if (page === "recipes") return "recipe";
    if (page === "components") return "component";
    if (page === "feed_consumption") return "sklad";
    if (page === "feed_dispensers") return "equipment";
    if (page === "reports") return "report";
    if (record.category === "feed_quality") return "feed_quality";
    if (record.category === "daily_plan") return "daily_plan";
    if (page === "daily_plan") return "daily_plan";
    const lower = text.toLowerCase();
    if (
      lower.includes("план на день") ||
      lower.includes("из плана") ||
      lower.includes("в плане") ||
      lower.includes("замен")
    ) {
      return "daily_plan";
    }
    if (lower.includes("рейс") || lower.includes("рецепт")) return "recipe";
    if (lower.includes("компонент")) return "component";
    if (lower.includes("склад") || lower.includes("остат")) return "sklad";
    if (lower.includes("синхрон")) return "sync";
    if (lower.includes("перегруз") || lower.includes("недогруз") || lower.includes("миксер") || lower.includes("смешиван")) return "feed_quality";
    return "general";
  }

  function resolvePage(explicit) {
    if (explicit) return explicit;
    const path = (global.location && global.location.pathname) || "";
    if (path.startsWith("/recipes")) return "recipes";
    if (path.startsWith("/components")) return "components";
    if (path.startsWith("/feed_dispensers")) return "feed_dispensers";
    if (path.startsWith("/reports")) return "reports";
    if (path.startsWith("/feed_consumption")) return "feed_consumption";
    return "general";
  }

  function q(name) {
    return name ? `«${name}»` : "";
  }

  function buildNotificationRecord(kind, plainText, opts) {
    const options = opts && typeof opts === "object" ? opts : {};
    const record = options.record && typeof options.record === "object" ? options.record : {};
    const when = formatWhen();
    const page = resolvePage(record.page || options.page);
    const text = String(plainText || "").trim();
    let title = record.title || normalizeTitle(text);
    let detail = record.detail || "";

    if (!detail) {
      const recipe = record.recipeName || record.recipe;
      const component = record.componentName || record.component;
      const period = record.periodName || record.period;

      if (/^Сохранено$/i.test(title) && recipe) {
        detail = `Рейс ${q(recipe)} сохранён — ${when}`;
      } else if (/рейс удал/i.test(text) && recipe && period) {
        detail = `Рейс ${q(recipe)} удалён из периода ${q(period)} — ${when}`;
      } else if (/рейс удал/i.test(text) && recipe) {
        detail = `Рейс ${q(recipe)} удалён — ${when}`;
      } else if (/рейс скопирован/i.test(text) && recipe) {
        detail = `Рейс ${q(recipe)} скопирован — ${when}`;
      } else if (/вставлен из буфера/i.test(text)) {
        detail = `Рейс вставлен из буфера — ${when}`;
      } else if (/перенес/i.test(text) && recipe && period) {
        detail = `Рейс ${q(recipe)} перенесён в период ${q(period)} — ${when}`;
      } else if (/компонент добавлен/i.test(text) && component) {
        detail = `Компонент ${q(component)} добавлен — ${when}`;
      } else if (/компонент обнов/i.test(text) && component) {
        detail = `Компонент ${q(component)} обновлён — ${when}`;
      } else if (/компонент удал/i.test(text) && component) {
        detail = `Компонент ${q(component)} удалён — ${when}`;
      } else if (/убрано со склада/i.test(text) && component) {
        detail = `Компонент ${q(component)} убран со склада — ${when}`;
      } else if (/на склад/i.test(text) && component) {
        detail = `Компонент ${q(component)} добавлен на склад — ${when}`;
      } else if (/настройки сохранены/i.test(text)) {
        detail = `Настройки сохранены — ${when}`;
      } else if (record.category === "feed_quality" || page === "reports" && /перегруз|недогруз|миксер|смешиван/i.test(text)) {
        detail = record.detail || (text ? `${text} — ${when}` : `Отклонение по рейсу — ${when}`);
      } else if (text) {
        detail = `${text} — ${when}`;
      } else {
        detail = `Событие — ${when}`;
      }
    }

    return {
      title,
      detail,
      kind: kind || "info",
      category: detectCategory(page, text, record),
      page,
      linkKind:
        record.linkKind ||
        (page === "components"
          ? "component"
          : page === "feed_consumption"
            ? "sklad"
            : page === "feed_dispensers"
              ? "equipment"
              : null),
    };
  }

  global.WespZootechNotificationMessages = {
    formatWhen,
    buildNotificationRecord,
    resolvePage,
  };
})(typeof window !== "undefined" ? window : globalThis);
