// NewsData.jsx — ЕДИНЫЙ источник новостей (готов под будущую админку/CMS).
// Каждая запись — это «модель новости»: всё, что нужно списку, карточке и
// детальной странице. Контент временный, структура — постоянная.
//
// Поле        Назначение
// id          стабильный слаг (URL / ключ в БД)
// tag         рубрика
// date        дата публикации (строка для примера; в админке — ISO)
// title       заголовок
// excerpt     краткое описание (списки, карточки, превью)
// thumb       вариант фирменного превью-фона: green | terracotta | cream
// icon        Lucide-иконка категории (для превью без текста)
// author      автор (опционально)
// readMin     примерное время чтения
// body        массив блоков детальной страницы: {type, text}
//             type: "p" (абзац) | "h" (подзаголовок) | "quote" (цитата)

const NEWS_FALLBACK = [
  {
    id: "vesenniy-lager-2026",
    image: "../../assets/news/molodezhnyy-lager.png",
    tag: "Лагерь",
    date: "28 мая 2026",
    title: "Весенний молодёжный лагерь в горах",
    excerpt: "Три дня общения, изучения Слова и служения друг другу высоко в горах Осетии.",
    thumb: "green",
    icon: "tent",
    author: "Команда миссии",
    readMin: 3,
    body: [
      { type: "p", text: "В конце мая молодёжь общин собралась вместе на три дня в горах Северной Осетии. Лагерь стал временем тишины, общения и духовного роста — вдали от городской суеты, рядом с величием Божьего творения." },
      { type: "h", text: "Слово и общение" },
      { type: "p", text: "Каждое утро начиналось с молитвы и изучения Библии. Ребята размышляли о том, что значит следовать за Христом в повседневной жизни, и делились личными историями веры." },
      { type: "quote", text: "«Здесь, среди гор, особенно ясно чувствуешь, как близок Бог и как Он заботится о каждом из нас»." },
      { type: "p", text: "Вечера проходили у костра — с песнями, свидетельствами и разговорами, которые запомнятся надолго. Многие отметили, что именно здесь приняли важные решения для своей жизни с Богом." },
      { type: "h", text: "Служение друг другу" },
      { type: "p", text: "Участники сами готовили, помогали в быту и заботились друг о друге. Это и есть живая вера — не только слова, но и дела любви к ближнему." },
    ],
  },
  {
    id: "propoved-nadezhda-ne-podvodit",
    image: "../../assets/news/propoved.png",
    tag: "Медиа",
    date: "21 мая 2026",
    title: "Новая проповедь: «Надежда, которая не подводит»",
    excerpt: "Запись воскресного богослужения уже доступна в разделе «Медиа».",
    thumb: "terracotta",
    icon: "play",
    author: "Медиаслужение",
    readMin: 2,
    body: [
      { type: "p", text: "На прошлом воскресном богослужении прозвучала проповедь о надежде — той, что не разочаровывает, потому что основана не на обстоятельствах, а на верности Бога." },
      { type: "p", text: "Запись уже доступна в разделе «Медиа». Вы можете послушать её сами и поделиться с теми, кому сейчас особенно нужно слово ободрения." },
      { type: "quote", text: "«Надежда не постыжает, потому что любовь Божия излилась в сердца наши Духом Святым» (Рим. 5:5)." },
      { type: "p", text: "Мы продолжаем публиковать аудио- и видеозаписи служений, чтобы Благая Весть была доступна каждому — где бы человек ни находился." },
    ],
  },
  {
    id: "pomosh-semyam-alagir",
    image: "../../assets/news/pomosh-semyam.png",
    tag: "Служение",
    date: "14 мая 2026",
    title: "Помощь семьям в Алагирском районе",
    excerpt: "Вместе с партнёрами мы передали продукты и тёплые вещи десяти семьям.",
    thumb: "cream",
    icon: "heart-handshake",
    author: "Социальное служение",
    readMin: 3,
    body: [
      { type: "p", text: "Вместе с партнёрами миссия передала продуктовые наборы и тёплые вещи десяти семьям Алагирского района, оказавшимся в трудной ситуации." },
      { type: "h", text: "Вера в делах" },
      { type: "p", text: "Мы верим, что любовь к ближнему проявляется конкретно — в заботе о тех, кто рядом. Эта помощь стала возможной благодаря поддержке неравнодушных людей и общин." },
      { type: "quote", text: "«Будьте же исполнители слова, а не слышатели только» (Иак. 1:22)." },
      { type: "p", text: "Служение милосердия продолжается. Если вы хотите присоединиться — молитвой, временем или участием, — напишите нам, мы будем рады." },
    ],
  },
  {
    id: "detskiy-hor-novye-pesni",
    image: "../../assets/news/detskiy-hor.png",
    tag: "Медиа",
    date: "30 апреля 2026",
    title: "Детский хор записал новые песни",
    excerpt: "Альбом «Песни надежды» пополнился новыми записями детского хора.",
    thumb: "green",
    icon: "music",
    author: "Детское служение",
    readMin: 2,
    body: [
      { type: "p", text: "Детский хор записал восемь новых песен — они вошли в альбом «Песни надежды». Дети с радостью прославляют Бога, и эта радость передаётся каждому слушателю." },
      { type: "p", text: "Записи доступны в разделе «Медиа». Включайте их дома, в дороге и на встречах — пусть добрые песни звучат и согревают сердца." },
      { type: "quote", text: "«Из уст младенцев и грудных детей Ты устроил хвалу» (Пс. 8:3)." },
      { type: "p", text: "Мы благодарим педагогов, родителей и всех, кто помогает детям расти в вере и творчестве." },
    ],
  },
];

