esc_html__('Failed Logins', 'activity-log-pro'),
'value' => $security_stats['failed_logins'],
'icon' => '',
'color' => '#d32f2f',
'type' => 'security',
'link_url' => add_query_arg( array( 'alp_event_type' => 'security' ), $logs_base_url ),
),
array(
'label' => esc_html__('Successful Logins', 'activity-log-pro'),
'value' => $security_stats['successful_logins'],
'icon' => '',
'color' => '#388e3c',
'type' => 'security',
'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'login' ), $logs_base_url ),
),
array(
'label' => esc_html__('New User Registrations', 'activity-log-pro'),
'value' => $security_stats['new_users'],
'icon' => '',
'color' => '#1976d2',
'type' => 'security',
'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'registered' ), $logs_base_url ),
),
array(
'label' => esc_html__('Password Changes', 'activity-log-pro'),
'value' => $security_stats['password_changes'],
'icon' => '',
'color' => '#f57c00',
'type' => 'security',
'link_url' => add_query_arg( array( 'alp_event_type' => 'user', 'alp_action' => 'password_reset' ), $logs_base_url ),
),
);
}
/**
* Get business activity statistics configuration for today's panel.
*
* @param string $date Date in Y-m-d format.
* @return array Array of business statistics configuration.
*/
public static function get_business_stats_config($date) {
$business_stats = ACTLOGPRO_Database::get_business_daily_stats($date);
$logs_base_url = admin_url('admin.php?page=activity-log-pro');
return array(
array(
'label' => esc_html__('Publishing Activity', 'activity-log-pro'),
'value' => $business_stats['content_changes'],
'icon' => '',
'color' => '#388e3c',
'type' => 'business',
'link_url' => add_query_arg( array( 'alp_event_type' => 'post' ), $logs_base_url ),
),
array(
'label' => esc_html__('Plugin/Theme Activities', 'activity-log-pro'),
'value' => $business_stats['plugin_theme_activities'],
'icon' => '',
'color' => '#7b1fa2',
'type' => 'business',
'link_url' => add_query_arg( array( 'alp_event_type' => 'plugin' ), $logs_base_url ),
),
array(
'label' => esc_html__('Admin Setting Changes', 'activity-log-pro'),
'value' => $business_stats['admin_changes'],
'icon' => '',
'color' => '#f57c00',
'type' => 'business',
'link_url' => add_query_arg( array( 'alp_event_type' => 'option' ), $logs_base_url ),
),
array(
'label' => esc_html__('Media Activity', 'activity-log-pro'),
'value' => $business_stats['file_changes'],
'icon' => '',
'color' => '#00796b',
'type' => 'business',
'link_url' => add_query_arg( array( 'alp_event_type' => 'media' ), $logs_base_url ),
),
);
}
/**
* Get additional insights for security panel.
*
* @param string $date Date in Y-m-d format.
* @return array Array of insights.
*/
public static function get_security_insights($date) {
$security_stats = ACTLOGPRO_Database::get_security_daily_stats($date);
$most_active_user = ACTLOGPRO_Database::get_most_active_user_by_date($date);
$insights = array();
// Security ratio insight
$total_logins = $security_stats['successful_logins'] + $security_stats['failed_logins'];
if ($total_logins > 0) {
$success_rate = round(($security_stats['successful_logins'] / $total_logins) * 100);
$insights[] = sprintf(
/* translators: %d: Login success rate percentage */
esc_html__('Login success rate: %d%%', 'activity-log-pro'),
$success_rate
);
}
// Failed login warning
if ($security_stats['failed_logins'] > 5) {
$insights[] = sprintf(
/* translators: %d: Number of failed logins */
esc_html__('⚠️ High number of failed logins detected: %d', 'activity-log-pro'),
$security_stats['failed_logins']
);
}
// Most active user
if ($most_active_user && isset($most_active_user['user_display_name'])) {
$insights[] = sprintf(
/* translators: %1$s: User display name, %2$d: Activity count */
esc_html__('Most active user: %1$s (%2$d activities)', 'activity-log-pro'),
$most_active_user['user_display_name'],
$most_active_user['activity_count']
);
}
return $insights;
}
/**
* Get additional insights for business panel.
*
* @param string $date Date in Y-m-d format.
* @return array Array of insights.
*/
public static function get_business_insights($date) {
$business_stats = ACTLOGPRO_Database::get_business_daily_stats($date);
$peak_hour = ACTLOGPRO_Database::get_peak_activity_hour_by_date($date);
$insights = array();
// Content activity insight
if ($business_stats['content_changes'] > 0) {
$insights[] = sprintf(
/* translators: %d: Number of content changes */
esc_html__('📝 %d content modifications made today', 'activity-log-pro'),
$business_stats['content_changes']
);
}
// System changes insight
$system_changes = $business_stats['plugin_theme_activities'] + $business_stats['admin_changes'];
if ($system_changes > 0) {
$insights[] = sprintf(
/* translators: %d: Number of system changes */
esc_html__('⚙️ %d system configuration changes', 'activity-log-pro'),
$system_changes
);
}
// Peak activity hour
if ($peak_hour && isset($peak_hour['hour'])) {
$formatted_hour = sprintf('%02d:00', $peak_hour['hour']);
$insights[] = sprintf(
/* translators: %1$s: Hour in HH:MM format, %2$d: Activity count */
esc_html__('📊 Peak activity time: %1$s (%2$d events)', 'activity-log-pro'),
$formatted_hour,
$peak_hour['activity_count']
);
}
return $insights;
}
/**
* Get user's preferred stats view type.
*
* @return string 'security' or 'business'
*/
public static function get_user_preferred_view() {
$user_id = get_current_user_id();
$preference = get_user_meta($user_id, 'actlogpro_stats_view_preference', true);
// Default to security view if no preference set
return !empty($preference) ? $preference : 'security';
}
/**
* Set user's preferred stats view type.
*
* @param string $view_type 'security' or 'business'
* @return bool True on success, false on failure.
*/
public static function set_user_preferred_view($view_type) {
if (!in_array($view_type, array('security', 'business'), true)) {
return false;
}
$user_id = get_current_user_id();
if (!$user_id) {
return false;
}
return update_user_meta($user_id, 'actlogpro_stats_view_preference', $view_type);
}
/**
* Get CSS color value for stat card.
*
* @param string $color Color value.
* @return string CSS color string.
*/
public static function get_stat_card_css($color) {
$safe_color = self::sanitize_color($color);
return sprintf(
'--stat-color: %s; --stat-color-light: %s20; --stat-color-border: %s40;',
$safe_color,
$safe_color,
$safe_color
);
}
/**
* Sanitize color value.
*
* @param string $color Color value.
* @return string Sanitized color.
*/
public static function sanitize_color($color) {
// Simple hex color validation
return preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/', $color) ? $color : '#000000';
}
/**
* Refresh statistics cache manually.
*
* @since 1.0.0
*/
public static function refresh_stats_cache() {
// Invalidate all log-related caches
ACTLOGPRO_Database::invalidate_log_caches();
// Get today's date
$today = current_time('Y-m-d');
// Pre-warm the cache by getting fresh stats
$security_stats = ACTLOGPRO_Database::get_security_daily_stats($today);
$business_stats = ACTLOGPRO_Database::get_business_daily_stats($today);
$most_active_user = ACTLOGPRO_Database::get_most_active_user_by_date($today);
$peak_hour = ACTLOGPRO_Database::get_peak_activity_hour_by_date($today);
return true;
}
}