// bible.js
const fs = require("fs");
const path = require("path");

const BIBLE_STYLE = {
  // Имя файла фоновой картинки (лежит рядом с проектом), отдаётся по /bg
  bgFileName: "bible_bg.jpg",

  // Внутренние отступы “безопасной зоны” от краёв 4K-экрана (в пикселях)
  // top/right/bottom/left — сколько отступить от соответствующей стороны
  padding: { top: 160, right: 260, bottom: 160, left: 260 },

  // Максимальная ширина блока со стихом (в пикселях).
  // Ограничивает “длину строк”, чтобы текст выглядел сценически и не растягивался на весь экран.
  maxTextWidthPx: 3300,

  // Базовый (стартовый) размер шрифта стиха (в пикселях).
  // Сначала ставим его, и только если не влезает — начинаем уменьшать.
  baseFontPx: 240,

  // Минимальный размер шрифта стиха (в пикселях).
  // Ниже этого значения авто-уменьшение не пойдёт (защита от слишком мелкого текста).
  minFontPx: 90,

  // Шаг уменьшения шрифта при “не влезает” (в пикселях).
  // Чем меньше шаг — тем точнее подгонка, но тем больше итераций.
  stepPx: 4,

  // Межстрочный интервал для стиха (множитель).
  // 1.12 означает: line-height = 1.12 * font-size
  lineHeight: 1.12,

  // Размер шрифта нижней подписи (книга + стих), в пикселях.
  // Например: "Эсфирь 8:9"
  refFontPx: 130,

  // Отступ нижней подписи от нижнего края экрана (в пикселях).
  // Поднимает/опускает строку подписи.
  refBottomPx: 70,

  // Резерв высоты под нижнюю подпись + небольшой “воздух” (в пикселях).
  // Эта величина вычитается из доступной высоты окна стиха, чтобы стих не наезжал на подпись.
  refReservePx: 220,

  // Затемнение фона сверху (0..1) — альфа чёрного слоя в градиенте.
  // Чем больше число, тем темнее верхняя часть картинки.
  shadeTop: 0.58,

  // Затемнение фона снизу (0..1) — альфа чёрного слоя в градиенте.
  // Чем больше число, тем темнее нижняя часть картинки.
  shadeBottom: 0.35,
};

const bgPath = path.join(__dirname, BIBLE_STYLE.bgFileName);

function getBibleBgRoute(req, res) {
  if (req.url !== "/bg") return false;

  if (!fs.existsSync(bgPath)) {
    res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
    res.end(`Нет файла ${BIBLE_STYLE.bgFileName} рядом с проектом`);
    return true;
  }

  res.writeHead(200, { "Content-Type": "image/jpeg" });
  res.end(fs.readFileSync(bgPath));
  return true;
}

function stripHtmlKeepBreaks(html) {
  return String(html || "")
    .replace(/<sup[^>]*>.*?<\/sup>/gi, "") // не показываем sup в тексте
    .replace(/<br\s*\/?>/gi, "\n")
    .replace(/<[^>]+>/g, "")
    .replace(/&nbsp;/g, " ")
    .replace(/&amp;/g, "&")
    .replace(/&lt;/g, "<")
    .replace(/&gt;/g, ">")
    .trim();
}

function escapeHtml(s) {
  return String(s)
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;");
}

// 1) Достаём "номер стиха" (глава:стих), который сейчас показывается
function extractVerseNumber(payload) {
  // a) из html: <sup>8:9&nbsp;</sup>
  const h = String(payload.html || "");
  const mSup = h.match(/<sup[^>]*>\s*([0-9]{1,3}:[0-9]{1,3})/i);
  if (mSup) return mSup[1];

  // b) из текста: "8:9 И ...", "1:14 И сказал ..."
  const t = String(payload.text || "").trim();
  const mTxt = t.match(/^([0-9]{1,3}:[0-9]{1,3})\b/);
  if (mTxt) return mTxt[1];

  // c) иногда в plain после чистки может остаться "8:9 " в начале
  const plain = stripHtmlKeepBreaks(payload.html || "");
  const mPlain = plain.match(/^([0-9]{1,3}:[0-9]{1,3})\b/);
  if (mPlain) return mPlain[1];

  return "";
}

