// rev-data.jsx — Revenue tab data + i18n

const _seedR = (s) => () => { s = (s * 9301 + 49297) % 233280; return s / 233280; };
const _series = (sd, n, base, variance, trend = 0) => {
  const r = _seedR(sd);
  return Array.from({ length: n }, (_, i) => Math.round(base * (1 + (r() - 0.5) * variance) * (1 + i * trend)));
};

const REV = {
  // SECTION 1 — Snapshot (10 small cards)
  snapshot: {
    default: {
      gross:    { value: '€42,580', delta: '+12%', sign: 'pos' },
      net:      { value: '€38,140', delta: '+11%', sign: 'pos' },
      cogs:     { value: '€8,460',  delta: '+9%',  sign: 'flat' },
      grossPr:  { value: '€29,680', delta: '+13%', sign: 'pos' },
      opex:     { value: '€15,203', delta: '+4%',  sign: 'flat' },
      ebitda:   { value: '€14,477', delta: '+18%', sign: 'pos' },
      ebMargin: { value: '34%',     delta: '+2 п.п.', sign: 'pos' },
      tax:      { value: '€2,170',  delta: '+18%', sign: 'flat' },
      net2:     { value: '€12,307', delta: '+19%', sign: 'pos' },
      cash:     { value: '€18,420', delta: '+€3,200', sign: 'pos' },
    },
    alert: {
      gross:    { value: '€36,140', delta: '+4%',  sign: 'flat' },
      net:      { value: '€32,180', delta: '+3%',  sign: 'flat' },
      cogs:     { value: '€8,940',  delta: '+15%', sign: 'neg' },
      grossPr:  { value: '€23,240', delta: '−5%',  sign: 'neg' },
      opex:     { value: '€16,860', delta: '+18%', sign: 'neg', alert: true },
      ebitda:   { value: '€6,380',  delta: '−42%', sign: 'neg', alert: true },
      ebMargin: { value: '17.6%',   delta: '−14 п.п.', sign: 'neg', alert: true },
      tax:      { value: '€960',    delta: '−42%', sign: 'flat' },
      net2:     { value: '€5,420',  delta: '−49%', sign: 'neg', alert: true },
      cash:     { value: '€11,080', delta: '−€7,340', sign: 'neg', alert: true },
    },
  },

  // SECTION 2 — Revenue mix
  // 12 weeks stacked area: lodging / spa / fnb / other
  mixSeries: {
    weeks: ['W1','W2','W3','W4','W5','W6','W7','W8','W9','W10','W11','W12'],
    lodging: [5400, 5800, 6100, 6400, 6800, 7200, 7800, 8200, 8400, 8800, 9200, 9600],
    spa:     [1200, 1300, 1400, 1500, 1700, 1850, 2000, 2150, 2300, 2400, 2550, 2700],
    fnb:     [ 900, 1000, 1050, 1100, 1180, 1240, 1320, 1400, 1480, 1560, 1620, 1720],
    other:   [ 200,  220,  240,  260,  280,  300,  320,  340,  360,  380,  400,  420],
  },
  // Top sources table
  sources: {
    default: [
      { name: 'Размещение (5 домиков)', rev: '€28,440', share: 67, mom: '+14%', sign: 'pos' },
      { name: 'СПА и процедуры',         rev: '€7,820',  share: 18, mom: '+22%', sign: 'pos' },
      { name: 'Завтраки и кейтеринг',    rev: '€4,310',  share: 10, mom: '+7%',  sign: 'pos' },
      { name: 'Сувениры и доп. услуги',  rev: '€1,210',  share: 3,  mom: '+5%',  sign: 'pos' },
      { name: 'Аренда залов и события',  rev: '€800',    share: 2,  mom: '−12%', sign: 'neg' },
    ],
    alert: [
      { name: 'Размещение (5 домиков)', rev: '€22,180', share: 61, mom: '−2%',  sign: 'neg' },
      { name: 'СПА и процедуры',         rev: '€6,940',  share: 19, mom: '+8%',  sign: 'pos' },
      { name: 'Завтраки и кейтеринг',    rev: '€4,620',  share: 13, mom: '+12%', sign: 'pos' },
      { name: 'Сувениры и доп. услуги',  rev: '€1,540',  share: 4,  mom: '+18%', sign: 'pos' },
      { name: 'Аренда залов и события',  rev: '€860',    share: 3,  mom: '−5%',  sign: 'neg' },
    ],
  },

  // SECTION 3 — Expenses P&L (groups → items)
  pl: {
    default: [
      { id: 'staff', label: 'Персонал', total: '€8,420', share: 55, items: [
        { label: 'Зарплаты', value: '€6,200', delta: '+3%' },
        { label: 'Налоги и взносы', value: '€1,420', delta: '+3%' },
        { label: 'Подрядчики (клининг)', value: '€800', delta: '+8%' },
      ]},
      { id: 'fb', label: 'Продукты и F&B', total: '€2,140', share: 14, items: [
        { label: 'Закупки продуктов', value: '€1,640', delta: '+6%' },
        { label: 'Напитки', value: '€500', delta: '+11%' },
      ]},
      { id: 'utils', label: 'Коммуналка', total: '€1,680', share: 11, items: [
        { label: 'Электричество', value: '€880', delta: '+15%' },
        { label: 'Вода и септик', value: '€420', delta: '+4%' },
        { label: 'Газ / отопление', value: '€380', delta: '−2%' },
      ]},
      { id: 'mkt', label: 'Маркетинг', total: '€1,560', share: 10, items: [
        { label: 'Реклама', value: '€1,200', delta: '+5%' },
        { label: 'Подрядчики (контент, SMM)', value: '€360', delta: '0%' },
      ]},
      { id: 'maint', label: 'Содержание объекта', total: '€820', share: 5, items: [
        { label: 'Ремонт и расходники', value: '€480', delta: '−4%' },
        { label: 'Сад и территория', value: '€340', delta: '+12%' },
      ]},
      { id: 'admin', label: 'Админ. и сервисы', total: '€583', share: 4, items: [
        { label: 'Booking.com / Airbnb комиссии', value: '€280', delta: '−18%' },
        { label: 'Подписки (PMS, бухгалтерия)', value: '€180', delta: '0%' },
        { label: 'Банк, эквайринг', value: '€123', delta: '+2%' },
      ]},
    ],
    alert: [
      { id: 'staff', label: 'Персонал', total: '€8,820', share: 52, items: [
        { label: 'Зарплаты', value: '€6,200', delta: '+3%' },
        { label: 'Налоги и взносы', value: '€1,420', delta: '+3%' },
        { label: 'Подрядчики (клининг)', value: '€1,200', delta: '+62%', alert: true },
      ]},
      { id: 'fb', label: 'Продукты и F&B', total: '€2,460', share: 15, items: [
        { label: 'Закупки продуктов', value: '€1,860', delta: '+20%' },
        { label: 'Напитки', value: '€600', delta: '+34%' },
      ]},
      { id: 'utils', label: 'Коммуналка', total: '€2,340', share: 14, items: [
        { label: 'Электричество', value: '€1,420', delta: '+62%', alert: true },
        { label: 'Вода и септик', value: '€520', delta: '+24%' },
        { label: 'Газ / отопление', value: '€400', delta: '+5%' },
      ]},
      { id: 'mkt', label: 'Маркетинг', total: '€2,180', share: 13, items: [
        { label: 'Реклама', value: '€1,820', delta: '+52%', alert: true },
        { label: 'Подрядчики (контент, SMM)', value: '€360', delta: '0%' },
      ]},
      { id: 'maint', label: 'Содержание объекта', total: '€620', share: 4, items: [
        { label: 'Ремонт и расходники', value: '€340', delta: '−29%' },
        { label: 'Сад и территория', value: '€280', delta: '−18%' },
      ]},
      { id: 'admin', label: 'Админ. и сервисы', total: '€440', share: 3, items: [
        { label: 'Booking.com / Airbnb комиссии', value: '€180', delta: '−36%' },
        { label: 'Подписки (PMS, бухгалтерия)', value: '€180', delta: '0%' },
        { label: 'Банк, эквайринг', value: '€80', delta: '−35%' },
      ]},
    ],
  },

  // SECTION 4 — Profitability 2x2 (per-cabin)
  cabins: {
    default: [
      { id: 'cyprus',    name: 'Cyprus',    occ: 82, gop: 38, rev: '€7,860', flag: 'star' },
      { id: 'bali',      name: 'Bali',      occ: 76, gop: 35, rev: '€7,120' },
      { id: 'portofino', name: 'Portofino', occ: 81, gop: 33, rev: '€7,540' },
      { id: 'latvia',    name: 'Latvia',    occ: 74, gop: 31, rev: '€6,820' },
      { id: 'maldives',  name: 'Maldives',  occ: 64, gop: 22, rev: '€5,100', flag: 'warn' },
    ],
    alert: [
      { id: 'cyprus',    name: 'Cyprus',    occ: 72, gop: 28, rev: '€6,820' },
      { id: 'bali',      name: 'Bali',      occ: 68, gop: 24, rev: '€6,140' },
      { id: 'portofino', name: 'Portofino', occ: 71, gop: 22, rev: '€6,440' },
      { id: 'latvia',    name: 'Latvia',    occ: 62, gop: 18, rev: '€5,640', flag: 'warn' },
      { id: 'maldives',  name: 'Maldives',  occ: 48, gop: 8,  rev: '€3,820', flag: 'danger' },
    ],
  },

  // SECTION 5 — Forecast (12 weeks: actual + forecast + low/high band)
  forecast: {
    weeks: ['W1','W2','W3','W4','W5','W6','W7','W8','W9','W10','W11','W12','W13','W14','W15','W16'],
    actualEnd: 12,
    actual:   [ 7800, 8400, 8900, 9400, 9800,10200,10600,11000,11200,11400,11600,11800, null,null,null,null ],
    forecast: [ null, null, null, null, null, null, null, null, null, null, null,11800,12100,12500,13000,13600 ],
    low:      [ null, null, null, null, null, null, null, null, null, null, null,11800,11500,11200,11000,10800 ],
    high:     [ null, null, null, null, null, null, null, null, null, null, null,11800,12700,13600,14600,15800 ],
  },
};

