// mkt-data.jsx — Marketing tab data + i18n + help

const MKT = {
  // SECTION 1 — Snapshot (10 cards). Default + alert variants.
  snapshot: {
    default: {
      spend:   { value: '€4,820',  delta: '+8%',     sign: 'flat', sub: 'G €2,100 · M €1,800 · TT €920' },
      impr:    { value: '1.31M',   delta: '+12%',    sign: 'pos',  sub: 'across 3 channels' },
      clicks:  { value: '18,400',  delta: '+15%',    sign: 'pos',  sub: 'CTR 1.4%' },
      cpc:     { value: '€0.26',   delta: '−€0.02',  sign: 'pos',  sub: 'weighted avg' },
      freq:    { value: '4.8',     delta: '+0.3',    sign: 'flat', sub: 'avg per user' },
      attrRev: { value: '€42,300', delta: '+14%',    sign: 'pos',  sub: 'Time-decay model' },
      conv:    { value: '71',      delta: '+9',      sign: 'pos',  sub: 'bookings + leads' },
      cr:      { value: '0.39%',   delta: '+0.05%',  sign: 'pos',  sub: 'click → booking' },
      cac:     { value: '€68',     delta: '+€12',    sign: 'neg',  sub: 'cost per new guest' },
      roas:    { value: '8.8x',    delta: '−0.6x',   sign: 'flat', sub: 'MER metric', attr: true },
    },
    alert: {
      spend:   { value: '€6,210',  delta: '+29%',    sign: 'neg',  sub: 'G €2,800 · M €2,400 · TT €1,010', alert: true },
      impr:    { value: '1.46M',   delta: '+11%',    sign: 'pos',  sub: 'across 3 channels' },
      clicks:  { value: '17,520',  delta: '−5%',     sign: 'neg',  sub: 'CTR 1.2%' },
      cpc:     { value: '€0.35',   delta: '+€0.07',  sign: 'neg',  sub: 'weighted avg', alert: true },
      freq:    { value: '6.2',     delta: '+1.4',    sign: 'neg',  sub: 'avg per user' },
      attrRev: { value: '€36,140', delta: '−5%',     sign: 'neg',  sub: 'Time-decay model' },
      conv:    { value: '71',      delta: '0',       sign: 'flat', sub: 'bookings + leads' },
      cr:      { value: '0.41%',   delta: '+0.02%',  sign: 'pos',  sub: 'click → booking' },
      cac:     { value: '€88',     delta: '+€32 (+57%)', sign: 'neg', sub: 'cost per new guest', alert: true },
      roas:    { value: '5.8x',    delta: '−3.0x',   sign: 'neg',  sub: 'MER metric', attr: true, alert: true },
    },
  },

  // SECTION 2 — Channel performance
  channels: {
    default: [
      { id: 'google', name: 'Google Ads', icon: 'G', color: '#4285F4',
        spend: '€2,100', impr: '720K', clicks: '11,200', ctr: '1.6%', cpc: '€0.19',
        conv: 38, cr: '0.34%', cac: '€55', rev: '€21,996', roas: '10.5x', spark: [9.8, 10.2, 10.4, 10.6, 10.8, 10.5, 10.7] },
      { id: 'meta', name: 'Meta Ads', icon: 'M', color: '#1877F2',
        spend: '€1,800', impr: '480K', clicks: '5,800', ctr: '1.2%', cpc: '€0.31',
        conv: 24, cr: '0.41%', cac: '€75', rev: '€16,074', roas: '8.9x', spark: [8.4, 8.6, 9.0, 8.8, 9.1, 8.9, 8.9] },
      { id: 'tiktok', name: 'TikTok Ads', icon: 'TT', color: '#000000',
        spend: '€920', impr: '110K', clicks: '1,400', ctr: '1.3%', cpc: '€0.66',
        conv: 9, cr: '0.64%', cac: '€102', rev: '€4,230', roas: '4.6x', spark: [5.1, 4.9, 4.7, 4.8, 4.6, 4.5, 4.6] },
    ],
    alert: [
      { id: 'google', name: 'Google Ads', icon: 'G', color: '#4285F4',
        spend: '€2,800', impr: '820K', clicks: '11,800', ctr: '1.4%', cpc: '€0.24',
        conv: 36, cr: '0.31%', cac: '€78', rev: '€20,160', roas: '7.2x', spark: [10.4, 9.8, 9.2, 8.6, 8.0, 7.5, 7.2] },
      { id: 'meta', name: 'Meta Ads', icon: 'M', color: '#1877F2',
        spend: '€2,400', impr: '510K', clicks: '4,920', ctr: '1.0%', cpc: '€0.49',
        conv: 28, cr: '0.57%', cac: '€86', rev: '€14,120', roas: '5.9x', spark: [9.0, 8.4, 7.8, 7.1, 6.5, 6.1, 5.9], alert: true },
      { id: 'tiktok', name: 'TikTok Ads', icon: 'TT', color: '#000000',
        spend: '€1,010', impr: '130K', clicks: '800', ctr: '0.6%', cpc: '€1.26',
        conv: 7, cr: '0.88%', cac: '€144', rev: '€1,860', roas: '1.8x', spark: [4.6, 4.0, 3.4, 2.8, 2.4, 2.0, 1.8], alert: true },
    ],
  },

  // Distribution % (spend vs revenue) — derived but cached
  distribution: {
    default: {
      spend: [{ id: 'google', pct: 44 }, { id: 'meta', pct: 37 }, { id: 'tiktok', pct: 19 }],
      rev:   [{ id: 'google', pct: 52 }, { id: 'meta', pct: 38 }, { id: 'tiktok', pct: 10 }],
      note: 'TikTok: 19% spend → 10% revenue',
    },
    alert: {
      spend: [{ id: 'google', pct: 45 }, { id: 'meta', pct: 39 }, { id: 'tiktok', pct: 16 }],
      rev:   [{ id: 'google', pct: 56 }, { id: 'meta', pct: 39 }, { id: 'tiktok', pct: 5  }],
      note: 'TikTok: 16% spend → 5% revenue',
    },
  },

  // SECTION 3 — Funnel
  funnel: {
    default: [
      { stage: 'Impressions',         value: 1315000, drop: null,                      anom: false },
      { stage: 'Clicks',              value: 18400,   drop: '1.4% CTR',                anom: false },
      { stage: 'Sessions',            value: 14350,   drop: '78% engaged',             anom: false },
      { stage: 'Booking page views',  value: 1720,    drop: '12% reached booking',     anom: false },
      { stage: 'Checkout started',    value: 155,     drop: '9% started checkout',     anom: false },
      { stage: 'Bookings completed',  value: 62,      drop: '40% completed',           anom: false },
    ],
    alert: [
      { stage: 'Impressions',         value: 1460000, drop: null,                      anom: false },
      { stage: 'Clicks',              value: 17520,   drop: '1.2% CTR',                anom: false },
      { stage: 'Sessions',            value: 13680,   drop: '78% engaged',             anom: false },
      { stage: 'Booking page views',  value: 1640,    drop: '12% reached booking',     anom: false },
      { stage: 'Checkout started',    value: 98,      drop: '6.0% started ⚠',          anom: true  },
      { stage: 'Bookings completed',  value: 47,      drop: '48% completed',           anom: false },
    ],
  },
  funnelByChannel: {
    default: {
      google: [720000, 11200, 8960, 1280, 105, 38],
      meta:   [480000, 5800, 4350, 380, 42, 24],
      tiktok: [110000, 1400, 1040, 60, 8, 9],
    },
    alert: {
      google: [820000, 11800, 9200, 1240, 68, 36],
      meta:   [510000, 4920, 3690, 340, 24, 28],
      tiktok: [130000, 800,  790, 60, 6, 7],
    },
  },

  // SECTION 4 — Campaigns
  campaigns: {
    default: [
      { name: 'Brand · Search', ch: 'google', status: 'active', spend: 480, impr: 38000, clicks: 4200, ctr: 11.0, conv: 18, cr: 0.43, cac: 27, roas: 24.5, trend: 'up', delta: '+18%' },
      { name: 'Performance Max — All', ch: 'google', status: 'active', spend: 720, impr: 320000, clicks: 4800, ctr: 1.5, conv: 12, cr: 0.25, cac: 60, roas: 9.8, trend: 'up', delta: '+9%' },
      { name: 'Generic SPA — Search', ch: 'google', status: 'active', spend: 540, impr: 180000, clicks: 1620, ctr: 0.9, conv: 5, cr: 0.31, cac: 108, roas: 4.8, trend: 'flat', delta: '−2%' },
      { name: 'Retargeting — Site visitors', ch: 'meta', status: 'active', spend: 460, impr: 110000, clicks: 1840, ctr: 1.7, conv: 11, cr: 0.60, cac: 42, roas: 14.2, trend: 'up', delta: '+22%' },
      { name: 'Lookalike 1% — Bookers', ch: 'meta', status: 'active', spend: 620, impr: 240000, clicks: 2680, ctr: 1.1, conv: 8, cr: 0.30, cac: 78, roas: 7.4, trend: 'up', delta: '+6%' },
      { name: 'Cold — SPA video', ch: 'meta', status: 'active', spend: 540, impr: 130000, clicks: 1280, ctr: 1.0, conv: 5, cr: 0.39, cac: 108, roas: 4.6, trend: 'flat', delta: '−1%' },
      { name: 'Reels — UGC creators', ch: 'meta', status: 'paused', spend: 180, impr: 38000, clicks: 200, ctr: 0.5, conv: 0, cr: 0.00, cac: null, roas: 0.0, trend: 'down', delta: '−100%', warn: true },
      { name: 'Spark Ads — winter', ch: 'tiktok', status: 'active', spend: 520, impr: 64000, clicks: 880, ctr: 1.4, conv: 6, cr: 0.68, cac: 87, roas: 5.4, trend: 'flat', delta: '+3%' },
      { name: 'Cabin tour — TopView', ch: 'tiktok', status: 'active', spend: 400, impr: 46000, clicks: 520, ctr: 1.1, conv: 3, cr: 0.58, cac: 133, roas: 3.5, trend: 'down', delta: '−14%' },
      { name: 'Couple retreat — Search', ch: 'google', status: 'active', spend: 360, impr: 82000, clicks: 580, ctr: 0.7, conv: 3, cr: 0.52, cac: 120, roas: 4.1, trend: 'flat', delta: '−4%' },
      { name: 'Wellness keywords', ch: 'google', status: 'paused', spend: 0, impr: 0, clicks: 0, ctr: 0, conv: 0, cr: 0, cac: null, roas: 0, trend: 'flat', delta: '0%' },
    ],
    alert: null, // re-uses default; alert variants computed as needed
  },
  movers: {
    default: {
      best: [
        { name: 'Retargeting — Site visitors', ch: 'meta', metric: 'ROAS', delta: '+5.8x → 14.2x', sign: 'pos' },
        { name: 'Brand · Search',               ch: 'google', metric: 'Conv', delta: '+6 → 18', sign: 'pos' },
        { name: 'Performance Max — All',        ch: 'google', metric: 'ROAS', delta: '+1.4x → 9.8x', sign: 'pos' },
      ],
      worst: [
        { name: 'Reels — UGC creators',  ch: 'meta', metric: 'ROAS', delta: '−6.2x → 0.0x', sign: 'neg' },
        { name: 'Cabin tour — TopView',  ch: 'tiktok', metric: 'ROAS', delta: '−1.8x → 3.5x', sign: 'neg' },
        { name: 'Generic SPA — Search',  ch: 'google', metric: 'CR',   delta: '−0.12% → 0.31%', sign: 'neg' },
      ],
    },
    alert: {
      best: [
        { name: 'Retargeting — Site visitors', ch: 'meta', metric: 'ROAS', delta: '+2.4x → 9.8x', sign: 'pos' },
        { name: 'Brand · Search',               ch: 'google', metric: 'Conv', delta: '+2 → 14', sign: 'pos' },
        { name: 'Couple retreat — Search',      ch: 'google', metric: 'CR',   delta: '+0.1% → 0.6%', sign: 'pos' },
      ],
      worst: [
        { name: 'Cabin tour — TopView',   ch: 'tiktok', metric: 'ROAS', delta: '−4.2x → 1.2x',  sign: 'neg' },
        { name: 'Cold — SPA video',       ch: 'meta',   metric: 'ROAS', delta: '−3.6x → 2.4x',  sign: 'neg' },
        { name: 'Performance Max — All',  ch: 'google', metric: 'CAC',  delta: '+€38 → €112',   sign: 'neg' },
      ],
    },
  },

  // SECTION 5 — Audiences / Creatives / Keywords
  audiences: {
    default: [
      { name: 'Site visitors 30d (RTG)',         ch: 'meta',   spend: '€460', impr: '110K', ctr: '1.7%', conv: 11, cr: '0.60%', roas: '14.2x' },
      { name: 'Brand searchers',                  ch: 'google', spend: '€480', impr: '38K',  ctr: '11.0%', conv: 18, cr: '0.43%', roas: '24.5x' },
      { name: 'Lookalike 1% — Bookers',           ch: 'meta',   spend: '€620', impr: '240K', ctr: '1.1%', conv: 8,  cr: '0.30%', roas: '7.4x' },
      { name: 'In-market: travel · weekend',      ch: 'google', spend: '€280', impr: '92K',  ctr: '0.9%', conv: 4,  cr: '0.48%', roas: '6.8x' },
      { name: 'Affinity: spa & wellness',         ch: 'google', spend: '€220', impr: '74K',  ctr: '0.7%', conv: 3,  cr: '0.58%', roas: '5.9x' },
      { name: 'Custom audience: NL email list',   ch: 'meta',   spend: '€140', impr: '24K',  ctr: '2.4%', conv: 4,  cr: '0.69%', roas: '11.1x' },
      { name: 'Hashtag: #countryhotel',           ch: 'tiktok', spend: '€320', impr: '42K',  ctr: '1.5%', conv: 4,  cr: '0.63%', roas: '6.1x' },
      { name: 'Interest: design hotels',          ch: 'tiktok', spend: '€200', impr: '22K',  ctr: '1.0%', conv: 2,  cr: '0.91%', roas: '4.0x' },
      { name: 'Cold — broad couples',             ch: 'meta',   spend: '€180', impr: '60K',  ctr: '0.8%', conv: 2,  cr: '0.42%', roas: '3.6x' },
      { name: 'Search: weekend getaway',          ch: 'google', spend: '€110', impr: '28K',  ctr: '0.6%', conv: 1,  cr: '0.59%', roas: '3.2x' },
    ],
  },

  creatives: {
    default: [
      { id: 1, title: 'Cabin sunset · 30s', camp: 'Cold — SPA video', ch: 'meta',   ctr: '1.6%', roas: '11.4x', spend: '€220', days: 18, color: '#FCA5A5' },
      { id: 2, title: 'Couple retreat · 15s', camp: 'Lookalike 1%',    ch: 'meta',   ctr: '1.4%', roas: '9.8x',  spend: '€280', days: 24, color: '#A7F3D0' },
      { id: 3, title: 'SPA hands · UGC',     camp: 'Spark Ads — winter', ch: 'tiktok', ctr: '1.8%', roas: '7.6x',  spend: '€180', days: 12, color: '#FDE68A' },
      { id: 4, title: 'Brand · text ad',     camp: 'Brand · Search',   ch: 'google', ctr: '11.0%', roas: '24.5x', spend: '€480', days: 30, color: '#BFDBFE' },
      { id: 5, title: 'Cabin tour · 45s',    camp: 'Cabin tour — TopView', ch: 'tiktok', ctr: '1.1%', roas: '3.5x', spend: '€400', days: 16, color: '#C7D2FE' },
      { id: 6, title: 'Wellness · carousel', camp: 'Cold — SPA video', ch: 'meta',   ctr: '0.9%', roas: '4.2x',  spend: '€180', days: 22, color: '#FBCFE8' },
      { id: 7, title: 'PMax · auto-asset',   camp: 'Performance Max',  ch: 'google', ctr: '1.5%', roas: '9.8x',  spend: '€720', days: 30, color: '#FED7AA' },
      { id: 8, title: 'Retargeting · banner', camp: 'Retargeting — Site visitors', ch: 'meta', ctr: '1.7%', roas: '14.2x', spend: '€460', days: 28, color: '#BAE6FD' },
    ],
  },

  keywords: {
    default: [
      { kw: 'seovillage',                  src: 'paid',    impr: '12,400', clicks: '3,800', ctr: '30.6%', pos: null, cost: '€120', conv: 14, val: '24.5x', both: true },
      { kw: 'seovillage',                  src: 'organic', impr: '9,200',  clicks: '2,100', ctr: '22.8%', pos: '1.2', cost: null, conv: 11, val: '€8,400', both: true },
      { kw: 'spa hotel weekend',           src: 'paid',    impr: '38,000', clicks: '420',   ctr: '1.1%',  pos: null, cost: '€86',  conv: 4,  val: '5.4x', both: false },
      { kw: 'design cabin weekend',        src: 'organic', impr: '4,800',  clicks: '380',   ctr: '7.9%',  pos: '3.4', cost: null, conv: 5,  val: '€3,800', both: false },
      { kw: 'countryside spa retreat',     src: 'organic', impr: '3,200',  clicks: '210',   ctr: '6.6%',  pos: '4.1', cost: null, conv: 3,  val: '€2,460', both: false },
      { kw: 'wellness weekend europe',     src: 'paid',    impr: '24,000', clicks: '180',   ctr: '0.8%',  pos: null, cost: '€78',  conv: 2,  val: '4.1x', both: false },
      { kw: 'romantic getaway cabin',      src: 'paid',    impr: '18,000', clicks: '160',   ctr: '0.9%',  pos: null, cost: '€62',  conv: 2,  val: '3.9x', both: true },
      { kw: 'romantic getaway cabin',      src: 'organic', impr: '2,200',  clicks: '140',   ctr: '6.4%',  pos: '5.8', cost: null, conv: 1,  val: '€820', both: true },
      { kw: 'spa near tallinn',            src: 'organic', impr: '1,800',  clicks: '120',   ctr: '6.7%',  pos: '2.9', cost: null, conv: 2,  val: '€1,540', both: false },
      { kw: 'sauna cabin weekend',         src: 'paid',    impr: '8,400',  clicks: '78',    ctr: '0.9%',  pos: null, cost: '€42',  conv: 1,  val: '3.2x', both: false },
    ],
  },

  // SECTION 6 — Attribution + Sankey + Assists + TTC
  attribution: {
    default: {
      models: ['last', 'first', 'linear', 'time', 'data'],
      rows: [
        { ch: 'google', label: 'Google Ads', vals: [42, 28, 36, 38, 39] },
        { ch: 'meta',   label: 'Meta Ads',   vals: [18, 24, 22, 24, 23] },
        { ch: 'tiktok', label: 'TikTok Ads', vals: [4,  14, 8,  9,  9] },
        { ch: 'organic',label: 'Organic',    vals: [7,  5,  7,  6,  6] },
      ],
      totals: [71, 71, 71, 71, 71],
    },
  },

  // Customer journey paths (Sankey-friendly)
  journeys: {
    default: [
      { path: ['Google'],                     count: 22 },
      { path: ['Meta', 'Google'],             count: 14 },
      { path: ['Organic', 'Google'],          count: 9  },
      { path: ['TikTok', 'Meta', 'Google'],   count: 7  },
      { path: ['Meta'],                       count: 6  },
      { path: ['TikTok', 'Google'],           count: 5  },
      { path: ['Organic', 'Meta', 'Google'],  count: 4  },
      { path: ['Direct'],                     count: 4  },
    ],
  },

  // Assisted vs last-click
  assists: {
    default: [
      { ch: 'google', label: 'Google Ads', last: 42, assist: 18, color: '#4285F4' },
      { ch: 'meta',   label: 'Meta Ads',   last: 18, assist: 28, color: '#1877F2' },
      { ch: 'tiktok', label: 'TikTok Ads', last: 4,  assist: 22, color: '#000000' },
      { ch: 'organic',label: 'Organic',    last: 7,  assist: 11, color: '#16A34A' },
    ],
    interpretation: {
      ru: 'TikTok работает как канал верхней воронки: создаёт интерес, а закрывает Google.',
      en: 'TikTok plays an upper-funnel role: it creates interest while Google closes the deal.',
    },
  },

  // Time to conversion histogram
  ttc: {
    default: [
      { bin: '0 days',    pct: 18 },
      { bin: '1–3 days',  pct: 32 },
      { bin: '4–7 days',  pct: 22 },
      { bin: '8–14 days', pct: 16 },
      { bin: '15–30 days',pct: 8  },
      { bin: '30+ days',  pct: 4  },
    ],
    median: '80% book within 14 days',
  },
};

