<%

var g   = (x && x.ga4) || null;
var T   = (g && g.totals) || {};
var D   = (g && g.deltas) || {};
var bk  = (x && x.buckets) || null;
var bh  = (x && x.backlinkHistory) || [];

var n = function (v) { return (v === null || v === undefined || v === '') ? '—' : v; };
var big = function (v) { return (v === null || v === undefined) ? '—' : Number(v).toLocaleString('en-US'); };

function chg(v, good) {
  if (v === null || v === undefined) return '';
  if (Math.abs(v) < 0.05) return '<span class="chip flat" title="Measured, and unchanged"><span class="flatbar" role="img" aria-label="unchanged"></span> 0%</span>';
  var up = v > 0;
  var positive = (good === 'down') ? !up : up;
  return '<span class="mini ' + (positive ? 'pos' : 'neg') + '">' + (up ? '▲' : '▼') + Math.abs(v) + '%</span>';
}
function pct(v) { return (v === null || v === undefined) ? '—' : v + '%'; }

function poly2(rows, key, max, w, h) {
  var nn = rows.length; if (nn < 2 || !max) return '';
  return rows.map(function (r, i) {
    var px = 6 + i * ((w - 12) / (nn - 1));
    var py = h - 8 - ((r[key] || 0) / max) * (h - 20);
    return px.toFixed(0) + ',' + py.toFixed(0);
  }).join(' ');
}
var dNow = (g && g.daily) || [], dPrev = (g && g.dailyPrev) || [];
var dMax = Math.max.apply(null, dNow.concat(dPrev).map(function (r) { return r.sessions || 0; }).concat([1]));

var ga4Date = function (s) {
  s = String(s || '');
  if (!/^\d{8}$/.test(s)) return null;
  return new Date(Number(s.slice(0, 4)), Number(s.slice(4, 6)) - 1, Number(s.slice(6, 8)));
};
var ga4Label = function (s) {
  var dt = ga4Date(s);
  return dt ? dt.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }) : '';
};

var trafW = 680, trafH = 150;
var trafX = function (i, nn) { return nn < 2 ? 6 : 6 + i * ((trafW - 12) / (nn - 1)); };
var trafY = function (v) { return dMax ? (trafH - 8 - ((v || 0) / dMax) * (trafH - 20)) : (trafH - 8); };
var trafN = dNow.length;

var trafTickIdx = [];
if (trafN) {
  var _want = Math.min(5, trafN);
  var _raw = [];
  for (var _t = 0; _t < _want; _t++) _raw.push(Math.round(_t * (trafN - 1) / Math.max(1, _want - 1)));
  _raw = _raw.filter(function (v, i, a) { return a.indexOf(v) === i; });
  var _seen = {};
  _raw.forEach(function (idx) {
    var lbl = ga4Label(dNow[idx].d);
    var isEdge = (idx === 0 || idx === trafN - 1);
    if (isEdge || !_seen[lbl]) { trafTickIdx.push(idx); _seen[lbl] = true; }
  });
}

var trafChartPts = dNow.map(function (r, i) {
  var rows = [{
    k: 'This period', v: (r.sessions || 0).toLocaleString('en-US'),
    y: Math.round(trafY(r.sessions)), c: 'var(--teal)',
    d: i === 0 ? null : (r.sessions || 0) - (dNow[i - 1].sessions || 0)
  }];
  if (dPrev[i]) {
    rows.push({
      k: 'Previous period (' + ga4Label(dPrev[i].d) + ')',
      v: (dPrev[i].sessions || 0).toLocaleString('en-US'),
      y: Math.round(trafY(dPrev[i].sessions)), c: 'var(--muted-2)'
    });
  }
  return { x: Math.round(trafX(i, trafN)), label: ga4Label(r.d), rows: rows };
});

var conv = (g && g.conversions) || [];
var cMax = Math.max.apply(null, conv.map(function (r) { return Math.max(r.keyEvents || 0, 0); }).concat([1]));