// ---------- Help texts for Revenue tab metrics ----------
const REV_HELP = {
  ru: {
    // Snapshot
    gross:    { title: 'Валовая выручка',  body: 'Сумма всех начислений по всем потокам (размещение, СПА, F&B, доп.услуги) до вычетов. Включает НДС и скидки.' },
    net:      { title: 'Чистая выручка',    body: 'Валовая выручка минус НДС, скидки и возвраты. Это та сумма, которую мы реально заработали.' },
    cogs:     { title: 'COGS',               body: 'Cost of Goods Sold — переменные расходы, прямо связанные с обслуживанием гостя: продукты, расходники СПА, прачечная, комиссии OTA.' },
    grossPr:  { title: 'Валовая прибыль',    body: 'Net revenue − COGS. Сколько остаётся после прямых переменных расходов на гостя — до операционных затрат.' },
    opex:     { title: 'OPEX',               body: 'Operating expenses — постоянные операционные расходы: зарплаты, коммуналка, маркетинг, обслуживание объекта, админ.' },
    ebitda:   { title: 'EBITDA',             body: 'Earnings Before Interest, Taxes, Depreciation & Amortization = Gross profit − OPEX. Главный показатель операционной эффективности.' },
    ebMargin: { title: 'EBITDA маржа',       body: 'EBITDA ÷ Net revenue. Сколько копеек с каждого евро остаётся после операционных затрат. Цель для гостиничного бизнеса 25–35%.' },
    tax:      { title: 'Налоги',             body: 'Расчётный налог на прибыль (упрощённая ставка 15% от EBITDA). Точная сумма зависит от вашей юрисдикции и формы собственности.' },
    net2:     { title: 'Чистая прибыль',     body: 'EBITDA − Налоги − Амортизация − Проценты. Деньги, которые остаются собственнику.' },
    cash:     { title: 'Cash on hand',       body: 'Денежные средства на счетах и в кассе. Учитывает также авансы от гостей за будущие брони.' },
    // Mix
    mixWeeks: { title: 'Динамика по неделям', body: 'Стэк-чарт показывает, как менялась выручка по 4 потокам за последние 12 недель. Помогает увидеть сезонность и сдвиги в структуре.' },
    mixDonut: { title: 'Доли выручки',       body: 'Какую часть от общей выручки даёт каждый поток. Здоровый микс: размещение 60–70%, остальное — доп. услуги.' },
    sources:  { title: 'Источники выручки',  body: 'Все потоки выручки за месяц. Δ MoM — изменение к прошлому месяцу. Помогает быстро увидеть, какие направления растут, а какие проседают.' },
    // Expenses
    plTitle:  { title: 'P&L по группам',     body: 'Все операционные расходы сгруппированы. Кликните по группе, чтобы развернуть список конкретных статей.' },
    plDonut:  { title: 'Структура расходов', body: 'Доля каждой группы в общих OPEX. Помогает увидеть, на чём можно сэкономить.' },
    // Profit 2x2
    matrix:   { title: 'GOP × Загрузка',     body: 'Каждая точка — один из 5 домиков. Идеально: правый верхний квадрант (высокая загрузка + высокая маржа). Левый нижний — проблема.' },
    // Forecast
    fcTitle:  { title: 'Прогноз выручки',    body: 'Чёрная линия — факт, синий пунктир — базовый прогноз на 4 недели вперёд, светло-синяя зона — Low/High сценарии (±20%).' },
    whatif:   { title: 'What-if калькулятор', body: 'Подвигайте слайдеры, чтобы увидеть, как цена за ночь, загрузка и доп.услуги влияют на месячный GOP. OPEX считается фиксированным.' },
  },
  en: {
    gross:    { title: 'Gross revenue',  body: 'All booked revenue across streams (lodging, SPA, F&B, add-ons) before deductions. Includes VAT and discounts.' },
    net:      { title: 'Net revenue',    body: 'Gross revenue minus VAT, discounts and refunds. The amount we actually earned.' },
    cogs:     { title: 'COGS',           body: 'Cost of Goods Sold — variable costs tied directly to serving a guest: F&B supplies, SPA consumables, laundry, OTA commissions.' },
    grossPr:  { title: 'Gross profit',   body: 'Net revenue − COGS. What remains after direct per-guest costs, before operating expenses.' },
    opex:     { title: 'OPEX',           body: 'Operating expenses — fixed costs: salaries, utilities, marketing, property maintenance, admin.' },
    ebitda:   { title: 'EBITDA',         body: 'Earnings Before Interest, Taxes, Depreciation & Amortization = Gross profit − OPEX. The core operating-efficiency metric.' },
    ebMargin: { title: 'EBITDA margin',  body: 'EBITDA ÷ Net revenue. Cents on each euro after operating costs. Target for hospitality: 25–35%.' },
    tax:      { title: 'Tax',            body: 'Estimated profit tax (simplified 15% on EBITDA). Exact rate depends on your jurisdiction and entity type.' },
    net2:     { title: 'Net profit',     body: 'EBITDA − Tax − D&A − Interest. The cash that ends up with the owner.' },
    cash:     { title: 'Cash on hand',   body: 'Cash in bank and till. Includes prepayments from guests for upcoming bookings.' },
    mixWeeks: { title: 'Weekly trend',   body: 'Stacked chart of revenue across 4 streams over the last 12 weeks. Reveals seasonality and shifts in mix.' },
    mixDonut: { title: 'Revenue shares', body: 'Each stream\'s share of total revenue. Healthy mix: lodging 60–70%, rest from ancillary services.' },
    sources:  { title: 'Revenue sources', body: 'All revenue streams for the month. Δ MoM — change vs last month. Quickly highlights what\'s growing or shrinking.' },
    plTitle:  { title: 'P&L by group',   body: 'All OPEX grouped by category. Click a group to expand individual line items.' },
    plDonut:  { title: 'Expense breakdown', body: 'Each group\'s share of total OPEX. Highlights where savings are possible.' },
    matrix:   { title: 'GOP × Occupancy', body: 'Each dot is one of the 5 cabins. Goal: top-right quadrant (high occupancy + high margin). Bottom-left = problem.' },
    fcTitle:  { title: 'Revenue forecast', body: 'Black line — actual; blue dashed — base forecast 4 weeks ahead; light-blue band — Low/High scenarios (±20%).' },
    whatif:   { title: 'What-if calculator', body: 'Drag the sliders to see how nightly price, occupancy and add-ons affect monthly GOP. OPEX is held fixed.' },
  },
};

window.REV = REV;
window.REV_HELP = REV_HELP;