const MKT_T = {
  ru: {
    sec1: 'Snapshot', sec1sub: '10 ключевых метрик за 30 дней',
    sec2: 'Каналы', sec2sub: 'Сколько вкладываем и что получаем',
    sec3: 'Воронка', sec3sub: 'От показа до брони',
    sec4: 'Кампании', sec4sub: 'Все активные и недавние',
    sec5: 'Аудитории и креативы', sec5sub: 'Что цепляет и кто покупает',
    sec6: 'Атрибуция и путь гостя', sec6sub: 'Как работают каналы вместе',
    attr: 'Атрибуция',
    attrModels: { last: 'Last-click', first: 'First-click', linear: 'Linear', time: 'Time-decay', data: 'Data-driven' },
    snap: {
      spend: 'Total spend', impr: 'Impressions', clicks: 'Clicks', cpc: 'CPC avg', freq: 'Frequency',
      attrRev: 'Attributed revenue', conv: 'Conversions', cr: 'Conversion rate', cac: 'CAC', roas: 'Blended ROAS',
    },
    chTable: 'Производительность каналов',
    chCols: { ch: 'Канал', spend: 'Spend', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', cpc: 'CPC', conv: 'Conv.', cr: 'CR', cac: 'CAC', rev: 'Revenue', roas: 'ROAS', trend: 'Тренд' },
    chTotal: 'Итого',
    distTitle: 'Куда уходит спенд vs откуда приходит выручка',
    dist: { spend: 'Структура спенда', rev: 'Структура выручки' },
    scatterTitle: 'Карта эффективности каналов',
    scatterHint: 'Размер пузыря = объём показов',
    funnelTitle: 'Воронка конверсий',
    funnelByCh: 'Воронка по каналам',
    fStages: ['Показы', 'Клики', 'Сессии', 'Просмотр брони', 'Начат checkout', 'Бронирование'],
    campTitle: 'Кампании по всем каналам',
    campCols: { name: 'Кампания', ch: 'Канал', status: 'Статус', spend: 'Spend', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', conv: 'Conv.', cr: 'CR', cac: 'CAC', roas: 'ROAS', trend: 'Тренд', delta: 'Δ' },
    chips: { all: 'Все каналы', active: 'Активные', paused: 'Паузе' },
    showAll: 'Показать все ({n})',
    bubbleTitle: 'Карта эффективности кампаний',
    moversTitle: 'Топ изменений vs прошлый период',
    moversBest: 'Лучшие',
    moversWorst: 'Худшие',
    audTitle: 'Топ аудитории',
    audCols: { name: 'Аудитория', ch: 'Канал', spend: 'Spend', impr: 'Impr.', ctr: 'CTR', conv: 'Conv.', cr: 'CR', roas: 'ROAS' },
    creaTitle: 'Топ креативы',
    kwTitle: 'Топ запросы (платные + органика)',
    kwCols: { kw: 'Запрос', src: 'Источник', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', pos: 'Pos.', cost: 'Cost', conv: 'Conv.', val: 'ROAS / value' },
    kwChips: { all: 'Все', paid: 'Только платные', organic: 'Только SEO' },
    paid: 'Paid', seo: 'SEO', both: 'Both',
    attrTitle: 'Как считаются конверсии в разных моделях',
    journeyTitle: 'Топ путей гостей',
    assistTitle: 'Роль каналов в конверсиях',
    assistLast: 'Last-click', assistAssist: 'Assist',
    ttcTitle: 'Время от первого касания до брони',
    status: { active: 'Активна', paused: 'На паузе' },
    days: 'д.',
    runFor: 'крутится {n} дн.',
    emptyCreative: 'Нет данных по креативам. Подключите API рекламных кабинетов в настройках.',
    emptySankey: 'Нужно ≥ 50 multi-touch путей. Расширьте период.',
    emptyAud: 'В выбранном периоде не было кампаний.',
  },
  en: {
    sec1: 'Snapshot', sec1sub: '10 key metrics for the last 30 days',
    sec2: 'Channels', sec2sub: 'What we spend and what comes back',
    sec3: 'Funnel', sec3sub: 'From impression to booking',
    sec4: 'Campaigns', sec4sub: 'All active and recent',
    sec5: 'Audiences & creatives', sec5sub: 'What clicks and who buys',
    sec6: 'Attribution & journey', sec6sub: 'How channels work together',
    attr: 'Attribution',
    attrModels: { last: 'Last-click', first: 'First-click', linear: 'Linear', time: 'Time-decay', data: 'Data-driven' },
    snap: {
      spend: 'Total spend', impr: 'Impressions', clicks: 'Clicks', cpc: 'CPC avg', freq: 'Frequency',
      attrRev: 'Attributed revenue', conv: 'Conversions', cr: 'Conversion rate', cac: 'CAC', roas: 'Blended ROAS',
    },
    chTable: 'Channel performance',
    chCols: { ch: 'Channel', spend: 'Spend', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', cpc: 'CPC', conv: 'Conv.', cr: 'CR', cac: 'CAC', rev: 'Revenue', roas: 'ROAS', trend: 'Trend' },
    chTotal: 'Total',
    distTitle: 'Where money goes vs where revenue comes from',
    dist: { spend: 'Spend distribution', rev: 'Revenue distribution' },
    scatterTitle: 'Channel efficiency map',
    scatterHint: 'Bubble size = impression volume',
    funnelTitle: 'Conversion funnel',
    funnelByCh: 'Funnel by channel',
    fStages: ['Impressions', 'Clicks', 'Sessions', 'Booking page', 'Checkout', 'Bookings'],
    campTitle: 'Campaigns across all channels',
    campCols: { name: 'Campaign', ch: 'Channel', status: 'Status', spend: 'Spend', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', conv: 'Conv.', cr: 'CR', cac: 'CAC', roas: 'ROAS', trend: 'Trend', delta: 'Δ' },
    chips: { all: 'All channels', active: 'Active', paused: 'Paused' },
    showAll: 'Show all ({n})',
    bubbleTitle: 'Campaign efficiency map',
    moversTitle: 'Biggest changes vs prev. period',
    moversBest: 'Best',
    moversWorst: 'Worst',
    audTitle: 'Top audiences',
    audCols: { name: 'Audience', ch: 'Channel', spend: 'Spend', impr: 'Impr.', ctr: 'CTR', conv: 'Conv.', cr: 'CR', roas: 'ROAS' },
    creaTitle: 'Top creatives',
    kwTitle: 'Top keywords (paid + organic)',
    kwCols: { kw: 'Keyword', src: 'Source', impr: 'Impr.', clicks: 'Clicks', ctr: 'CTR', pos: 'Pos.', cost: 'Cost', conv: 'Conv.', val: 'ROAS / value' },
    kwChips: { all: 'All', paid: 'Paid only', organic: 'Organic only' },
    paid: 'Paid', seo: 'SEO', both: 'Both',
    attrTitle: 'How conversions are credited across models',
    journeyTitle: 'Top customer journey paths',
    assistTitle: 'Channel role in conversions',
    assistLast: 'Last-click', assistAssist: 'Assist',
    ttcTitle: 'Time from first touch to booking',
    status: { active: 'Active', paused: 'Paused' },
    days: 'd',
    runFor: 'running for {n}d',
    emptyCreative: 'No creative data. Connect ad-account APIs in settings.',
    emptySankey: 'Sankey requires ≥ 50 multi-touch journeys. Try expanding period.',
    emptyAud: 'No campaigns ran in the selected period.',
  },
};

const MKT_HELP = {
  ru: {
    spend:   { title: 'Total spend',      body: 'Сумма всех платных трат на рекламу за период (Google + Meta + TikTok). Без зарплат маркетолога и подрядчиков.' },
    impr:    { title: 'Impressions',      body: 'Сколько раз пользователи увидели рекламу. Один человек может увидеть много раз — это ≠ охват.' },
    clicks:  { title: 'Clicks',           body: 'Сколько раз кликнули по рекламе. Деление кликов на показы даёт CTR.' },
    cpc:     { title: 'CPC avg',          body: 'Средняя цена клика, взвешенная по тратам. Ниже — лучше.' },
    freq:    { title: 'Frequency',        body: 'Среднее количество показов на одного пользователя. > 6 обычно сигнал об усталости аудитории.' },
    attrRev: { title: 'Attributed revenue', body: 'Выручка, которую модель атрибуции присваивает рекламе. Зависит от выбранной модели в шапке.' },
    conv:    { title: 'Conversions',      body: 'Сколько целевых действий (бронь / заявка) случилось в выбранной модели атрибуции.' },
    cr:      { title: 'Conversion rate',  body: 'Conversions ÷ Clicks. Доля кликнувших, которые в итоге забронировали.' },
    cac:     { title: 'CAC',              body: 'Customer Acquisition Cost = Spend ÷ новые гости. Растёт — плохой сигнал.' },
    roas:    { title: 'Blended ROAS',     body: 'Return on Ad Spend = Attributed revenue ÷ Spend. Зависит от модели атрибуции, выбранной в шапке.' },
    attrSelect: { title: 'Модель атрибуции', body: 'Как засчитываются конверсии при нескольких касаниях гостя. Влияет на conversions, attributed revenue, ROAS, CAC. Не влияет на spend, impressions, clicks.' },
    chTable: { title: 'Производительность каналов', body: 'Для чего: сравнить Google, Meta и TikTok в одной таблице. Как работает: по каждому каналу показывает spend, клики, конверсии, CAC, выручку и ROAS за период.' },
    dist: { title: 'Spend vs revenue mix', body: 'Для чего: понять, не уходит ли бюджет туда, где мало выручки. Как работает: сравнивает долю канала в расходах и долю канала в атрибутированной выручке.' },
    scatter: { title: 'Карта эффективности каналов', body: 'Для чего: быстро увидеть, какой канал дорогой, а какой окупается. Как работает: X — CAC, Y — ROAS, размер пузыря — показы; лучше выше и левее.' },
    funnel: { title: 'Воронка конверсий', body: 'Для чего: найти этап, где теряются пользователи. Как работает: показывает путь от показов до завершенной брони и конверсию между шагами.' },
    funnelByCh: { title: 'Воронка по каналам', body: 'Для чего: сравнить качество трафика между каналами. Как работает: строит ту же воронку отдельно для Google, Meta и TikTok.' },
    campaigns: { title: 'Кампании', body: 'Для чего: управлять активными и недавними кампаниями на уровне бюджета и результата. Как работает: таблица показывает spend, клики, CTR, конверсии, CAC, ROAS и тренд.' },
    campaignBubbles: { title: 'Карта кампаний', body: 'Для чего: найти кампании, где бюджет не соответствует отдаче. Как работает: X — spend, Y — ROAS, размер точки — количество конверсий.' },
    movers: { title: 'Топ изменений', body: 'Для чего: быстро увидеть, что сильнее всего улучшилось или ухудшилось. Как работает: сравнивает кампании с прошлым периодом по ключевым метрикам.' },
    audiences: { title: 'Топ аудитории', body: 'Для чего: понять, какие аудитории дают качественные брони. Как работает: сравнивает сегменты по spend, CTR, conversions, CR и ROAS.' },
    creatives: { title: 'Топ креативы', body: 'Для чего: увидеть, какие объявления и визуалы лучше продают. Как работает: показывает CTR, ROAS, spend и срок работы каждого креатива.' },
    keywords: { title: 'Платные и органические запросы', body: 'Для чего: видеть связку SEO и рекламы по поисковым намерениям. Как работает: объединяет paid и organic keywords, показывая клики, CTR, позицию, cost и value.' },
    attrMatrix: { title: 'Модели атрибуции', body: 'Для чего: понять, как меняется вклад каналов при разных правилах зачета. Как работает: одна и та же конверсия пересчитывается в last-click, first-click, linear, time-decay и data-driven.' },
    journeys: { title: 'Пути гостей', body: 'Для чего: увидеть типичные цепочки касаний до брони. Как работает: группирует multi-touch пути и показывает, какие последовательности чаще приводят к конверсии.' },
    assists: { title: 'Assist vs last-click', body: 'Для чего: не недооценивать верхнюю воронку. Как работает: разделяет конверсии, где канал закрыл бронь, и где он помог на пути.' },
    ttc: { title: 'Time to conversion', body: 'Для чего: понять, как быстро гости бронируют после первого касания. Как работает: группирует конверсии по времени от первого визита/клика до брони.' },
  },
  en: {
    spend:   { title: 'Total spend',      body: 'Sum of all paid ad spend for the period (Google + Meta + TikTok). Excludes salaries and contractors.' },
    impr:    { title: 'Impressions',      body: 'How many times ads were shown. One person may see many ads — this ≠ reach.' },
    clicks:  { title: 'Clicks',           body: 'How many times ads were clicked. Clicks ÷ impressions = CTR.' },
    cpc:     { title: 'CPC avg',          body: 'Average cost per click, weighted by spend. Lower is better.' },
    freq:    { title: 'Frequency',        body: 'Average number of times each user saw an ad. > 6 typically signals audience fatigue.' },
    attrRev: { title: 'Attributed revenue', body: 'Revenue credited to ads by the attribution model. Depends on the model selected in the header.' },
    conv:    { title: 'Conversions',      body: 'How many target actions (booking / lead) happened under the chosen attribution model.' },
    cr:      { title: 'Conversion rate',  body: 'Conversions ÷ Clicks. Share of clickers who actually booked.' },
    cac:     { title: 'CAC',              body: 'Customer Acquisition Cost = Spend ÷ new guests. Rising CAC is a bad sign.' },
    roas:    { title: 'Blended ROAS',     body: 'Return on Ad Spend = Attributed revenue ÷ Spend. Depends on the attribution model selected in the header.' },
    attrSelect: { title: 'Attribution model', body: 'How conversions are credited across multiple touchpoints in a guest\'s path to booking. Affects conversions, attributed revenue, ROAS, CAC. Does NOT affect spend, impressions, clicks.' },
    chTable: { title: 'Channel performance', body: 'Purpose: compares Google, Meta, and TikTok in one table. How it works: shows spend, clicks, conversions, CAC, revenue, and ROAS by channel.' },
    dist: { title: 'Spend vs revenue mix', body: 'Purpose: shows whether budget flows into channels that return revenue. How it works: compares each channel share of spend with its share of attributed revenue.' },
    scatter: { title: 'Channel efficiency map', body: 'Purpose: spots expensive and high-return channels quickly. How it works: X is CAC, Y is ROAS, bubble size is impressions; better is higher and left.' },
    funnel: { title: 'Conversion funnel', body: 'Purpose: finds where users drop before booking. How it works: shows the path from impressions to completed booking and conversion between stages.' },
    funnelByCh: { title: 'Funnel by channel', body: 'Purpose: compares traffic quality between channels. How it works: renders the same funnel separately for Google, Meta, and TikTok.' },
    campaigns: { title: 'Campaigns', body: 'Purpose: manages active and recent campaigns by budget and result. How it works: table shows spend, clicks, CTR, conversions, CAC, ROAS, and trend.' },
    campaignBubbles: { title: 'Campaign map', body: 'Purpose: finds campaigns where budget and return are misaligned. How it works: X is spend, Y is ROAS, point size is conversion count.' },
    movers: { title: 'Biggest changes', body: 'Purpose: highlights what improved or deteriorated most. How it works: compares campaigns with the previous period on key metrics.' },
    audiences: { title: 'Top audiences', body: 'Purpose: shows which audiences produce quality bookings. How it works: compares segments by spend, CTR, conversions, CR, and ROAS.' },
    creatives: { title: 'Top creatives', body: 'Purpose: shows which ads and visuals sell best. How it works: displays CTR, ROAS, spend, and age for each creative.' },
    keywords: { title: 'Paid and organic keywords', body: 'Purpose: connects SEO and ads around search intent. How it works: combines paid and organic queries with clicks, CTR, position, cost, and value.' },
    attrMatrix: { title: 'Attribution models', body: 'Purpose: shows how channel credit changes under different rules. How it works: recalculates the same conversions under last-click, first-click, linear, time-decay, and data-driven models.' },
    journeys: { title: 'Guest journeys', body: 'Purpose: reveals common touchpoint paths before booking. How it works: groups multi-touch journeys and shows which sequences convert most often.' },
    assists: { title: 'Assist vs last-click', body: 'Purpose: prevents undervaluing upper-funnel channels. How it works: separates conversions a channel closed from conversions it helped along the way.' },
    ttc: { title: 'Time to conversion', body: 'Purpose: shows how quickly guests book after first touch. How it works: groups conversions by time from first visit/click to booking.' },
  },
};

window.MKT = MKT;
window.MKT_T = MKT_T;
window.MKT_HELP = MKT_HELP;