var convH = 120;
var convX = function (i, nn) { return nn < 2 ? 6 : 6 + i * ((trafW - 12) / (nn - 1)); };
var convY = function (v) { return cMax ? (convH - 8 - ((v || 0) / cMax) * (convH - 20)) : (convH - 8); };
var convN = conv.length;
var convTickIdx = [];
if (convN) {
  var _cWant = Math.min(5, convN);
  var _cRaw = [];
  for (var _ct = 0; _ct < _cWant; _ct++) _cRaw.push(Math.round(_ct * (convN - 1) / Math.max(1, _cWant - 1)));
  _cRaw = _cRaw.filter(function (v, i, a) { return a.indexOf(v) === i; });
  var _cSeen = {};
  _cRaw.forEach(function (idx) {
    var lbl = ga4Label(conv[idx].d);
    var isEdge = (idx === 0 || idx === convN - 1);
    if (isEdge || !_cSeen[lbl]) { convTickIdx.push(idx); _cSeen[lbl] = true; }
  });
}
var convChartPts = conv.map(function (r, i) {
  return {
    x: Math.round(convX(i, convN)), label: ga4Label(r.d),
    rows: [{
      k: 'Key events', v: (r.keyEvents || 0).toLocaleString('en-US'),
      y: Math.round(convY(r.keyEvents)), c: 'var(--navy)',
      d: i === 0 ? null : (r.keyEvents || 0) - (conv[i - 1].keyEvents || 0)
    }]
  };
});

function donut(rows, keyName) {
  var totalV = rows.reduce(function (s, r) { return s + (r.sessions || 0); }, 0);
  if (!totalV) return [];
  var acc = 0, R = 54, C = 2 * Math.PI * R;
  var COLORS = ['#1a73e8', '#12b5cb', '#e52592', '#f9ab00', '#ff8168', '#7c5cd6', '#0f9d58', '#9aa0a6', '#5f6368'];
  return rows.slice(0, 9).map(function (r, i) {
    var share = (r.sessions || 0) / totalV;
    var seg = { name: r[keyName] || r.name, share: +(share * 100).toFixed(1),
      color: COLORS[i % COLORS.length], dash: (share * C).toFixed(2) + ' ' + C.toFixed(2),
      offset: (-acc * C).toFixed(2) };
    acc += share;
    return seg;
  });
}
var chanDonut = donut((g && g.channels) || [], 'name');
var srcDonut  = donut((g && g.sources)  || [], 'name');
%>

