<?php
/**
 * DashboardWidget
 *
 * @package NotificationX\Admin
 */

namespace NotificationX\Admin;

use NotificationX\GetInstance;
use NotificationX\Core\Helper;
/**
 * Class for Dashboard Widget for Analytics.
 * @method static DashboardWidget get_instance($args = null)
 */
class DashboardWidget {
    /**
     * Instance of DashboardWidget
     *
     * @var DashboardWidget
     */
    use GetInstance;
    /**
     * Widget ID
     *
     * @constant string
     */
    const WIDGET_ID = 'nx_analytics_dashboard_widget';
    const ASSET_URL  = NOTIFICATIONX_ASSETS . 'admin/';
    const VIEWS_PATH = NOTIFICATIONX_INCLUDES . 'Admin/views/';
    /**
     * Widget Title
     *
     * @var string
     */
    protected $widget_name = null;

    /**
     * Constructor
     * Invoked automatically when object created
     */
    public function __construct(){
        if( Settings::get_instance()->get('settings.disable_dashboard_widget', false) ) {
            return;
        }
        if( ! Settings::get_instance()->get('settings.enable_analytics', true) ) {
            return;
        }
        $this->widget_name = __( 'NotificationX Analytics', 'notificationx' );
        add_action( 'wp_dashboard_setup', array( $this, 'widget_action' ) );
        add_action('admin_enqueue_scripts', [ $this, 'enqueue'] );
    }
    public function enqueue( $hook ){
        wp_register_style( 'nx-analytics-dashboard-widget', self::ASSET_URL . 'css/analytics-dashboard-widget.css', array(), NOTIFICATIONX_VERSION, 'all' );
    }
    /**
     * Admin Action callback
     * for wp_dashboard_setup
     *
     * @return void
     */
    public function widget_action(){
         if( ! current_user_can( 'read_notificationx_analytics' ) ) {
            return;
        }
        wp_add_dashboard_widget( self::WIDGET_ID, $this->widget_name, array( $this, 'widget_output' ) );
    }
    /**
     * Get all analytics data
     *
     * @return mixed
     */
    public function analytics_counter(){
        global $wpdb;

        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- False positive: the query is prepared via $this->wpdb->prepare(), which this sniff does not recognise, and only $wpdb->prefix table names are interpolated. Audited 2026-07-16.
        $results = $wpdb->get_row(
            "SELECT *, ( clicks/views ) * 100 as ctr FROM ( SELECT SUM(views) as views, SUM(clicks) as clicks FROM {$wpdb->prefix}nx_stats ) AS STATS",
            ARRAY_A
        );

        $views_link = admin_url( 'admin.php?page=nx-analytics&comparison=views' );
        $clicks_link = admin_url( 'admin.php?page=nx-analytics&comparison=clicks' );
        $ctr_link = admin_url( 'admin.php?page=nx-analytics&comparison=ctr' );

        $default = [
            'views_link'  => $views_link,
            'clicks_link' => $clicks_link,
            'ctr_link'    => $ctr_link,
            'views'       => 0,
            'clicks'      => 0,
            'ctr'         => 0,
        ];

        if( ! empty( $results ) ) {
            $_results = [];
            foreach( $results as $key => $value ) {
                if( $key === 'ctr' ) {
                    if( $value !== null ) {
                        $_results[ $key ] = round( $value, 2 );
                    }
                } else {
                    $_results[ $key ] = Helper::nice_number( $value );
                }
            }
            return array_merge( $default, $_results );
        }
        return $default;
    }
    /**
     * Widget Output
     *
     * @return mixed
     */
    public function widget_output(){
        extract( $this->analytics_counter() );
        $class = 'nx-analytics-widget';
        if( file_exists( self::VIEWS_PATH . 'analytics.views.php' ) ) {
            wp_enqueue_style('nx-analytics-dashboard-widget');
            return include_once self::VIEWS_PATH . 'analytics.views.php';
        }
    }
}