// 2) Достаём название книги (без диапазона)
function extractBookName(payload) {
  // Обычно title: "Бытие 1:1-30 1, -, -" или "Эсфирь 8:9-..." и т.п.
  const title = String(payload.title || "").trim();
  const footer0 =
    Array.isArray(payload.footer) && payload.footer[0]
      ? String(payload.footer[0]).trim()
      : "";

  // Берём источник, где чаще всего есть книга
  const src = footer0 || title;

  // отрезаем всё начиная с первого "пробел + цифра"
  // "Бытие 1:1-30" -> "Бытие"
  // "1 Коринфянам 13:1-7" -> "1 Коринфянам"
  // "Песнь Песней 2:1" -> "Песнь Песней"
  const m = src.match(/^(.*?)(?=\s+\d)/);
  if (m && m[1]) return m[1].trim();

  // fallback: первые 2 слова
  const parts = src.split(/\s+/).filter(Boolean);
  return parts.slice(0, 2).join(" ");
}

// 3) Формируем подпись: "Книга 8:9"
function buildRef(payload) {
  const book = extractBookName(payload);
  const verse = extractVerseNumber(payload);

  if (book && verse) return `${book} ${verse}`;
  if (book) return book;

  // крайний fallback
  return (payload.footerRef || payload.title || "").trim();
}

function renderBible(payload) {
  const verseText =
    stripHtmlKeepBreaks(payload.html || "") ||
    stripHtmlKeepBreaks(payload.text || "");

  const ref = buildRef(payload);

  const html = `
<style>
  .bible-root{
    width:3840px; height:2160px;
    background: url("/bg") center center / cover no-repeat;
    color:#fff;
    font-family: Roboto, Arial, Helvetica, sans-serif;
  }
  .bible-shade{
    position:absolute; inset:0;
    background: linear-gradient(
      180deg,
      rgba(0,0,0,${BIBLE_STYLE.shadeTop}),
      rgba(0,0,0,${BIBLE_STYLE.shadeBottom})
    );
  }

  .bible-wrap{
    position:absolute; inset:0;
    padding:${BIBLE_STYLE.padding.top}px ${BIBLE_STYLE.padding.right}px ${BIBLE_STYLE.padding.bottom}px ${BIBLE_STYLE.padding.left}px;
    box-sizing:border-box;
  }

  .bible-text-window{
    position:absolute;
    left:${BIBLE_STYLE.padding.left}px;
    right:${BIBLE_STYLE.padding.right}px;
    top:${BIBLE_STYLE.padding.top}px;
    bottom:${BIBLE_STYLE.padding.bottom + BIBLE_STYLE.refReservePx}px;

    display:flex;
    align-items:center;
    justify-content:center;
    text-align:center;

    overflow:hidden;
    box-sizing:border-box;
  }

  .bible-text{
    width:100%;
    max-width:${BIBLE_STYLE.maxTextWidthPx}px;
    font-size:${BIBLE_STYLE.baseFontPx}px; /* будет уменьшаться при необходимости */
    line-height:${BIBLE_STYLE.lineHeight};
    font-weight:500;
    text-shadow:0 10px 40px rgba(0,0,0,0.65);
    white-space:pre-wrap;
  }

  .bible-ref{
    position:absolute;
    left:0; right:0;
    bottom:${BIBLE_STYLE.refBottomPx}px;
    text-align:center;
    font-size:${BIBLE_STYLE.refFontPx}px;
    font-weight:500;
    opacity:0.86;
    text-shadow:0 6px 22px rgba(0,0,0,0.65);
    padding: 0 220px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    box-sizing:border-box;
  }
</style>

<div class="bible-root" data-kind="bible"
     data-base-font="${BIBLE_STYLE.baseFontPx}"
     data-min-font="${BIBLE_STYLE.minFontPx}"
     data-step="${BIBLE_STYLE.stepPx}">
  <div class="bible-shade"></div>

  <div class="bible-wrap">
    <div class="bible-text-window" id="bibleWindow">
      <div class="bible-text" id="bibleText">${escapeHtml(verseText)}</div>
    </div>
    <div class="bible-ref">${escapeHtml(ref)}</div>
  </div>
</div>
`;
  return { kind: "bible", meta: { ref }, html };
}

module.exports = { renderBible, getBibleBgRoute };