<div class="card">
  <div class="card-h">
    <h3>Traffic overview: what's changed?</h3>
    <span class="hint">
      <% if (g) { %>GA4 · <%= g.period.days %> days to <%= h.date(g.period.end) %>, against the <%= g.period.days %> before<% } else { %>GA4<% } %>
    </span>
  </div>

  <% if (!g) { %>
    <div class="card-p rr-meta" style="text-align:center; padding:30px">
      Fills in from GA4 on the next
      <% if (locals.showStaff) { %><b>Sync now</b><% } else { %>sync<% } %>.
    </div>
</div>

  <% } else { %>

  <div class="card-p" style="padding-top:14px">
    <div class="ov-strip">
      <div class="ov"><div class="ovl">Sessions</div><div class="ovv tnum"><%= big(T.sessions) %> <%- chg(D.sessions) %></div></div>
      <div class="ov"><div class="ovl">Users</div><div class="ovv tnum"><%= big(T.users) %> <%- chg(D.users) %></div></div>
      <div class="ov"><div class="ovl">New users</div><div class="ovv tnum"><%= big(T.newUsers) %> <%- chg(D.newUsers) %></div></div>

      <div class="ov"><div class="ovl">Bounce rate</div><div class="ovv tnum"><%= pct(T.bounceRate) %> <%- chg(D.bounceRate, 'down') %></div></div>
      <div class="ov"><div class="ovl">Events / session</div><div class="ovv tnum"><%= n(T.eventsPerSession) %> <%- chg(D.eventsPerSession) %></div></div>
      <div class="ov"><div class="ovl">Avg. session</div><div class="ovv tnum"><%= n(T.avgDuration) %> <%- chg(D.avgDuration) %></div></div>
    </div>

    <% if (dNow.length >= 2) { %>
      <div class="legend" style="margin-top:16px">
        <span><i class="lg"></i>This period</span>
        <span><i class="lg" style="border-color:var(--line);border-top-style:dashed"></i>Previous period</span>
      </div>
      <div class="vchart-wrap">

      <svg class="chart c-md vchart" viewBox="0 0 680 176" preserveAspectRatio="none" tabindex="0"
           data-points="<%= JSON.stringify(trafChartPts) %>"
           aria-label="Sessions per day, this period against the previous period. Use the arrow keys to read each day.">

        <line class="ax" x1="0.5" y1="0" x2="0.5" y2="149.5"/>
        <line class="ax" x1="0.5" y1="149.5" x2="680" y2="149.5"/>
        <line x1="0" y1="40" x2="680" y2="40" stroke="var(--line-2)"/>
        <line x1="0" y1="90" x2="680" y2="90" stroke="var(--line-2)"/>
        <% if (dPrev.length >= 2) { %>
          <polyline points="<%= poly2(dPrev,'sessions',dMax,680,150) %>" fill="none" stroke="var(--line)" stroke-width="2" stroke-dasharray="4 3"/>
        <% } %>
        <polyline points="<%= poly2(dNow,'sessions',dMax,680,150) %>" fill="none" stroke="var(--teal)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>

        <% trafTickIdx.forEach(function(i){ %>
          <text class="tick" x="<%= Math.round(Math.max(6, Math.min(680, trafX(i, trafN)))) %>" y="165"
                text-anchor="<%= i === 0 ? 'start' : (i === trafN-1 ? 'end' : 'middle') %>"
                font-size="10.5" fill="var(--muted-2)"><%= ga4Label(dNow[i].d) %></text>
        <% }) %>

        <line class="vc-cross" x1="0" y1="6" x2="0" y2="142"/>
        <circle class="vc-dot" cx="0" cy="0" r="4"/>
        <circle class="vc-dot" cx="0" cy="0" r="4"/>
      </svg>
        <div class="vchart-tip" hidden aria-live="polite"></div>
      </div>
    <% } %>
  </div>
</div>

<div class="card">
  <div class="card-h"><h3>How does the traffic convert?</h3><span class="hint"><%= g.keyEventMetric === 'keyEvents' ? 'key events' : 'conversions' %></span></div>
  <div class="card-p" style="padding-top:14px">
    <div class="ov-strip ov-3">
      <div class="ov"><div class="ovl">Key events</div><div class="ovv tnum"><%= big(T.keyEvents) %> <%- chg(D.keyEvents) %></div></div>
      <div class="ov"><div class="ovl">Event count</div><div class="ovv tnum"><%= big(T.eventCount) %> <%- chg(D.eventCount) %></div></div>
      <div class="ov"><div class="ovl">Engagement rate</div><div class="ovv tnum"><%= pct(T.engagementRate) %> <%- chg(D.engagementRate) %></div></div>
    </div>
    <% if (conv.length >= 2) { %>
      <div class="vchart-wrap" style="margin-top:12px">

      <svg class="chart c-sm vchart" viewBox="0 0 680 144" preserveAspectRatio="none" tabindex="0"
           data-points="<%= JSON.stringify(convChartPts) %>"
           aria-label="Key events per day. Use the arrow keys to read each day.">
        <line class="ax" x1="0.5" y1="0" x2="0.5" y2="119.5"/>
        <line class="ax" x1="0.5" y1="119.5" x2="680" y2="119.5"/>
        <line x1="0" y1="35" x2="680" y2="35" stroke="var(--line-2)"/>
        <line x1="0" y1="75" x2="680" y2="75" stroke="var(--line-2)"/>
        <polyline points="<%= poly2(conv,'keyEvents',cMax,680,120) %>" fill="none" stroke="var(--navy)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>

        <% convTickIdx.forEach(function(i){ %>
          <text class="tick" x="<%= Math.round(Math.max(6, Math.min(680, convX(i, convN)))) %>" y="135"
                text-anchor="<%= i === 0 ? 'start' : (i === convN-1 ? 'end' : 'middle') %>"
                font-size="10.5" fill="var(--muted-2)"><%= ga4Label(conv[i].d) %></text>
        <% }) %>

        <line class="vc-cross" x1="0" y1="6" x2="0" y2="112"/>
        <circle class="vc-dot" cx="0" cy="0" r="4"/>
      </svg>
        <div class="vchart-tip" hidden aria-live="polite"></div>
      </div>
    <% } else { %>
      <div class="rr-meta" style="padding:14px 0 2px">No daily breakdown yet. It appears once GA4 has more than one day in the window.</div>
    <% } %>
  </div>
</div>

<div class="card">
  <div class="card-h"><h3>Organic compared to other channels</h3><span class="hint">vs the previous <%= g.period.days %> days</span></div>
  <div style="overflow-x:auto">
    <% if (!(g.channels || []).length) { %>
      <div class="card-p rr-meta" style="text-align:center; padding:24px">GA4 returned no channel rows for this window.</div>
    <% } else { %>
    <table class="tbl">
      <thead><tr><th>Traffic source</th><th>Sessions</th><th>Engagement rate</th><th>Event count</th><th>Views / session</th></tr></thead>
      <tbody>
        <% g.channels.forEach(function(c){ %>
          <tr>
            <td class="strong"><%= c.name %></td>
            <td class="num"><%= big(c.sessions) %> <%- chg(c.dSessions) %></td>
            <td class="num"><%= pct(c.engagementRate) %> <%- chg(c.dEngagement) %></td>
            <td class="num"><%= big(c.eventCount) %> <%- chg(c.dEvents) %></td>
            <td class="num"><%= n(c.viewsPerSession) %> <%- chg(c.dViews) %></td>
          </tr>
        <% }) %>
      </tbody>
    </table>
    <% } %>
  </div>
</div>
<% } %>

