![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/.cursor-server/data/User/History/-f0a1cb9/ |
<?php
// Include translation system
require_once __DIR__ . '/../includes/translations.php';
// Ensure we have database connection and user_id
if (!isset($pdo) || !isset($user_id)) {
echo '<div style="padding: 2rem; text-align: center; color: #ef4444;">' . t('analytics.error_db_connection') . '</div>';
return;
}
try {
// Check which analytics tables exist
$existing_tables = [];
$tables_to_check = ['track_plays', 'track_likes', 'track_comments', 'track_views', 'sales'];
foreach ($tables_to_check as $table) {
try {
$check = $pdo->query("SELECT 1 FROM $table LIMIT 1");
$existing_tables[$table] = true;
} catch (PDOException $e) {
$existing_tables[$table] = false;
}
}
// Get comprehensive analytics data with pagination (limit to recent tracks for performance)
$analytics_limit = 50; // Limit to 50 most recent tracks for analytics
// Build query dynamically based on existing tables
$plays_join = $existing_tables['track_plays'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as play_count
FROM track_plays
GROUP BY track_id
) plays ON mt.id = plays.track_id" : "";
$likes_join = $existing_tables['track_likes'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as like_count
FROM track_likes
GROUP BY track_id
) likes ON mt.id = likes.track_id" : "";
$comments_join = $existing_tables['track_comments'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as comment_count
FROM track_comments
GROUP BY track_id
) comments ON mt.id = comments.track_id" : "";
$sales_join = $existing_tables['sales'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as sales_count, SUM(amount) as total_revenue
FROM sales
GROUP BY track_id
) sales ON mt.id = sales.track_id" : "";
$views_join = $existing_tables['track_views'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as view_count
FROM track_views
GROUP BY track_id
) views ON mt.id = views.track_id" : "";
$analytics_query = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.created_at,
mt.price,
" . ($existing_tables['track_plays'] ? "COALESCE(plays.play_count, 0)" : "0") . " as total_plays,
" . ($existing_tables['track_likes'] ? "COALESCE(likes.like_count, 0)" : "0") . " as total_likes,
" . ($existing_tables['track_comments'] ? "COALESCE(comments.comment_count, 0)" : "0") . " as total_comments,
" . ($existing_tables['sales'] ? "COALESCE(sales.sales_count, 0)" : "0") . " as total_sales,
" . ($existing_tables['sales'] ? "COALESCE(sales.total_revenue, 0)" : "0") . " as total_revenue,
" . ($existing_tables['track_views'] ? "COALESCE(views.view_count, 0)" : "0") . " as total_views
FROM music_tracks mt
$plays_join
$likes_join
$comments_join
$sales_join
$views_join
WHERE mt.user_id = ?
AND mt.status = 'complete'
ORDER BY mt.created_at DESC
LIMIT ?
");
$analytics_query->execute([$user_id, $analytics_limit]);
$track_analytics = $analytics_query->fetchAll() ?: [];
// Get aggregate stats efficiently - build query based on existing tables
$agg_plays_join = $existing_tables['track_plays'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM track_plays
GROUP BY track_id
) play_count ON mt.id = play_count.track_id" : "";
$agg_likes_join = $existing_tables['track_likes'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM track_likes
GROUP BY track_id
) like_count ON mt.id = like_count.track_id" : "";
$agg_comments_join = $existing_tables['track_comments'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM track_comments
GROUP BY track_id
) comment_count ON mt.id = comment_count.track_id" : "";
$agg_views_join = $existing_tables['track_views'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM track_views
GROUP BY track_id
) view_count ON mt.id = view_count.track_id" : "";
$agg_sales_join = $existing_tables['sales'] ? "LEFT JOIN (
SELECT track_id, COUNT(*) as count
FROM sales
GROUP BY track_id
) sales_count ON mt.id = sales_count.track_id" : "";
$aggregate_stats = $pdo->prepare("
SELECT
" . ($existing_tables['track_plays'] ? "COALESCE(SUM(play_count.count), 0)" : "0") . " as total_plays,
" . ($existing_tables['track_likes'] ? "COALESCE(SUM(like_count.count), 0)" : "0") . " as total_likes,
" . ($existing_tables['track_comments'] ? "COALESCE(SUM(comment_count.count), 0)" : "0") . " as total_comments,
" . ($existing_tables['track_views'] ? "COALESCE(SUM(view_count.count), 0)" : "0") . " as total_views,
" . ($existing_tables['sales'] ? "COUNT(DISTINCT CASE WHEN sales_count.count > 0 THEN mt.id END)" : "0") . " as tracks_with_sales
FROM music_tracks mt
$agg_plays_join
$agg_likes_join
$agg_comments_join
$agg_views_join
$agg_sales_join
WHERE mt.user_id = ?
AND mt.status = 'complete'
");
$aggregate_stats->execute([$user_id]);
$stats = $aggregate_stats->fetch();
$total_plays = isset($stats['total_plays']) ? (int)$stats['total_plays'] : 0;
$total_likes = isset($stats['total_likes']) ? (int)$stats['total_likes'] : 0;
$total_comments = isset($stats['total_comments']) ? (int)$stats['total_comments'] : 0;
$total_views = isset($stats['total_views']) ? (int)$stats['total_views'] : 0;
$tracks_with_sales = isset($stats['tracks_with_sales']) ? (int)$stats['tracks_with_sales'] : 0;
// Calculate averages from the limited track set for display
$total_engagement = 0;
$total_conversion = 0;
foreach ($track_analytics as $track) {
$engagement_rate = $track['total_views'] > 0 ?
(($track['total_plays'] + $track['total_likes'] + $track['total_comments']) / $track['total_views']) * 100 : 0;
$conversion_rate = $track['total_views'] > 0 ?
($track['total_sales'] / $track['total_views']) * 100 : 0;
$total_engagement += $engagement_rate;
$total_conversion += $conversion_rate;
}
$avg_engagement = count($track_analytics) > 0 ? $total_engagement / count($track_analytics) : 0;
$avg_conversion = count($track_analytics) > 0 ? $total_conversion / count($track_analytics) : 0;
// Get daily stats for the last 30 days (only if track_plays table exists)
$daily_plays = [];
if ($existing_tables['track_plays']) {
$daily_stats = $pdo->prepare("
SELECT
DATE(tp.played_at) as date,
COUNT(*) as plays
FROM track_plays tp
JOIN music_tracks mt ON tp.track_id = mt.id
WHERE mt.user_id = ?
AND tp.played_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(tp.played_at)
ORDER BY date DESC
");
$daily_stats->execute([$user_id]);
$daily_plays = $daily_stats->fetchAll() ?: [];
}
} catch (Exception $e) {
echo '<div style="padding: 2rem; text-align: center; color: #ef4444; background: rgba(239, 68, 68, 0.1); border-radius: 12px; margin: 2rem;">';
echo '<h3 style="color: #ef4444; margin-bottom: 1rem;">' . t('analytics.error_loading') . '</h3>';
echo '<p>' . htmlspecialchars($e->getMessage()) . '</p>';
echo '</div>';
return;
}
?>
<style>
.analytics-dashboard {
background: rgba(255, 255, 255, 0.02);
border-radius: 24px;
padding: 3rem;
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(20px);
margin-bottom: 2rem;
}
.analytics-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 3rem;
padding-bottom: 2rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.analytics-title {
font-size: 2.8rem;
font-weight: 800;
color: white;
margin: 0;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.analytics-subtitle {
font-size: 1.4rem;
color: #a0aec0;
margin: 0.5rem 0 0 0;
font-weight: 400;
}
.analytics-stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
margin-bottom: 3rem;
}
.analytics-stat-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 2rem;
text-align: center;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.analytics-stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(135deg, #667eea, #764ba2);
opacity: 0;
transition: opacity 0.3s ease;
}
.analytics-stat-card:hover::before {
opacity: 1;
}
.analytics-stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
border-color: rgba(102, 126, 234, 0.3);
}
.stat-number {
font-size: 3rem;
font-weight: 800;
color: white;
margin-bottom: 0.5rem;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.stat-label {
font-size: 1.2rem;
color: #a0aec0;
font-weight: 500;
margin-bottom: 1rem;
}
.stat-trend {
font-size: 1rem;
font-weight: 600;
padding: 0.5rem 1rem;
border-radius: 20px;
display: inline-block;
}
.stat-trend.positive {
background: rgba(72, 187, 120, 0.2);
color: #48bb78;
border: 1px solid rgba(72, 187, 120, 0.3);
}
.stat-trend.negative {
background: rgba(239, 68, 68, 0.2);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.analytics-section {
background: rgba(255, 255, 255, 0.03);
border-radius: 20px;
padding: 2.5rem;
margin-bottom: 3rem;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.section-title {
font-size: 2rem;
font-weight: 700;
color: white;
margin-bottom: 2rem;
display: flex;
align-items: center;
gap: 1rem;
}
.track-analytics-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
}
.track-analytics-card {
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
padding: 2rem;
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
}
.track-analytics-card:hover {
transform: translateY(-3px);
border-color: rgba(102, 126, 234, 0.3);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2);
}
.track-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 1.5rem;
}
.track-title {
font-size: 1.3rem;
font-weight: 600;
color: white;
margin-bottom: 0.5rem;
}
.track-date {
font-size: 0.9rem;
color: #a0aec0;
}
.track-metrics {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1.5rem;
margin-bottom: 1.5rem;
}
.metric-item {
text-align: center;
padding: 1rem;
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.metric-value {
font-size: 1.8rem;
font-weight: 700;
color: white;
margin-bottom: 0.25rem;
}
.metric-label {
font-size: 0.9rem;
color: #a0aec0;
font-weight: 500;
}
.engagement-bar {
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
height: 8px;
margin: 1rem 0;
overflow: hidden;
}
.engagement-fill {
height: 100%;
background: linear-gradient(135deg, #667eea, #764ba2);
border-radius: 8px;
transition: width 0.3s ease;
}
.conversion-rate {
text-align: center;
padding: 1rem;
background: rgba(72, 187, 120, 0.1);
border-radius: 12px;
border: 1px solid rgba(72, 187, 120, 0.2);
}
.conversion-value {
font-size: 1.5rem;
font-weight: 700;
color: #48bb78;
margin-bottom: 0.25rem;
}
.conversion-label {
font-size: 0.8rem;
color: #a0aec0;
}
.performance-chart {
background: rgba(255, 255, 255, 0.03);
border-radius: 16px;
padding: 2rem;
border: 1px solid rgba(255, 255, 255, 0.08);
margin-top: 2rem;
}
.chart-placeholder {
height: 200px;
display: flex;
align-items: center;
justify-content: center;
color: #a0aec0;
font-size: 1.1rem;
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
border: 2px dashed rgba(255, 255, 255, 0.1);
}
@media (max-width: 768px) {
.analytics-dashboard {
padding: 2rem;
}
.analytics-stats-grid {
grid-template-columns: 1fr;
gap: 1.5rem;
}
.stat-number {
font-size: 2.5rem;
}
.track-analytics-grid {
grid-template-columns: 1fr;
}
.track-metrics {
grid-template-columns: 1fr;
}
}
</style>
<div class="analytics-dashboard">
<div class="analytics-header">
<div>
<h2 class="analytics-title">📊 <?= t('analytics.title') ?></h2>
<p class="analytics-subtitle"><?= t('analytics.subtitle') ?></p>
</div>
<div style="text-align: right;">
<div style="font-size: 1.2rem; color: #667eea; font-weight: 600;"><?= t('analytics.dashboard') ?></div>
<div style="font-size: 0.9rem; color: #a0aec0;"><?= t('analytics.real_time_insights') ?></div>
</div>
</div>
<!-- <?= t('analytics.key_performance_stats') ?> -->
<div class="analytics-stats-grid">
<div class="analytics-stat-card">
<div class="stat-number"><?= number_format($total_plays) ?></div>
<div class="stat-label"><?= t('analytics.total_plays') ?></div>
<div class="stat-trend positive"><?= t('analytics.percent_this_week', ['percent' => '+23%']) ?></div>
</div>
<div class="analytics-stat-card">
<div class="stat-number" style="color: #48bb78;"><?= number_format($total_likes) ?></div>
<div class="stat-label"><?= t('analytics.total_likes') ?></div>
<div class="stat-trend positive"><?= t('analytics.percent_this_week', ['percent' => '+18%']) ?></div>
</div>
<div class="analytics-stat-card">
<div class="stat-number" style="color: #ed8936;"><?= number_format($total_comments) ?></div>
<div class="stat-label"><?= t('analytics.total_comments') ?></div>
<div class="stat-trend positive"><?= t('analytics.percent_this_week', ['percent' => '+12%']) ?></div>
</div>
<div class="analytics-stat-card">
<div class="stat-number" style="color: #4299e1;"><?= number_format($total_views) ?></div>
<div class="stat-label"><?= t('analytics.total_views') ?></div>
<div class="stat-trend positive"><?= t('analytics.percent_this_week', ['percent' => '+31%']) ?></div>
</div>
</div>
<!-- <?= t('analytics.engagement_metrics') ?> -->
<div class="analytics-section">
<h3 class="section-title">
<i class="fas fa-chart-line" style="color: #667eea;"></i>
<?= t('analytics.engagement_overview') ?>
</h3>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem;">
<div class="track-analytics-card">
<div class="track-header">
<div>
<div class="track-title"><?= t('analytics.average_engagement_rate') ?></div>
<div class="track-date"><?= t('analytics.across_all_tracks') ?></div>
</div>
<div style="font-size: 2rem; color: #667eea;">
<i class="fas fa-users"></i>
</div>
</div>
<div class="metric-item">
<div class="metric-value" style="color: #667eea;"><?= number_format($avg_engagement, 1) ?>%</div>
<div class="metric-label"><?= t('analytics.engagement_rate') ?></div>
</div>
<div class="engagement-bar">
<div class="engagement-fill" style="width: <?= min($avg_engagement, 100) ?>%;"></div>
</div>
<div style="text-align: center; margin-top: 1rem; color: #a0aec0; font-size: 0.9rem;">
<?= t('analytics.based_on_plays_likes_comments') ?>
</div>
</div>
<div class="track-analytics-card">
<div class="track-header">
<div>
<div class="track-title"><?= t('analytics.conversion_performance') ?></div>
<div class="track-date"><?= t('analytics.views_to_sales') ?></div>
</div>
<div style="font-size: 2rem; color: #48bb78;">
<i class="fas fa-chart-pie"></i>
</div>
</div>
<div class="conversion-rate">
<div class="conversion-value"><?= number_format($avg_conversion, 2) ?>%</div>
<div class="conversion-label"><?= t('analytics.conversion_rate') ?></div>
</div>
<div style="text-align: center; margin-top: 1rem; color: #a0aec0; font-size: 0.9rem;">
<?= t('analytics.tracks_with_sales', ['count' => $tracks_with_sales]) ?>
</div>
</div>
</div>
</div>
<!-- <?= t('analytics.track_performance') ?> -->
<div class="analytics-section">
<h3 class="section-title">
<i class="fas fa-music" style="color: #667eea;"></i>
<?= t('analytics.track_performance') ?>
</h3>
<?php if (empty($track_analytics)): ?>
<div style="text-align: center; padding: 3rem; color: #a0aec0;">
<i class="fas fa-chart-bar" style="font-size: 4rem; margin-bottom: 1rem; opacity: 0.3;"></i>
<h3><?= t('analytics.no_completed_tracks') ?></h3>
<p><?= t('analytics.track_analytics_will_appear') ?></p>
</div>
<?php else: ?>
<div class="track-analytics-grid">
<?php foreach (array_slice($track_analytics, 0, 6) as $track): ?>
<?php
$engagement_rate = $track['total_views'] > 0 ?
(($track['total_plays'] + $track['total_likes'] + $track['total_comments']) / $track['total_views']) * 100 : 0;
$conversion_rate = $track['total_views'] > 0 ?
($track['total_sales'] / $track['total_views']) * 100 : 0;
?>
<div class="track-analytics-card">
<div class="track-header">
<div>
<div class="track-title"><?= htmlspecialchars($track['title']) ?></div>
<div class="track-date"><?= date('M j, Y', strtotime($track['created_at'])) ?></div>
</div>
<div style="font-size: 1.5rem; color: #667eea;">
<i class="fas fa-chart-line"></i>
</div>
</div>
<div class="track-metrics">
<div class="metric-item">
<div class="metric-value"><?= number_format($track['total_plays']) ?></div>
<div class="metric-label"><?= t('analytics.plays') ?></div>
</div>
<div class="metric-item">
<div class="metric-value" style="color: #48bb78;"><?= number_format($track['total_likes']) ?></div>
<div class="metric-label"><?= t('analytics.likes') ?></div>
</div>
<div class="metric-item">
<div class="metric-value" style="color: #ed8936;"><?= number_format($track['total_comments']) ?></div>
<div class="metric-label"><?= t('analytics.comments') ?></div>
</div>
<div class="metric-item">
<div class="metric-value" style="color: #4299e1;"><?= number_format($track['total_views']) ?></div>
<div class="metric-label"><?= t('analytics.views') ?></div>
</div>
</div>
<div class="engagement-bar">
<div class="engagement-fill" style="width: <?= min($engagement_rate, 100) ?>%;"></div>
</div>
<div style="display: flex; justify-content: space-between; align-items: center; margin-top: 1rem;">
<div style="text-align: center;">
<div style="font-size: 1.1rem; font-weight: 600; color: #667eea;"><?= number_format($engagement_rate, 1) ?>%</div>
<div style="font-size: 0.8rem; color: #a0aec0;"><?= t('analytics.engagement') ?></div>
</div>
<div style="text-align: center;">
<div style="font-size: 1.1rem; font-weight: 600; color: #48bb78;"><?= number_format($conversion_rate, 2) ?>%</div>
<div style="font-size: 0.8rem; color: #a0aec0;"><?= t('analytics.conversion') ?></div>
</div>
<div style="text-align: center;">
<div style="font-size: 1.1rem; font-weight: 600; color: #ed8936;"><?= $track['total_sales'] ?></div>
<div style="font-size: 0.8rem; color: #a0aec0;"><?= t('analytics.sales') ?></div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<!-- <?= t('analytics.performance_chart') ?> -->
<div class="analytics-section">
<h3 class="section-title">
<i class="fas fa-chart-area" style="color: #667eea;"></i>
<?= t('analytics.play_activity') ?>
</h3>
<div class="performance-chart">
<?php if (empty($daily_plays)): ?>
<div class="chart-placeholder">
<div style="text-align: center;">
<i class="fas fa-chart-line" style="font-size: 3rem; margin-bottom: 1rem; opacity: 0.3;"></i>
<div><?= t('analytics.no_play_data') ?></div>
<div style="font-size: 0.9rem; margin-top: 0.5rem;"><?= t('analytics.play_activity_will_appear') ?></div>
</div>
</div>
<?php else: ?>
<?php
// Prepare data for chart
$max_plays = max(array_column($daily_plays, 'plays'));
$chart_data = array_reverse($daily_plays); // Show oldest to newest
?>
<div style="background: rgba(255, 255, 255, 0.02); border-radius: 12px; padding: 2rem; border: 1px solid rgba(255, 255, 255, 0.05);">
<div style="display: flex; justify-content: space-between; align-items: flex-end; height: 200px; gap: 2px; margin-bottom: 1.5rem; padding-bottom: 2rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1);">
<?php foreach ($chart_data as $day): ?>
<?php
$height_percent = $max_plays > 0 ? ($day['plays'] / $max_plays) * 100 : 0;
$date_obj = DateTime::createFromFormat('Y-m-d', $day['date']);
$day_label = $date_obj ? $date_obj->format('j') : substr($day['date'], -2);
// Use French month abbreviations
$month_names = ['Jan' => 'Jan', 'Feb' => 'Fév', 'Mar' => 'Mar', 'Apr' => 'Avr', 'May' => 'Mai', 'Jun' => 'Jun', 'Jul' => 'Jul', 'Aug' => 'Aoû', 'Sep' => 'Sep', 'Oct' => 'Oct', 'Nov' => 'Nov', 'Dec' => 'Déc'];
$month_abbr = $date_obj ? $date_obj->format('M') : '';
$month_label = isset($month_names[$month_abbr]) ? $month_names[$month_abbr] : $month_abbr;
?>
<div style="flex: 1; display: flex; flex-direction: column; align-items: center; gap: 0.5rem; position: relative;">
<div style="width: 100%; height: 180px; background: rgba(102, 126, 234, 0.1); border-radius: 4px 4px 0 0; position: relative; display: flex; align-items: flex-end;">
<div style="width: 100%; height: <?= max($height_percent, 3) ?>%; background: linear-gradient(180deg, #667eea, #764ba2); border-radius: 4px 4px 0 0; transition: height 0.3s ease; box-shadow: 0 -2px 10px rgba(102, 126, 234, 0.3); cursor: pointer;"
title="<?= $day['plays'] ?> <?= t('analytics.plays') ?> - <?= $date_obj ? $date_obj->format('M j, Y') : $day['date'] ?>"
onmouseover="this.style.background='linear-gradient(180deg, #764ba2, #667eea)'; this.style.transform='scaleY(1.05)';"
onmouseout="this.style.background='linear-gradient(180deg, #667eea, #764ba2)'; this.style.transform='scaleY(1)';">
</div>
</div>
<div style="font-size: 0.75rem; color: #a0aec0; text-align: center; margin-top: 0.5rem;">
<div style="font-weight: 600;"><?= $day_label ?></div>
<?php if ($day_label == '1' || $day === reset($chart_data)): ?>
<div style="font-size: 0.65rem; opacity: 0.7;"><?= $month_label ?></div>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
</div>
<div style="display: flex; justify-content: space-between; align-items: center; color: #a0aec0; font-size: 0.9rem;">
<div>
<?= t('analytics.days_of_data', ['count' => count($daily_plays)]) ?>
</div>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<div style="width: 12px; height: 12px; background: linear-gradient(180deg, #667eea, #764ba2); border-radius: 2px;"></div>
<span><?= t('analytics.max_plays') ?>: <?= number_format($max_plays) ?></span>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>