<?php
$page_title = 'Metrics';
require __DIR__ . '/_guard.php';

/**
 * Turn a PHP filename into a friendly, human label.
 * e.g. "index.php" -> "Home", "directory-item.php" -> "Listing detail"
 */
function metrics_page_label(string $file): string {
    $file = strtolower(trim($file));
    static $map = [
        'index.php'               => 'Home',
        'directory.php'           => 'Directory',
        'directory-item.php'      => 'Listing detail',
        'become-member.php'       => 'Become a member',
        'learn-more.php'          => 'Learn more',
        'contact.php'             => 'Contact',
        'blog.php'                => 'Blog',
        'blog-post.php'           => 'Blog post',
        'login.php'               => 'Login',
        'logout.php'              => 'Logout',
        'forgot.php'              => 'Forgot password',
        'reset.php'               => 'Reset password',
        'signup-submit.php'       => 'Sign up (submit)',
        'claim-listing.php'       => 'Claim listing',
        'claim-submit.php'        => 'Claim listing (submit)',
        'newsletter-signup.php'   => 'Newsletter signup',
        'contact-submit.php'      => 'Contact form submit',
    ];
    if (isset($map[$file])) return $map[$file];

    // Fallbacks: strip .php and prettify
    $s = preg_replace('/\.php$/', '', $file);
    $s = str_replace(['-', '_'], ' ', $s);
    $s = ucwords($s);
    return $s !== '' ? $s : $file;
}

$range = $_GET['range'] ?? '30d';
$range_map = [
    '24h' => '1 DAY',
    '7d'  => '7 DAY',
    '30d' => '30 DAY',
    '90d' => '90 DAY',
];
$interval = $range_map[$range] ?? $range_map['30d'];
$label    = ['24h'=>'Last 24 hours','7d'=>'Last 7 days','30d'=>'Last 30 days','90d'=>'Last 90 days'][$range] ?? '';

function range_link($r, $current) {
    $labels = ['24h'=>'24h','7d'=>'7 days','30d'=>'30 days','90d'=>'90 days'];
    $cls = $r === $current ? 'on' : '';
    return '<a href="?range='.$r.'" class="ftab '.$cls.'">'.$labels[$r].'</a>';
}

// ── Overall counters ──
try {
    $total_views   = (int)db_value("SELECT COUNT(*) FROM metrics_pageviews WHERE viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)");
    $unique_visits = (int)db_value("SELECT COUNT(DISTINCT ip_hash) FROM metrics_pageviews WHERE viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)");
    $total_searches= (int)db_value("SELECT COUNT(*) FROM metrics_searches WHERE searched_at >= DATE_SUB(NOW(), INTERVAL $interval)");
    $countries_cnt = (int)db_value("SELECT COUNT(DISTINCT country) FROM metrics_pageviews WHERE country IS NOT NULL AND viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)");
} catch (Throwable $e) {
    $total_views = $unique_visits = $total_searches = $countries_cnt = 0;
}

// ── Top pages ──
try {
    $top_pages = db_all(
        "SELECT page, COUNT(*) AS views, COUNT(DISTINCT ip_hash) AS uniques
           FROM metrics_pageviews
          WHERE viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY page
          ORDER BY views DESC
          LIMIT 15"
    );
} catch (Throwable $e) { $top_pages = []; }

// ── Top listings ──
try {
    $top_listings = db_all(
        "SELECT l.id, l.name, l.tier, COUNT(pv.id) AS views,
                COUNT(DISTINCT pv.ip_hash) AS uniques
           FROM metrics_pageviews pv
           JOIN listings l ON l.id = pv.listing_id
          WHERE pv.listing_id IS NOT NULL
            AND pv.viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY l.id, l.name, l.tier
          ORDER BY views DESC
          LIMIT 15"
    );
} catch (Throwable $e) { $top_listings = []; }

// ── Device breakdown ──
try {
    $devices = db_all(
        "SELECT device_type, COUNT(*) AS c
           FROM metrics_pageviews
          WHERE viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY device_type
          ORDER BY c DESC"
    );
} catch (Throwable $e) { $devices = []; }

// ── Countries ──
try {
    $countries = db_all(
        "SELECT country, COUNT(*) AS c
           FROM metrics_pageviews
          WHERE country IS NOT NULL
            AND viewed_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY country
          ORDER BY c DESC
          LIMIT 12"
    );
} catch (Throwable $e) { $countries = []; }