<%
  var _geo = g && (g.geo || g.us);
  var _geoOk = g && (g.geo ? g.geoAvailable : g.usAvailable);
  var _mkt = (g && g.market) || (g && g.us ? { name: 'United States', iso: 'US', chosen: true } : null);
  var _mktName = _mkt ? _mkt.name : 'Market';
%>
<% if (g && (_geo || g.countries)) { %>
<div class="card">
  <div class="card-h">
    <h3><%= _mktName %> traffic</h3>
    <span class="hint">sessions from <%= _mktName %><% if (_mkt && _mkt.chosen === false) { %> (no market set yet)<% } %></span>
  </div>
  <div class="card-p" style="padding-top:14px">
    <% if (!_geoOk) { %>
      <div class="rr-meta" style="text-align:center; padding:20px">GA4 wouldn't answer the country-filtered query, so this couldn't be measured.</div>
    <% } else { var u = _geo || {}; %>
      <div class="ov-strip ov-4">
        <div class="ov"><div class="ovl">Sessions</div><div class="ovv tnum"><%= big(u.sessions) %> <%- chg(u.dSessions) %></div></div>
        <div class="ov"><div class="ovl">Users</div><div class="ovv tnum"><%= big(u.users) %> <%- chg(u.dUsers) %></div></div>
        <div class="ov"><div class="ovl">Engagement</div><div class="ovv tnum"><%= pct(u.engagementRate) %> <%- chg(u.dEngagement) %></div></div>
        <div class="ov"><div class="ovl">Key events</div><div class="ovv tnum"><%= big(u.keyEvents) %> <%- chg(u.dKeyEvents) %></div></div>
      </div>

      <% if ((u.landingPages || []).length) { %>
        <div class="rr-meta" style="margin:16px 0 6px">Landing pages</div>
        <div style="overflow-x:auto">
          <table class="tbl">
            <thead><tr><th>Page</th><th>Sessions</th><th>Engagement</th><th>Key events</th></tr></thead>
            <tbody>
              <% u.landingPages.forEach(function(lp){ %>
                <tr><td class="strong wrap"><%= lp.p %></td><td class="num"><%= big(lp.sessions) %></td><td class="num"><%= pct(lp.engagementRate) %></td><td class="num"><%= big(lp.keyEvents) %></td></tr>
              <% }) %>
            </tbody>
          </table>
        </div>
      <% } %>

      <div class="donut-pair" style="margin-top:16px">
        <% if ((u.devices || []).length) { %>
          <div class="donut-box"><%- include('donut', { rows: u.devices, title: 'By device', change: true, donutChg: chg }) %></div>
        <% } %>
        <% if ((u.channels || []).length) { %>
          <div class="donut-box"><%- include('donut', { rows: u.channels, title: 'By channel', change: true, donutChg: chg }) %></div>
        <% } %>
      </div>
    <% } %>

    <% if ((g.countries || []).length) { %>
      <%

        var _ctryHelp = 'For context on how much of the above ' + h.esc(_mktName) + ' is.'
          + ((locals.marketExtras && marketExtras.length)
              ? ' This client also has ' + h.esc(marketExtras.map(function (m) { return m.name; }).join(', '))
                + ' as a market, but the figures above cover ' + h.esc(_mktName) + ' only (one country per filtered query).'
              : '');
      %>
      <div class="rr-meta" style="margin:18px 0 6px">Top countries<%- h.ihelp('Top countries', _ctryHelp) %></div>
      <div style="overflow-x:auto">
        <table class="tbl">
          <thead><tr><th>Country</th><th>Sessions</th><th>Change</th></tr></thead>
          <tbody>
            <% g.countries.forEach(function(ct){ %>
              <tr><td class="strong"><%= ct.name %></td><td class="num"><%= big(ct.sessions) %></td><td class="num"><%- chg(ct.dSessions) || '<span class="muted">—</span>' %></td></tr>
            <% }) %>
          </tbody>
        </table>
      </div>
    <% } %>
  </div>
</div>
<% } %>