let NEWS_DATA = NEWS_FALLBACK;

function formatNewsDate(value) {
  if (!value) return "";
  const date = new Date(value);
  if (Number.isNaN(date.getTime())) return value;
  return new Intl.DateTimeFormat("ru-RU", {
    day: "numeric",
    month: "long",
    year: "numeric",
  }).format(date).replace(/\sг\.$/, "");
}

function mediaUrl(media) {
  if (!media || typeof media !== "object") return "";
  return media.url || "";
}

function normalizeNewsItem(item) {
  const body = Array.isArray(item.body) && item.body.length
    ? item.body
        .filter((block) => block && block.text)
        .map((block) => ({
          type: block.type || "p",
          text: block.text,
        }))
    : [];
  const gallery = Array.isArray(item.gallery)
    ? item.gallery
        .map((entry) => ({
          image: mediaUrl(entry.image),
          alt: entry.image && typeof entry.image === "object" ? entry.image.alt || item.title : item.title,
          caption: entry.caption || "",
        }))
        .filter((entry) => entry.image)
    : [];

  return {
    id: item.slug || String(item.id),
    image: mediaUrl(item.mainImage),
    imageAlt: item.mainImage && typeof item.mainImage === "object" ? item.mainImage.alt || item.title : item.title,
    gallery,
    galleryTitle: item.galleryTitle || "",
    tag: item.category && typeof item.category === "object" ? item.category.title || "Служение" : item.tag || "Служение",
    date: formatNewsDate(item.publishedAt),
    title: item.title || "",
    excerpt: item.excerpt || "",
    thumb: item.thumb || "green",
    icon: item.icon || "newspaper",
    author: item.author || "Команда миссии",
    readMin: item.readMin || 2,
    body,
  };
}

async function fetchPayloadNews() {
  const now = Date.now();
  const res = await fetch("/api/news?depth=2&limit=30&sort=-publishedAt&where[status][equals]=published", {
    headers: { Accept: "application/json" },
  });
  if (!res.ok) throw new Error("Не удалось загрузить новости");

  const data = await res.json();
  if (!Array.isArray(data.docs) || !data.docs.length) return NEWS_FALLBACK;

  return data.docs
    .filter((item) => {
      const publishedAt = item.publishedAt ? new Date(item.publishedAt).getTime() : 0;
      return publishedAt > 0 && publishedAt <= now;
    })
    .map(normalizeNewsItem)
    .filter((item) => item.title && item.id);
}

function useNewsData() {
  const [items, setItems] = React.useState(NEWS_DATA);

  React.useEffect(() => {
    let cancelled = false;

    fetchPayloadNews()
      .then((nextItems) => {
        if (cancelled) return;
        NEWS_DATA = nextItems.length ? nextItems : NEWS_FALLBACK;
        window.NEWS_DATA = NEWS_DATA;
        setItems(NEWS_DATA);
      })
      .catch(() => {
        if (!cancelled) {
          NEWS_DATA = NEWS_FALLBACK;
          window.NEWS_DATA = NEWS_DATA;
          setItems(NEWS_FALLBACK);
        }
      });

    return () => {
      cancelled = true;
    };
  }, []);

  return items;
}

// helper для будущей админки/маршрутизации
function getNewsById(id) { return NEWS_DATA.find((n) => n.id === id) || null; }

Object.assign(window, { NEWS_DATA, NEWS_FALLBACK, getNewsById, useNewsData, fetchPayloadNews });