// ── Top searches ──
try {
    $top_searches = db_all(
        "SELECT query_text, COUNT(*) AS searches, AVG(result_count) AS avg_results
           FROM metrics_searches
          WHERE query_text IS NOT NULL AND query_text != ''
            AND searched_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY query_text
          ORDER BY searches DESC
          LIMIT 15"
    );
} catch (Throwable $e) { $top_searches = []; }

// ── Top filtered categories ──
try {
    $top_categories = db_all(
        "SELECT s.category_slug, c.name, COUNT(*) AS searches
           FROM metrics_searches s
           LEFT JOIN categories c ON c.slug = s.category_slug
          WHERE s.category_slug IS NOT NULL
            AND s.searched_at >= DATE_SUB(NOW(), INTERVAL $interval)
          GROUP BY s.category_slug, c.name
          ORDER BY searches DESC
          LIMIT 10"
    );
} catch (Throwable $e) { $top_categories = []; }

// ── Daily timeline (last 14 days, always) ──
try {
    $timeline = db_all(
        "SELECT DATE(viewed_at) AS day, COUNT(*) AS views
           FROM metrics_pageviews
          WHERE viewed_at >= DATE_SUB(CURDATE(), INTERVAL 13 DAY)
          GROUP BY DATE(viewed_at)
          ORDER BY day"
    );
} catch (Throwable $e) { $timeline = []; }

$max_day = 0;
foreach ($timeline as $d) { if ($d['views'] > $max_day) $max_day = (int)$d['views']; }

// Fill missing days with 0
$timeline_filled = [];
for ($i = 13; $i >= 0; $i--) {
    $day = date('Y-m-d', strtotime("-$i days"));
    $found = 0;
    foreach ($timeline as $d) if ($d['day'] === $day) { $found = (int)$d['views']; break; }
    $timeline_filled[] = ['day'=>$day, 'views'=>$found];
}
?>

<style>
.m-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:.9rem;margin-bottom:1.5rem;}
.m-stat{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:1.1rem 1.25rem;}
.m-stat .lbl{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);margin:0 0 .3rem;}
.m-stat .val{font-size:1.9rem;font-weight:800;line-height:1;margin:0;}
.m-stat .sub{font-size:.75rem;color:var(--ink-muted);margin:.3rem 0 0;}

.atbl{width:100%;border-collapse:collapse;font-size:.855rem;}
.atbl th{padding:.5rem 1.1rem;background:var(--surface-alt);font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-muted);border-bottom:1px solid var(--line);text-align:left;white-space:nowrap;}
.atbl td{padding:.55rem 1.1rem;border-bottom:1px solid var(--line);vertical-align:middle;}
.atbl tr:last-child td{border-bottom:none;}
.atbl tbody tr:hover td{background:#fafafa;}
.atbl .bar{height:6px;background:var(--brand-primary);border-radius:3px;min-width:3px;}
.atbl .bar-wrap{background:var(--surface-alt);border-radius:3px;width:100%;max-width:180px;}

.ftab{display:inline-flex;align-items:center;padding:.3rem .9rem;border-radius:999px;font-size:.82rem;border:1px solid var(--line);text-decoration:none;color:var(--ink);}
.ftab.on{background:var(--brand-primary);color:#fff;border-color:var(--brand-primary);}

.widget{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:1.25rem;}
.widget-head{padding:.9rem 1.25rem;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;}
.widget-head h2{margin:0;font-size:.95rem;}
.widget-head .sub{font-size:.78rem;color:var(--ink-muted);margin:0;}
.widget-body{padding:1.25rem;}

.timeline{display:flex;gap:3px;align-items:flex-end;height:130px;padding-top:.5rem;}
.timeline-bar{flex:1;background:linear-gradient(180deg, var(--brand-primary), var(--brand-primary-dk));border-radius:3px 3px 0 0;position:relative;min-height:2px;transition:opacity .15s;}
.timeline-bar:hover{opacity:.8;}
.timeline-bar .tooltip{position:absolute;bottom:calc(100% + 4px);left:50%;transform:translateX(-50%);background:#000;color:#fff;padding:.2em .5em;border-radius:3px;font-size:.7rem;white-space:nowrap;opacity:0;pointer-events:none;}
.timeline-bar:hover .tooltip{opacity:1;}
.timeline-labels{display:flex;gap:3px;font-size:.65rem;color:var(--ink-muted);margin-top:.3rem;}
.timeline-labels span{flex:1;text-align:center;}

.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;}
@media(max-width:900px){.two-col{grid-template-columns:1fr;}.m-stats{grid-template-columns:repeat(2,1fr);}}

.device-chip{display:inline-flex;align-items:center;gap:.4rem;padding:.35em .85em;border-radius:999px;background:var(--surface-alt);font-size:.82rem;margin:0 .3rem .3rem 0;}
.device-chip strong{color:var(--brand-primary);}

.empty{padding:1.5rem;color:var(--ink-muted);text-align:center;font-size:.9rem;}
</style>

<section class="section">
<div class="container">

<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1.25rem;flex-wrap:wrap;gap:1rem;">
    <div>
        <h1 style="margin:0;">Metrics</h1>
        <p class="muted" style="margin:.2rem 0 0;font-size:.88rem;">
            <?= htmlspecialchars($label) ?> · anonymous, aggregated
        </p>
    </div>
    <div style="display:flex;gap:.4rem;">
        <?= range_link('24h', $range) ?>
        <?= range_link('7d', $range) ?>
        <?= range_link('30d', $range) ?>
        <?= range_link('90d', $range) ?>
    </div>
</div>

<!-- Top stats -->
<div class="m-stats">
    <div class="m-stat">
        <p class="lbl">Page views</p>
        <p class="val" style="color:var(--brand-primary);"><?= number_format($total_views) ?></p>
        <p class="sub">total in period</p>
    </div>
    <div class="m-stat">
        <p class="lbl">Unique visitors</p>
        <p class="val"><?= number_format($unique_visits) ?></p>
        <p class="sub">distinct sources</p>
    </div>
    <div class="m-stat">
        <p class="lbl">Searches</p>
        <p class="val"><?= number_format($total_searches) ?></p>
        <p class="sub">directory queries</p>
    </div>
    <div class="m-stat">
        <p class="lbl">Countries</p>
        <p class="val"><?= number_format($countries_cnt) ?></p>
        <p class="sub">visitor locations</p>
    </div>
</div>

<!-- Timeline chart -->
<div class="widget">
    <div class="widget-head">
        <h2>Last 14 days</h2>
        <p class="sub">page views per day</p>
    </div>
    <div class="widget-body">
        <?php if (empty(array_filter(array_column($timeline_filled,'views')))): ?>
            <div class="empty">No page view data yet. Traffic will appear here as visitors arrive.</div>
        <?php else: ?>
            <?php $max_v = max(1, max(array_column($timeline_filled,'views'))); ?>
            <div class="timeline">
                <?php foreach ($timeline_filled as $d):
                    $h = ($d['views'] / $max_v) * 100;
                ?>
                    <div class="timeline-bar" style="height:<?= max(2, $h) ?>%;">
                        <span class="tooltip"><?= (int)$d['views'] ?> · <?= date('j M', strtotime($d['day'])) ?></span>
                    </div>
                <?php endforeach; ?>
            </div>
            <div class="timeline-labels">
                <?php foreach ($timeline_filled as $d): ?>
                    <span><?= date('j', strtotime($d['day'])) ?></span>
                <?php endforeach; ?>
            </div>
        <?php endif; ?>
    </div>
</div>

<!-- Devices + Countries -->
<div class="two-col">
    <div class="widget">
        <div class="widget-head"><h2>Device breakdown</h2></div>
        <div class="widget-body">
            <?php if (empty($devices)): ?>
                <div class="empty">No data.</div>
            <?php else:
                $total_dev = array_sum(array_column($devices,'c'));
                foreach ($devices as $d):
                    $pct = $total_dev > 0 ? round($d['c'] / $total_dev * 100) : 0;
            ?>
                <div class="device-chip">
                    <?= htmlspecialchars(ucfirst($d['device_type'])) ?>
                    <strong><?= $pct ?>%</strong>
                    <span class="muted" style="font-size:.75rem;">(<?= number_format($d['c']) ?>)</span>
                </div>
            <?php endforeach; endif; ?>
        </div>
    </div>

    <div class="widget">
        <div class="widget-head"><h2>Top countries</h2></div>
        <?php if (empty($countries)): ?>
            <div class="empty">No geo data yet. Lookup happens on first visit from each IP.</div>
        <?php else: ?>
            <table class="atbl">
                <?php
                $max_c = max(array_column($countries,'c'));
                foreach ($countries as $c): ?>
                    <tr>
                        <td><?= htmlspecialchars($c['country']) ?></td>
                        <td style="text-align:right;width:60px;"><?= number_format($c['c']) ?></td>
                        <td style="width:180px;">
                            <div class="bar-wrap">
                                <div class="bar" style="width:<?= ($c['c']/$max_c*100) ?>%;"></div>
                            </div>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </table>
        <?php endif; ?>
    </div>
</div>

<!-- Top pages -->
<div class="widget">
    <div class="widget-head">
        <h2>Most viewed pages</h2>
    </div>
    <?php if (empty($top_pages)): ?>
        <div class="empty">No page views recorded yet.</div>
    <?php else: ?>
        <table class="atbl">
            <thead><tr><th>Page</th><th style="text-align:right;">Views</th><th style="text-align:right;">Unique</th><th>Share</th></tr></thead>
            <tbody>
            <?php $max_p = max(array_column($top_pages,'views')); foreach ($top_pages as $p): ?>
                <tr>
                    <td>
                        <strong><?= htmlspecialchars(metrics_page_label($p['page'])) ?></strong>
                        <br><code style="font-size:.72rem;color:var(--ink-light);"><?= htmlspecialchars($p['page']) ?></code>
                    </td>
                    <td style="text-align:right;font-weight:600;"><?= number_format($p['views']) ?></td>
                    <td style="text-align:right;color:var(--ink-muted);"><?= number_format($p['uniques']) ?></td>
                    <td style="width:240px;">
                        <div class="bar-wrap">
                            <div class="bar" style="width:<?= ($p['views']/$max_p*100) ?>%;"></div>
                        </div>
                    </td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>
    <?php endif; ?>
</div>

<!-- Top listings -->
<div class="widget">
    <div class="widget-head">
        <h2>Top performing listings</h2>
        <p class="sub">feeds the homepage Top 3 section</p>
    </div>
    <?php if (empty($top_listings)): ?>
        <div class="empty">No listing views recorded yet.</div>
    <?php else: ?>
        <table class="atbl">
            <thead><tr><th>Listing</th><th>Tier</th><th style="text-align:right;">Views</th><th style="text-align:right;">Unique</th><th>Share</th></tr></thead>
            <tbody>
            <?php $max_l = max(array_column($top_listings,'views')); foreach ($top_listings as $l): ?>
                <tr>
                    <td>
                        <a href="../directory-item.php?id=<?= $l['id'] ?>" target="_blank"><?= htmlspecialchars($l['name']) ?></a>
                    </td>
                    <td><span class="tag"><?= htmlspecialchars($l['tier']) ?></span></td>
                    <td style="text-align:right;font-weight:600;"><?= number_format($l['views']) ?></td>
                    <td style="text-align:right;color:var(--ink-muted);"><?= number_format($l['uniques']) ?></td>
                    <td style="width:240px;">
                        <div class="bar-wrap"><div class="bar" style="width:<?= ($l['views']/$max_l*100) ?>%;"></div></div>
                    </td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>
    <?php endif; ?>
</div>

<!-- Searches + Category filters -->
<div class="two-col">
    <div class="widget">
        <div class="widget-head"><h2>Top search terms</h2></div>
        <?php if (empty($top_searches)): ?>
            <div class="empty">No searches recorded yet.</div>
        <?php else: ?>
            <table class="atbl">
                <thead><tr><th>Query</th><th style="text-align:right;">Searches</th><th style="text-align:right;">Avg results</th></tr></thead>
                <tbody>
                <?php foreach ($top_searches as $s): ?>
                    <tr>
                        <td><em>"<?= htmlspecialchars($s['query_text']) ?>"</em></td>
                        <td style="text-align:right;font-weight:600;"><?= number_format($s['searches']) ?></td>
                        <td style="text-align:right;color:var(--ink-muted);">
                            <?= round($s['avg_results'], 1) ?>
                        </td>
                    </tr>
                <?php endforeach; ?>
                </tbody>
            </table>
        <?php endif; ?>
    </div>

    <div class="widget">
        <div class="widget-head"><h2>Category filters used</h2></div>
        <?php if (empty($top_categories)): ?>
            <div class="empty">No category filters used yet.</div>
        <?php else: ?>
            <table class="atbl">
                <?php $max_cat = max(array_column($top_categories,'searches')); foreach ($top_categories as $c): ?>
                    <tr>
                        <td><?= htmlspecialchars($c['name'] ?: $c['category_slug']) ?></td>
                        <td style="text-align:right;font-weight:600;"><?= number_format($c['searches']) ?></td>
                        <td style="width:160px;">
                            <div class="bar-wrap"><div class="bar" style="width:<?= ($c['searches']/$max_cat*100) ?>%;"></div></div>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </table>
        <?php endif; ?>
    </div>
</div>

</div>
</section>
<?php require __DIR__ . '/_footer.php'; ?>