Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/mets.corals.io/wp-content/plugins/wp-analytify/classes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/mets.corals.io/wp-content/plugins/wp-analytify/classes/analytify-rest-api.php
<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
/**
 * Handle Analytify REST API endpoints
 */
class Analytify_Rest_API {

	/**
	 * The single instance of the class.
	 *
	 * @var object
	 */
	private static $instance;

	/**
	 * The main Analytify object.
	 *
	 * @var object
	 */
	private $wp_analytify;

	/**
	 * GA version (ga4 or ga3).
	 *
	 * @var string
	 */
	private $ga_mode;

	/**
	 * Selected 'start state'.
	 *
	 * @var string
	 */
	private $start_date;

	/**
	 * Selected 'End state'.
	 *
	 * @var string
	 */
	private $end_date;

	/**
	 * Set 'date differ'.
	 *
	 * @var string
	 */
	private $date_differ;

	/**
	 * Post ID (optional).
	 *
	 * @var string
	 */
	private $post_id;

	/**
	 * Set compare 'start state'.
	 *
	 * @var string
	 */
	private $compare_start_date = null;

	/**
	 * Set compare 'End state'.
	 *
	 * @var string
	 */
	private $compare_end_date = null;

	/**
	 * Set compare number of days.
	 *
	 * @var string
	 */
	private $compare_days = null;

	/**
	 * Returns the single instance of the class.
	 *
	 * @return object Class instance
	 */
	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class constructor.
	 *
	 * @return void
	 */
	private function __construct() {

		// Register API endpoints.
		add_action( 'rest_api_init', array( $this, 'analytify_rest_api_init' ) );

		// Formate 'general_statistics' footer, add labels and description.
		add_filter( 'analytify_general_stats_footer', array( $this, 'general_stats_footer' ), 10, 2 );

		add_filter( 'analytify_single_post_sections', array( $this, 'single_post_sections' ), 10, 3 );
	}

	/**
	 * Register end point.
	 *
	 * @return void
	 */
	public function analytify_rest_api_init() {

		$this->wp_analytify = $GLOBALS['WP_ANALYTIFY'];
		$this->ga_mode      = WPANALYTIFY_Utils::get_ga_mode();

		register_rest_route(
			'wp-analytify/v1',
			'/get_report/(?P<request_type>[a-zA-Z0-9-]+)',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE, // Get Request.
					'callback'            => array( $this, 'handle_request' ),
					'permission_callback' => array( $this, 'permission_check' ),
					// 'permission_callback' => '__return_true',
				),
			)
		);
	}

	/**
	 * Checks access permission.
	 * Checks if the user is logged-in and checks if the user role has access.
	 *
	 * @return boolean
	 */
	public function permission_check( $data ) {

		// If the route is for single post stats.
		if ( strpos( $data->get_route(), 'single-post-stats' ) ) {
			$is_access_level = $this->wp_analytify->settings->get_option( 'show_analytics_roles_back_end', 'wp-analytify-admin', array( 'administrator' ) );
			return (bool) $this->wp_analytify->pa_check_roles( $is_access_level );
		}

		$is_access_level = $this->wp_analytify->settings->get_option( 'show_analytics_roles_dashboard', 'wp-analytify-dashboard', array( 'administrator' ) );
		return (bool) $this->wp_analytify->pa_check_roles( $is_access_level );
	}

	/**
	 * Handle the request.
	 *
	 * @param WP_REST_Request $request WP REST request object.
	 * @return array|WP_Error
	 */
	public function handle_request( WP_REST_Request $request ) {
		$request_type = $request->get_param( 'request_type' );

		$this->start_date  = $request->get_param( 'sd' );
		$this->end_date    = $request->get_param( 'ed' );
		$this->date_differ = $request->get_param( 'd_diff' );
		$this->post_id     = $request->get_param( 'post_id' );

		if ( ! $this->start_date ) {
			$this->start_date = wp_date( 'Y-m-d', strtotime( '-30 days', current_time( 'timestamp' ) ) );
		}
		if ( ! $this->end_date ) {
			$this->end_date = wp_date( 'Y-m-d', current_time( 'timestamp' ) );
		}
		if ( $this->date_differ ) {
			update_option( 'analytify_date_differ', $this->date_differ );
		}


		switch ( $request_type ) {
			case 'general-stats':
				return $this->general_stats();
			case 'top-pages-stats':
				return $this->top_pages_stats();
			case 'geographic-stats':
				return $this->geographic_stats();
			case 'system-stats':
				return $this->system_stats();
			case 'keyword-stats':
				return $this->keyword_stats();
			case 'social-stats':
				return $this->social_stats();
			case 'referer-stats':
				return $this->get_referer_stats();
			case 'what-is-happening-stats':
				return $this->get_what_is_happening_stats();
			case 'single-post-stats':
				return $this->get_single_post_stats();
		}

		// If no request type match, Return error.
		return new WP_Error( 'analytify_invalid_endpoint', esc_html__( 'Invalid endpoint.', 'wp-analytify' ), array( 'status' => 404 ) );
	}

	/**
	 * Get general stats.
	 *
	 * @return array
	 */
	private function general_stats() {

		$this->set_compare_dates();

		// Container all the text information about the stats in boxes.
		$boxes_description = array(
			'sessions'         => array(
				'title'       => esc_html__( 'Sessions', 'wp-analytify' ),
				'description' => esc_html__( 'A session is a time period in which a user is actively engaged with your website.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
			'visitors'         => array(
				'title'       => esc_html__( 'Visitors', 'wp-analytify' ),
				'description' => esc_html__( 'Users who complete a minimum of one session on your website.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
			'pageviews'        => array(
				'title'       => esc_html__( 'Page Views', 'wp-analytify' ),
				'description' => esc_html__( 'Page Views are the total number of Pageviews, these include repeated views.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
			'avg_time_on_site' => array(
				'title'       => esc_html__( 'Avg. Time on Site', 'wp-analytify' ),
				'description' => esc_html__( 'Total time that a single user spends on your website.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
			'bounce_rate'      => array(
				'title'       => esc_html__( 'Bounce Rate', 'wp-analytify' ),
				'description' => esc_html__( 'Percentage of single page visits (i.e number of visits in which a visitor leaves your website from the landing page without browsing your website).', 'wp-analytify' ),
				'append'      => '<span class="analytify_xl_f">%</span>',
				'bottom'      => false,
				'number'      => 0,
			),
			'pages_session'    => array(
				'title'       => esc_html__( 'Pages per Session', 'wp-analytify' ),
				'description' => esc_html__( 'Pages per Session is the number of pages viewed by a user during a single session. Repeated views are counted.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
			// 'new_sessions' is only for UA.
			'new_sessions'     => array(
				'title'       => esc_html__( '% New Sessions', 'wp-analytify' ),
				'description' => esc_html__( 'A new session is the time period when a new user comes to your website and is actively engaged with your website.', 'wp-analytify' ),
				'append'      => '<span class="analytify_xl_f">%</span>',
				'bottom'      => false,
				'number'      => 0,
			),
			// 'engaged_sessions' is only for GA4.
			'engaged_sessions' => array(
				'title'       => esc_html__( 'Engaged Sessions', 'wp-analytify' ),
				'description' => esc_html__( 'The number of sessions that lasted longer than 10 seconds, or had a conversion event, or had 2 or more page views.', 'wp-analytify' ),
				'bottom'      => false,
				'number'      => 0,
			),
		);
		$chart_description = array(
			'new_vs_returning_visitors' => array(
				'title'  => esc_html__( 'New vs Returning Visitors', 'wp-analytify' ),
				'type'   => 'PIE',
				'stats'  => array(
					'new'       => array(
						'label'  => esc_html__( 'New', 'wp-analytify' ),
						'number' => 0,
					),
					'returning' => array(
						'label'  => esc_html__( 'Returning', 'wp-analytify' ),
						'number' => 0,
					),
				),
				'colors' => apply_filters( 'analytify_new_vs_returning_visitors_chart_colors', array( '#03a1f8', '#00c853' ) ),
			),
			'visitor_devices'           => array(
				'title'  => esc_html__( 'Devices of Visitors', 'wp-analytify' ),
				'type'   => 'PIE',
				'stats'  => array(
					'mobile'  => array(
						'label'  => esc_html__( 'Mobile', 'wp-analytify' ),
						'number' => 0,
					),
					'tablet'  => array(
						'label'  => esc_html__( 'Tablet', 'wp-analytify' ),
						'number' => 0,
					),
					'desktop' => array(
						'label'  => esc_html__( 'Desktop', 'wp-analytify' ),
						'number' => 0,
					),
				),
				'colors' => apply_filters( 'analytify_visitor_devices_chart_colors', array( '#444444', '#ffbc00', '#ff5252' ) ),
			),
		);

		$footer_description = false;

		// Container numbers (or string) for the different stats.
		$boxes_stats = array();

		if ( 'ga4' === $this->ga_mode ) {

			unset( $boxes_description['new_sessions'] );

			$general_stats_raw = $this->wp_analytify->get_reports('show-default-overall-dashboard', array(
					'sessions',
					'totalUsers',
					'screenPageViews',
					'averageSessionDuration',
					'bounceRate',
					'screenPageViewsPerSession',
					'engagedSessions',
					'userEngagementDuration',
					'newUsers',
					'activeUsers',
				), $this->get_dates());

			$device_category_stats = $this->wp_analytify->get_reports(
				'show-default-overall-device-dashboard',
				array(
					'sessions',
				),
				$this->get_dates(),
				array(
					'deviceCategory',
				),
				array(
					'type' => 'dimension',
					'name' => 'deviceCategory',
				)
			);

			$general_stats = $general_stats_raw['aggregations'];
			// code added by jawad during debug added isset checks on number field.
			$boxes_stats = array(
				'sessions'         => array(
					'raw'    => isset( $general_stats['sessions'] ) ? $general_stats['sessions'] : 0,
					'number' => isset( $general_stats['sessions'] ) ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['sessions'] ) : 0,
				),

				'visitors'         => array(
					'raw'    => isset( $general_stats['totalUsers'] ) ? $general_stats['totalUsers'] : 0,
					'number' => isset( $general_stats['totalUsers'] ) ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['totalUsers'] ) : 0,
				),

				'pageviews'        => array(
					'raw'    => isset( $general_stats['screenPageViews'] ) ? $general_stats['screenPageViews'] : 0,
					'number' => isset( $general_stats['screenPageViews'] ) ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['screenPageViews'] ) : 0,
				),

				'avg_time_on_site' => array(
					'raw'    => isset( $general_stats['averageSessionDuration'] ) ? $general_stats['averageSessionDuration'] : 0,
					'number' => isset( $general_stats['averageSessionDuration'] ) ? WPANALYTIFY_Utils::pretty_time( $general_stats['averageSessionDuration'] ) : 0,
				),

				'bounce_rate'      => array(
					'raw'    => isset( $general_stats['bounceRate'] ) ? $general_stats['bounceRate'] : 0,
					'number' => isset( $general_stats['bounceRate'] ) ? WPANALYTIFY_Utils::fraction_to_percentage( $general_stats['bounceRate'] ) : 0,
				),

				'pages_session'    => array(
					'raw'    => isset( $general_stats['screenPageViewsPerSession'] ) ? $general_stats['screenPageViewsPerSession'] : 0,
					'number' => isset( $general_stats['screenPageViewsPerSession'] ) ? round( $general_stats['screenPageViewsPerSession'], 2 ) : 0,
				),

				'engaged_sessions' => array(
					'raw'    => isset( $general_stats['engagedSessions'] ) ? $general_stats['engagedSessions'] : 0,
					'number' => isset( $general_stats['engagedSessions'] ) ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['engagedSessions'] ) : 0,
				),
			);

			if ( $this->compare_start_date && $this->compare_end_date ) {
				$compare_stats_raw = $this->wp_analytify->get_reports(
					'show-default-overall-dashboard-compare',
					array(
						'sessions',
						'totalUsers',
						'screenPageViews',
						'averageSessionDuration',
						'bounceRate',
						'screenPageViewsPerSession',
						'engagedSessions',
					),
					array(
						'start' => $this->compare_start_date,
						'end'   => $this->compare_end_date,
					)
				);
			}

			if ( isset( $compare_stats_raw['aggregations'] ) ) {
				$compare_stats = array(
					'sessions'         => isset( $compare_stats_raw['aggregations']['sessions'] ) ? $compare_stats_raw['aggregations']['sessions'] : 0,
					'visitors'         => isset( $compare_stats_raw['aggregations']['totalUsers'] ) ? $compare_stats_raw['aggregations']['totalUsers'] : 0,
					'pageviews'        => isset( $compare_stats_raw['aggregations']['screenPageViews'] ) ? $compare_stats_raw['aggregations']['screenPageViews'] : 0,
					'avg_time_on_site' => isset( $compare_stats_raw['aggregations']['averageSessionDuration'] ) ? $compare_stats_raw['aggregations']['averageSessionDuration'] : 0,
					'bounce_rate'      => isset( $compare_stats_raw['aggregations']['bounceRate'] ) ? $compare_stats_raw['aggregations']['bounceRate'] : 0,
					'pages_session'    => isset( $compare_stats_raw['aggregations']['screenPageViewsPerSession'] ) ? $compare_stats_raw['aggregations']['screenPageViewsPerSession'] : 0,
					'engaged_sessions' => isset( $compare_stats_raw['aggregations']['engagedSessions'] ) ? $compare_stats_raw['aggregations']['engagedSessions'] : 0,
				);
			}

			if ( isset( $general_stats['newUsers'] ) ) {
				$chart_description['new_vs_returning_visitors']['stats']['new']['number'] = $general_stats['newUsers'];
			}

			if ( isset( $general_stats['activeUsers'] ) ) {
				$chart_description['new_vs_returning_visitors']['stats']['returning']['number'] = $general_stats['activeUsers'];
			}

			if ( $device_category_stats['rows'] ) {
				foreach ( $device_category_stats['rows'] as $device ) {
					$chart_description['visitor_devices']['stats'][ $device['deviceCategory'] ]['number'] = $device['sessions'];
				}
			}

			if ( isset( $general_stats['userEngagementDuration'] ) ) {
				$footer_description = apply_filters( 'analytify_general_stats_footer', $general_stats['userEngagementDuration'], array( $this->start_date, $this->end_date ) );
			}
		} else {

			unset( $boxes_description['engaged_sessions'] );

			$general_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions,ga:users,ga:pageviews,ga:avgSessionDuration,ga:bounceRate,ga:pageviewsPerSession,ga:percentNewSessions,ga:newUsers,ga:sessionDuration', $this->start_date, $this->end_date, false, false, false, false, 'show-default-overall-dashboard' );

			// New vs returning users.
			$new_returning_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:users', $this->start_date, $this->end_date, 'ga:userType', false, false, false, 'show-default-new-returning-dashboard' );

			// Device category.
			$device_category_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:deviceCategory', '-ga:sessions', false, false, 'show-default-overall-device-dashboard' );

			// Get prev stats.
			if ( $this->compare_start_date && $this->compare_end_date ) {
				$compare_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions,ga:users,ga:pageviews,ga:avgSessionDuration,ga:bounceRate,ga:pageviewsPerSession,ga:percentNewSessions,ga:newUsers', $this->compare_start_date, $this->compare_end_date, false, false, false, false, 'show-default-overall-dashboard-compare' );
			}

			if ( isset( $general_stats_raw['totalsForAllResults'] ) && $general_stats_raw['totalsForAllResults'] ) {
				$general_stats = $general_stats_raw['totalsForAllResults'];
				$boxes_stats   = array(
					'sessions'         => array(
						'raw'    => $general_stats['ga:sessions'],
						'number' => $general_stats['ga:sessions'] ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['ga:sessions'] ) : 0,
					),

					'visitors'         => array(
						'raw'    => $general_stats['ga:users'],
						'number' => $general_stats['ga:users'] ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['ga:users'] ) : 0,
					),

					'pageviews'        => array(
						'raw'    => $general_stats['ga:pageviews'],
						'number' => $general_stats['ga:pageviews'] ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['ga:pageviews'] ) : 0,
					),

					'avg_time_on_site' => array(
						'raw'    => $general_stats['ga:avgSessionDuration'],
						'number' => $general_stats['ga:avgSessionDuration'] ? WPANALYTIFY_Utils::pretty_time( $general_stats['ga:avgSessionDuration'] ) : 0,
					),

					'bounce_rate'      => array(
						'raw'    => $general_stats['ga:bounceRate'],
						'number' => $general_stats['ga:bounceRate'] ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['ga:bounceRate'] ) : 0,
					),

					'pages_session'    => array(
						'raw'    => $general_stats['ga:pageviewsPerSession'],
						'number' => $general_stats['ga:pageviewsPerSession'] ? round( $general_stats['ga:pageviewsPerSession'], 2 ) : 0,
					),

					'new_sessions'     => array(
						'raw'    => $general_stats['ga:percentNewSessions'],
						'number' => $general_stats['ga:percentNewSessions'] ? WPANALYTIFY_Utils::pretty_numbers( $general_stats['ga:percentNewSessions'] ) : 0,
					),
				);
			}

			if ( isset( $compare_stats_raw['totalsForAllResults'] ) ) {
				$compare_stats = array(
					'sessions'         => $compare_stats_raw['totalsForAllResults']['ga:sessions'],
					'visitors'         => $compare_stats_raw['totalsForAllResults']['ga:users'],
					'pageviews'        => $compare_stats_raw['totalsForAllResults']['ga:pageviews'],
					'avg_time_on_site' => $compare_stats_raw['totalsForAllResults']['ga:avgSessionDuration'],
					'bounce_rate'      => $compare_stats_raw['totalsForAllResults']['ga:bounceRate'],
					'pages_session'    => $compare_stats_raw['totalsForAllResults']['ga:pageviewsPerSession'],
					'new_sessions'     => $compare_stats_raw['totalsForAllResults']['ga:percentNewSessions'],
				);
			}

			if ( isset( $new_returning_stats_raw['rows'][0][1] ) ) {
				$chart_description['new_vs_returning_visitors']['stats']['new']['number'] = $new_returning_stats_raw['rows'][0][1];
			}

			if ( isset( $new_returning_stats_raw['rows'][1][1] ) ) {
				$chart_description['new_vs_returning_visitors']['stats']['returning']['number'] = $new_returning_stats_raw['rows'][1][1];
			}

			if ( isset( $device_category_stats_raw['rows'] ) && $device_category_stats_raw['rows'] ) {
				foreach ( $device_category_stats_raw['rows'] as $device ) {
					$chart_description['visitor_devices']['stats'][ $device[0] ]['number'] = $device[1];
				}
			}

			if ( isset( $general_stats_raw['totalsForAllResults']['ga:sessionDuration'] ) ) {
				$footer_description = apply_filters( 'analytify_general_stats_footer', $general_stats_raw['totalsForAllResults']['ga:sessionDuration'], array( $this->start_date, $this->end_date ) );
			}
		}

		foreach ( $boxes_description as $key => $box ) {
			if ( isset( $boxes_stats[ $key ] ) ) {
				$boxes_description[ $key ]['number'] = (string) $boxes_stats[ $key ]['number'];
				if ( isset( $compare_stats[ $key ] ) ) {
					$boxes_description[ $key ]['bottom'] = $this->compare_stat( $boxes_stats[ $key ]['raw'], $compare_stats[ $key ], $key );
				}
			}
		}

		return array(
			'success' => true,
			'boxes'   => apply_filters( 'analytify_general_stats_boxes', $boxes_description, array( $this->start_date, $this->end_date ) ),
			'charts'  => apply_filters( 'analytify_general_stats_charts', $chart_description, array( $this->start_date, $this->end_date ) ),
			'footer'  => $footer_description,
		);
	}

	/**
	 * Endpoint for 'Top pages by views'.
	 *
	 * @return array
	 */
	private function top_pages_stats() {

		// API limit for pages.
		$api_limit = apply_filters( 'analytify_api_limit_top_pages_stats', 50, 'dashboard' );

		// Site URL.
		$site_url = $this->get_profile_info( 'website_url' );

		$stats = array();

		if ( 'ga4' === $this->ga_mode ) {
			$stats_raw = $this->wp_analytify->get_reports('show-default-top-pages-dashboard', array(
					'screenPageViews',
					'averageSessionDuration',
					'bounceRate',
				), $this->get_dates(), array(
					'pageTitle',
					'pagePath',
				), array(
					'type'  => 'metric',
					'name'  => 'screenPageViews',
					'order' => 'desc',
				), array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'pageTitle',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
						array(
							'type'           => 'dimension',
							'name'           => 'pagePath',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				), $api_limit);
			if ( $stats_raw['rows'] ) {
				$no = 1;
				foreach ( $stats_raw['rows'] as $row ) {
					$views = $row['screenPageViews'] ? WPANALYTIFY_Utils::pretty_numbers( $row['screenPageViews'] ) : 0;
					if ( $views < 1 ) {
						continue;
					}
					$stats[] = array(
						'no'                     => null,
						'pageTitle'              => '<a href="' . $site_url . $row['pagePath'] . '" target="_blank">' . $row['pageTitle'] . '</a>',
						'screenPageViews'        => $views,
						'userEngagementDuration' => $row['averageSessionDuration'] ? WPANALYTIFY_Utils::pretty_time( $row['averageSessionDuration'] ) : 0,
						'bounceRate'             => $row['bounceRate'] ? WPANALYTIFY_Utils::fraction_to_percentage( $row['bounceRate'] ) . '%' : 0,
					);
				}
			}
		} else {
			$stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:pageviews,ga:avgTimeOnPage,ga:bounceRate', $this->start_date, $this->end_date, 'ga:PageTitle,ga:pagePath', '-ga:pageviews', false, $api_limit, 'show-default-top-pages-dashboard' );
			if ( isset( $stats_raw['rows'] ) && $stats_raw['rows'] ) {
				$no = 1;
				foreach ( $stats_raw['rows'] as $row ) {
					$stats[] = array(
						'no'                     => null,
						'pageTitle'              => '<a href="' . $site_url . $row[1] . '" target="_blank">' . $row[0] . '</a>',
						'screenPageViews'        => $row[2] ? WPANALYTIFY_Utils::pretty_numbers( $row[2] ) : 0,
						'userEngagementDuration' => $row[3] ? WPANALYTIFY_Utils::pretty_time( $row[3] ) : 0,
						'bounceRate'             => ( $row[4] ? WPANALYTIFY_Utils::pretty_numbers( $row[4] ) : 0 ) . '%',
					);
				}
			}
		}

		return array(
			'success'    => true,
			'headers'    => array(
				'no'                     => array(
					'label'    => esc_html__( '#', 'wp-analytify' ),
					'type'     => 'counter',
					'th_class' => 'analytify_num_row',
					'td_class' => 'analytify_txt_center',
				),
				'pageTitle'              => array(
					'label'    => esc_html__( 'Title', 'wp-analytify' ),
					'th_class' => 'analytify_txt_left',
					'td_class' => '',
				),
				'screenPageViews'        => array(
					'label'    => esc_html__( 'Views', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center analytify_value_row',
				),
				'userEngagementDuration' => array(
					'label'    => esc_html__( 'Avg. Time', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center analytify_value_row',
				),
				'bounceRate'             => array(
					'label'    => esc_html__( 'Bounce Rate', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center analytify_value_row',
				),
			),
			'stats'      => $stats,
			'pagination' => true,
			'footer'     => apply_filters( 'analytify_top_pages_footer', __( 'Top pages and posts.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Get Geography Stats (country and cities).
	 *
	 * @return array
	 */
	private function geographic_stats() {

		$this->set_compare_dates();

		// Limit for the table data.
		$country_limit = apply_filters( 'analytify_api_limit_country_stats', 5, 'dashboard' );

		// API limit for cities.
		$cities_limit = apply_filters( 'analytify_api_limit_city_stats', 5, 'dashboard' );

		$geo_map_data  = array();
		$country_stats = array();
		$city_stats    = array();

		$after_top_country_text = '';
		$after_top_city_text    = '';

		/**
		 * For Pro legacy support.
		 * CSV export button in generated by this action.
		 */
		ob_start();
		do_action( 'analytify_after_top_country_text' );
		$after_top_country_text .= ob_get_clean();

		ob_start();
		do_action( 'analytify_after_top_city_text' );
		$after_top_city_text .= ob_get_clean();

		if ( 'ga4' === $this->ga_mode ) {

			$dashboard_profile_id = WPANALYTIFY_Utils::get_reporting_property();
			$report_url           = WP_ANALYTIFY_FUNCTIONS::get_ga_report_url( $dashboard_profile_id );

			$after_top_country_text .= ' <a href="javascript: return false;" data-ga-dashboard-link="' . WPANALYTIFY_Utils::get_all_stats_link( $report_url, 'top_countries' ) . '" target="_blank" class="analytify_tooltip"><span class="analytify_tooltiptext">' . __( 'View All Top Countries', 'wp-analytify' ) . '</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>';

			$after_top_city_text .= ' <a href="javascript: return false;" data-ga-dashboard-link="' . WPANALYTIFY_Utils::get_all_stats_link( $report_url, 'top_cities' ) . '" target="_blank" class="analytify_tooltip"><span class="analytify_tooltiptext">' . __( 'View All Top Cities', 'wp-analytify' ) . '</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>';

			$country_stats_raw = $this->wp_analytify->get_reports(
				'show-geographic-countries-dashboard',
				array(
					'sessions',
				),
				$this->get_dates(),
				array(
					'country',
				),
				array(
					'type'  => 'dimension',
					'name'  => 'sessions',
					'order' => 'desc',
				),
				array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'country',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				)
			);

			$city_stats_raw = $this->wp_analytify->get_reports(
				'show-geographic-cities-dashboard',
				array(
					'sessions',
				),
				$this->get_dates(),
				array(
					'city',
					'country',
				),
				array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				),
				array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'city',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
						array(
							'type'           => 'dimension',
							'name'           => 'country',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				),
				$cities_limit
			);

			if ( $country_stats_raw['rows'] ) {
				$country_count = 0;
				foreach ( $country_stats_raw['rows'] as $row ) {
					if ( $country_count < $country_limit ) {
						$country_stats[] = array(
							'country'  => '<span class="analytify_' . str_replace( ' ', '_', strtolower( $row['country'] ) ) . ' analytify_flages"></span> ' . $row['country'],
							'sessions' => $row['sessions'],
						);
					}
					if ( 'United States' === $row['country'] ) {
						$row['country'] = 'United States of America';
					}
					$geo_map_data[] = $row;
					$country_count++;
				}
			}

			if ( $city_stats_raw['rows'] ) {
				foreach ( $city_stats_raw['rows'] as $row ) {
					$city_stats[] = array(
						'city'     => '<span class="analytify_' . str_replace( ' ', '_', strtolower( $row['country'] ) ) . ' analytify_flages"></span> ' . $row['city'],
						'sessions' => $row['sessions'],
					);
				}
			}
		} else {

			$country_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:country', '-ga:sessions', 'ga:country!=(not set)', false, 'show-geographic-countries-dashboard' );

			$city_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:city,ga:country', '-ga:sessions', 'ga:city!=(not set);ga:country!=(not set)', $cities_limit, 'show-geographic-cities-dashboard' );

			// Add keys to the array, to match GA4.
			if ( isset( $country_stats_raw['rows'] ) && $country_stats_raw['rows'] ) {
				$country_count = 0;
				foreach ( $country_stats_raw['rows'] as $row ) {
					if ( $country_count < $country_limit ) {
						$country_stats[] = array(
							'country'  => '<span class="analytify_' . str_replace( ' ', '_', strtolower( $row[0] ) ) . ' analytify_flages"></span> ' . $row[0],
							'sessions' => $row[1],
						);
					}
					$geo_map_data[] = array(
						'sessions' => $row[1],
						'country'  => 'United States' === $row[0] ? 'United States of America' : $row[0],
					);
					$country_count++;
				}
			}

			// Add keys to the array, to match GA4.
			if ( isset( $city_stats_raw['rows'] ) && $city_stats_raw['rows'] ) {
				foreach ( $city_stats_raw['rows'] as $row ) {
					$city_stats[] = array(
						'city'     => '<span class="analytify_' . str_replace( ' ', '_', strtolower( $row[1] ) ) . ' analytify_flages"></span> ' . $row[0],
						'sessions' => $row[2],
					);
				}
			}
		}

		$country = array(
			'headers' => array(
				'country'  => array(
					'label'    => esc_html__( 'Top Countries', 'wp-analytify' ) . $after_top_country_text,
					'th_class' => 'analytify_txt_left analytify_vt_middle analytify_top_geographic_detials_wraper',
					'td_class' => '',
				),
				'sessions' => array(
					'label'    => esc_html__( 'Visitors', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center',
				),
			),
			'stats'   => $country_stats,
		);

		$city = array(
			'headers' => array(
				'city'     => array(
					'label'    => esc_html__( 'Top Cities', 'wp-analytify' ) . $after_top_city_text,
					'th_class' => 'analytify_txt_left analytify_vt_middle analytify_top_geographic_detials_wraper analytify_brd_lft',
					'td_class' => 'analytify_boder_left',
				),
				'sessions' => array(
					'label'    => esc_html__( 'Visitors', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center',
				),
			),
			'stats'   => $city_stats,
		);

		return array(
			'success' => true,
			'map'     => array(
				'title'   => esc_html__( 'Geographic Stats', 'wp-analytify' ),
				'label'   => array(
					'high' => esc_html__( 'Hight', 'wp-analytify' ),
					'low'  => esc_html__( 'Low', 'wp-analytify' ),
				),
				'stats'   => $geo_map_data,
				'highest' => ! empty( $geo_map_data ) ? max( array_column( $geo_map_data, 'sessions' ) ) + 1 : 1,
				'colors'  => apply_filters( 'analytify_world_map_colors', array( '#ff5252', '#ffbc00', '#448aff' ) ),
			),
			'country' => $country,
			'city'    => $city,
			'footer'  => apply_filters( 'analytify_top_country_city_footer', __( 'Top countries and cities.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Endpoint for 'Tech Stats'.
	 *
	 * @return array
	 */
	private function system_stats() {

		// API limit.
		$browser_stats_limit = apply_filters( 'analytify_api_limit_browser_stats', 5, 'dashboard' );
		$os_stats_limit      = apply_filters( 'analytify_api_limit_os_stats', 5, 'dashboard' );
		$mobile_stats_limit  = apply_filters( 'analytify_api_limit_mobile_stats', 5, 'dashboard' );

		$browser_stats = array();
		$os_stats      = array();
		$mobile_stats  = array();

		if ( 'ga4' === $this->ga_mode ) {

			$browser_stats_raw = $this->wp_analytify->get_reports('show-default-browser-dashboard', array(
					'sessions',
				), $this->get_dates(), array(
					'browser',
					'operatingSystem',
				), array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				), array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'operatingSystem',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				), $browser_stats_limit);

			$os_stats_raw = $this->wp_analytify->get_reports('show-default-os-dashboard', array(
					'sessions',
				), $this->get_dates(), array(
					'operatingSystem',
					'operatingSystemVersion',
				), array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				), array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'operatingSystemVersion',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				), $os_stats_limit);

			$mobile_stats_raw = $this->wp_analytify->get_reports('show-default-mobile-dashboard', array(
					'sessions',
				), $this->get_dates(), array(
					'mobileDeviceBranding',
					'mobileDeviceModel',
				), array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				), array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'deviceCategory',
							'match_type'     => 4,
							'value'          => 'desktop',
							'not_expression' => true,
						),
						array(
							'type'           => 'dimension',
							'name'           => 'mobileDeviceModel',
							'match_type'     => 4,
							'value'          => '(not set)',
							'not_expression' => true,
						),
					),
				), $mobile_stats_limit);

			if ( isset( $browser_stats_raw['rows'] ) && $browser_stats_raw['rows'] ) {
				foreach ( $browser_stats_raw['rows'] as $row ) {
					$browser_stats[] = array(
						'browser'  => '<span class="' . pretty_class( $row['browser'] ) . ' analytify_social_icons"></span>' . '<span class="' . pretty_class( $row['operatingSystem'] ) . ' analytify_social_icons"></span>' . $row['browser'] . ' ' . $row['operatingSystem'],
						'sessions' => $row['sessions'],
					);
				}
			}

			if ( isset( $os_stats_raw['rows'] ) && $os_stats_raw['rows'] ) {
				foreach ( $os_stats_raw['rows'] as $row ) {
					$os_stats[] = array(
						'os'       => '<span class="' . pretty_class( $row['operatingSystem'] ) . ' analytify_social_icons"></span> ' . $row['operatingSystem'] . ' ' . $row['operatingSystemVersion'],
						'sessions' => $row['sessions'],
					);
				}
			}

			if ( isset( $mobile_stats_raw['rows'] ) && $mobile_stats_raw['rows'] ) {
				foreach ( $mobile_stats_raw['rows'] as $row ) {
					$mobile_stats[] = array(
						'mobile'   => '<span class="' . pretty_class( $row['mobileDeviceBranding'] ) . ' analytify_social_icons"></span> ' . $row['mobileDeviceBranding'] . ' ' . $row['mobileDeviceModel'],
						'sessions' => $row['sessions'],
					);
				}
			}
		} else {

			$browser_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:browser,ga:operatingSystem', '-ga:sessions', 'ga:browser!=(not set);ga:operatingSystem!=(not set)', $browser_stats_limit, 'show-default-browser-dashboard' );

			$os_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:operatingSystem,ga:operatingSystemVersion', '-ga:sessions', 'ga:operatingSystemVersion!=(not set)', $os_stats_limit, 'show-default-os-dashboard' );

			$mobile_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:mobileDeviceBranding,ga:mobileDeviceModel', '-ga:sessions', 'ga:mobileDeviceModel!=(not set);ga:mobileDeviceBranding!=(not set)', $mobile_stats_limit, 'show-default-mobile-dashboard' );

			if ( isset( $browser_stats_raw['rows'] ) && $browser_stats_raw['rows'] ) {
				foreach ( $browser_stats_raw['rows'] as $row ) {
					$browser_stats[] = array(
						'browser'  => '<span class="' . pretty_class( $row[0] ) . ' analytify_social_icons"></span>' . '<span class="' . pretty_class( $row[1] ) . ' analytify_social_icons"></span>' . $row[0] . ' ' . $row[1],
						'sessions' => $row[2],
					);
				}
			}

			if ( isset( $os_stats_raw['rows'] ) && $os_stats_raw['rows'] ) {
				foreach ( $os_stats_raw['rows'] as $row ) {
					$os_stats[] = array(
						'os'       => '<span class="' . pretty_class( $row[0] ) . ' analytify_social_icons"></span> ' . $row[0] . ' ' . $row[1],
						'sessions' => WPANALYTIFY_Utils::pretty_numbers( $row[2] ),
					);
				}
			}

			if ( isset( $mobile_stats_raw['rows'] ) && $mobile_stats_raw['rows'] ) {
				foreach ( $mobile_stats_raw['rows'] as $row ) {
					$mobile_stats[] = array(
						'mobile'   => '<span class="' . pretty_class( $row[0] ) . ' analytify_social_icons"></span> ' . $row[0] . ' ' . $row[1],
						'sessions' => WPANALYTIFY_Utils::pretty_numbers( $row[2] ),
					);
				}
			}
		}

		/**
		 * For Pro legacy support.
		 * CSV export button in generated by this action.
		 */

		$after_top_browser_text          = '';
		$after_top_operating_system_text = '';
		$after_top_mobile_device_text    = '';

		ob_start();
		do_action( 'analytify_after_top_browser_text' );
		$after_top_browser_text .= ob_get_clean();

		ob_start();
		do_action( 'analytify_after_top_operating_system_text' );
		$after_top_operating_system_text .= ob_get_clean();

		ob_start();
		do_action( 'analytify_after_top_mobile_device_text' );
		$after_top_mobile_device_text .= ob_get_clean();

		$browser = array(
			'headers' => array(
				'browser'  => array(
					'label'    => esc_html__( 'Browsers statistics', 'wp-analytify' ) . $after_top_browser_text,
					'th_class' => 'analytify_txt_left analytify_top_geographic_detials_wraper',
					'td_class' => '',
				),
				'sessions' => array(
					'label'    => esc_html__( 'Visits', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center',
				),
			),
			'stats'   => $browser_stats,
		);

		$os = array(
			'headers' => array(
				'os'       => array(
					'label'    => esc_html__( 'Operating system statistics', 'wp-analytify' ) . $after_top_operating_system_text,
					'th_class' => 'analytify_txt_left analytify_top_geographic_detials_wraper analytify_brd_lft',
					'td_class' => 'analytify_boder_left',
				),
				'sessions' => array(
					'label'    => esc_html__( 'Visits', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center',
				),
			),
			'stats'   => $os_stats,
		);

		$mobile = array(
			'headers' => array(
				'mobile'   => array(
					'label'    => esc_html__( 'Mobile device statistics', 'wp-analytify' ) . $after_top_mobile_device_text,
					'th_class' => 'analytify_txt_left analytify_top_geographic_detials_wraper analytify_brd_lft',
					'td_class' => 'analytify_boder_left',
				),
				'sessions' => array(
					'label'    => esc_html__( 'Visits', 'wp-analytify' ),
					'th_class' => 'analytify_value_row',
					'td_class' => 'analytify_txt_center',
				),
			),
			'stats'   => $mobile_stats,
		);

		return array(
			'success' => true,
			'browser' => $browser,
			'os'      => $os,
			'mobile'  => $mobile,
			'footer'  => apply_filters( 'analytify_system_stats_footer', __( 'Top browsers and operating systems.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Endpoint for 'How people are finding you (keywords)'.
	 *
	 * @return array
	 */
	private function keyword_stats() {

		// API limit.
		$api_stats_limit = apply_filters( 'analytify_api_limit_keywords_stats', 10, 'dashboard' );

		$headers        = true;
		$keywords_stats = array();
		$total_sessions = '0';
		$success        = true;
		$error_message  = false;

		if ( 'ga4' === $this->ga_mode ) {

			$keyword_stats_raw = $this->wp_analytify->get_search_console_stats(
				'show-default-keyword-dashboard',
				$this->get_dates(),
				$api_stats_limit
			);

			if ( isset( $keyword_stats_raw['error']['status'] ) && isset( $keyword_stats_raw['error']['message'] ) ) {
				return array(
					'success'   => false,
					'error_box' => array(
						'title'   => __( 'Unable To Fetch Reports', 'wp-analytify' ),
						'content' => '<p class="analytify-promo-popup-paragraph analytify-error-popup-paragraph"><strong>' . __( 'Status:', 'wp-analytify' ) . ' </strong> ' . $keyword_stats_raw['error']['status'] . '</p><p class="analytify-promo-popup-paragraph analytify-error-popup-paragraph"><strong>' . __( 'Message:', 'wp-analytify' ) . ' </strong> ' . $keyword_stats_raw['error']['message'] . '</p>',
					),
				);
			}

			if ( isset( $keyword_stats_raw['response']['rows'] ) && $keyword_stats_raw['response']['rows'] > 0 ) {
				foreach ( $keyword_stats_raw['response']['rows'] as $row ) {
					$keywords_stats[] = array(
						'keyword_url' => $row['keys'][0],
						'impressions' => $row['impressions'],
						'clicks'      => $row['clicks'],
					);
				}
				$success = true;
				$headers = array(
					'keyword_url' => array(
						'label'    => esc_html__( 'Keywords', 'wp-analytify' ),
						'th_class' => 'analytify_txt_left analytify_link_title',
						'td_class' => '',
					),
					'impressions' => array(
						'label'    => esc_html__( 'Impressions', 'wp-analytify' ),
						'th_class' => 'analytify_value_row',
						'td_class' => 'analytify_txt_center analytify_value_row',
					),
					'clicks'      => array(
						'label'    => esc_html__( 'Clicks', 'wp-analytify' ),
						'th_class' => 'analytify_value_row',
						'td_class' => 'analytify_txt_center analytify_value_row',
					),
				);
			}
		} else {

			$keyword_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:keyword', '-ga:sessions', false, $api_stats_limit, 'show-default-keyword-dashboard' );

			if ( isset( $keyword_stats_raw['totalsForAllResults']['ga:sessions'] ) ) {
				$total_sessions = $keyword_stats_raw['totalsForAllResults']['ga:sessions'];
			}

			if ( isset( $keyword_stats_raw['rows'] ) && $keyword_stats_raw['rows'] ) {
				foreach ( $keyword_stats_raw['rows'] as $row ) {
					$bar = '';
					if ( $total_sessions && $total_sessions > 0 ) {
						$bar = ' <span class="analytify_bar_graph"><span style="width:' . ( $row[1] / $total_sessions ) * 100 . '%"></span></span>';
					}
					$keywords_stats[] = array(
						'keyword'  => $row[0] . $bar,
						'sessions' => $row[1],
					);
				}
			}

			if ( isset( $keyword_stats_raw['rows'] ) || isset( $keyword_stats_raw['totalsForAllResults']['ga:sessions'] ) ) {
				$success = true;
				$headers = array(
					'keyword'  => array(
						'label'    => false,
						'th_class' => 'analytify_txt_left analytify_link_title',
						'td_class' => '',
					),
					'sessions' => array(
						'label'    => false,
						'th_class' => 'analytify_value_row',
						'td_class' => 'analytify_txt_center analytify_value_row',
					),
				);
			}
		}

		return array(
			'success'       => $success,
			'error_message' => $error_message,
			'headers'       => $headers,
			'stats'         => $keywords_stats,
			'title_stats'   => $total_sessions != 0 ? '<span class="analytify_medium_f">' . __( 'Total Visits', 'wp-analytify' ) . '</span> ' . $total_sessions : false,
			'footer'        => apply_filters( 'analytify_keywords_footer', __( 'Ranked keywords.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Endpoint for 'Social Media' stats.
	 *
	 * @return array
	 */
	private function social_stats() {

		// API limit.
		$api_stats_limit = apply_filters( 'analytify_api_limit_social_media_stats', 5, 'dashboard' );

		$social_stats   = array();
		$total_sessions = false;

		if ( 'ga4' === $this->ga_mode ) {

			$social_stats_raw = $this->wp_analytify->get_reports('show-default-social-dashboard', array(
					'sessions',
				), $this->get_dates(), array(
					'sessionSource',
				), array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				), array(
					'logic'   => 'AND',
					'filters' => array(
						array(
							'type'           => 'dimension',
							'name'           => 'sessionSource',
							'match_type'     => 5,
							'value'          => '^([a-z-]*\.|)(facebook|reddit|youtube|tumblr|quora|instagram|linkedin|yelp|wordpress|pinterest|twitter|t)(\.(com|org|co|)|)$',
							'not_expression' => false,
						),
					),
				), $api_stats_limit * 3);

			if ( isset( $social_stats_raw['rows'] ) && $social_stats_raw['rows'] && is_array( $social_stats_raw['rows'] ) ) {
				$social_stats_ga4_raw = WPANALYTIFY_Utils::ga4_social_stats( $social_stats_raw['rows'] );
				$total_sessions = 0;
				foreach ( $social_stats_ga4_raw as $row ) {
					$social_stats[] = array(
						'network'  => '<span class="' . pretty_class( $row['sessionSource'] ) . ' analytify_social_icons"></span> ' . $row['sessionSource'],
						'sessions' => WPANALYTIFY_Utils::pretty_numbers( $row['sessions'] ),
					);
					$total_sessions += $row['sessions'];
				}
			}
			// return array(
			// 	'success'   => false,
			// 	'error_box' => array(
			// 		'title'   => esc_html__( 'Reports Coming Soon For GA4', 'wp-analytify' ),
			// 		'content' => '<p class="analytify-promo-popup-paragraph analytify-error-popup-paragraph"><strong>' . esc_html__( 'Status: ' ) . '</strong>' . __( 'Reports are under development.', 'wp-analytify' ) . '</p><p class="analytify-promo-popup-paragraph analytify-error-popup-paragraph"><strong>' . esc_html__( 'Message: ', 'wp-analytify' ) . '</strong>' . esc_html__( 'Social media stats will be available in the future.', 'wp-analytify' ) . '</p>',
			// 	),
			// );

		} else {

			$social_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard( 'ga:sessions', $this->start_date, $this->end_date, 'ga:socialNetwork', '-ga:sessions', 'ga:socialNetwork!=(not set)', $api_stats_limit, 'show-default-social-dashboard' );

			if ( isset( $social_stats_raw['totalsForAllResults']['ga:sessions'] ) ) {
				$total_sessions = $social_stats_raw['totalsForAllResults']['ga:sessions'];
			}

			if ( isset( $social_stats_raw['rows'] ) && $social_stats_raw['rows'] ) {
				foreach ( $social_stats_raw['rows'] as $row ) {
					$social_stats[] = array(
						'network'  => '<span class="' . pretty_class( $row[0] ) . ' analytify_social_icons"></span> ' . $row[0],
						'sessions' => WPANALYTIFY_Utils::pretty_numbers( $row[1] ),
					);
				}
			}
		}

		return array(
			'success'       => true,
			'error_message' => false,
			'headers'       => array(
				'network'  => array(
					'label'    => false,
					'th_class' => '',
					'td_class' => '',
				),
				'sessions' => array(
					'label'    => false,
					'th_class' => '',
					'td_class' => 'analytify_txt_center analytify_value_row',
				),
			),
			'stats'         => $social_stats,
			'title_stats'   => $total_sessions ? '<span class="analytify_medium_f">' . __( 'Total Visits', 'wp-analytify' ) . '</span> ' . $total_sessions : false,
			'footer'        => apply_filters( 'analytify_social_footer', __( 'Number of visitors coming from Social Channels.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Endpoint for 'Top Referer'.
	 *
	 * @return array
	 */
	private function get_referer_stats() {

		// API limit.
		$api_stats_limit = apply_filters( 'analytify_api_limit_referer_stats', 30, 'dashboard' );

		$referer_stats  = array();
		$total_sessions = false;

		if ( 'ga4' === $this->ga_mode ) {

			$referer_stats_raw = $this->wp_analytify->get_reports(
				'show-default-refers-dashboard',
				array(
					'sessions',
				),
				$this->get_dates(),
				array(
					'sessionSource',
					'sessionMedium',
				),
				array(
					'type'  => 'metric',
					'name'  => 'sessions',
					'order' => 'desc',
				),
				array(),
				$api_stats_limit
			);

			if ( isset( $referer_stats_raw['aggregations']['sessions'] ) ) {
				$total_sessions = $referer_stats_raw['aggregations']['sessions'];
			}

			if ( $referer_stats_raw['rows'] ) {
				foreach ( $referer_stats_raw['rows'] as $row ) {
					$bar = '';
					if ( $total_sessions && $total_sessions > 0 ) {
						$bar = ' <span class="analytify_bar_graph"><span style="width:' . ( $row['sessions'] / $total_sessions ) * 100 . '%"></span></span>';
					}
					$referer_stats[] = array(
						'referer'  => $row['sessionSource'] . '/' . $row['sessionMedium'] . $bar,
						'sessions' => $row['sessions'],
					);
				}
			}
		} else {

			$referer_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard_via_rest( 'ga:sessions', $this->start_date, $this->end_date, 'ga:source,ga:medium', '-ga:sessions', false, $api_stats_limit, 'show-default-refferer' );

			if ( isset( $referer_stats_raw['totalsForAllResults']['ga:sessions'] ) ) {
				$total_sessions = $referer_stats_raw['totalsForAllResults']['ga:sessions'];
			}

			if ( isset( $referer_stats_raw['rows'] ) && $referer_stats_raw['rows'] ) {
				foreach ( $referer_stats_raw['rows'] as $row ) {
					$bar = '';
					if ( $total_sessions && $total_sessions > 0 ) {
						$bar = ' <span class="analytify_bar_graph"><span style="width:' . ( $row[2] / $total_sessions ) * 100 . '%"></span></span>';
					}
					$referer_stats[] = array(
						'referer'  => $row[0] . '/' . $row[1] . $bar,
						'sessions' => $row[2],
					);
				}
			}
		}

		return array(
			'success'     => true,
			'headers'     => array(
				'referer'  => array(
					'label'    => false,
					'th_class' => '',
					'td_class' => '',
				),
				'sessions' => array(
					'label'    => false,
					'th_class' => '',
					'td_class' => 'analytify_txt_center analytify_value_row',
				),
			),
			'stats'       => $referer_stats,
			'pagination' => true,
			'title_stats' => $total_sessions ? '<span class="analytify_medium_f">' . esc_html__( 'Total Visits', 'wp-analytify' ) . '</span> ' . $total_sessions : false,
			'footer'      => apply_filters( 'analytify_referer_footer', __( 'Top referrers to your website.', 'wp-analytify' ), array( $this->start_date, $this->end_date ) ),
		);
	}

	/**
	 * Endpoint for 'What's happening when users come to your site'.
	 *
	 * @return array
	 */
	private function get_what_is_happening_stats() {

		// API limit.
		$api_stats_limit = apply_filters( 'analytify_api_limit_what_happen_stats', 5, 'dashboard' );

		$what_happen_stats = array();
		$headers           = false;
		$footer            = false;

		if ( 'ga4' === $this->ga_mode ) {

			$page_stats_raw = $this->wp_analytify->get_reports(
				'show-default-what-happen',
				array(
					'engagedSessions',
					'engagementRate',
					'userEngagementDuration',
				),
				$this->get_dates(),
				array(
					'landingPage',
					'pageTitle',
				),
				array(
					'type'  => 'metric',
					'name'  => 'engagedSessions',
					'order' => 'desc',
				),
				array(),
				$api_stats_limit
			);

			if ( $page_stats_raw['rows'] ) {
				$num = 1;
				foreach ( $page_stats_raw['rows'] as $row ) {
					$what_happen_stats[] = array(
						'title_link'             => '<span class="analytify_page_name analytify_bullet_' . $num . '">' . $row['pageTitle'] . '</span><a target="_blank" href="' . $row['landingPage'] . '">' . $row['landingPage'] . '</a>',
						'userEngagementDuration' => WPANALYTIFY_Utils::pretty_time( $row['userEngagementDuration'] ),
						'engagedSessions'        => WPANALYTIFY_Utils::pretty_numbers( $row['engagedSessions'] ),
						'engagementRate'         => '<div class="analytify_enter_exit_bars">' . round( WPANALYTIFY_Utils::fraction_to_percentage( $row['engagementRate'] ), 2 ) . '<span class="analytify_persantage_sign">%</span><span class="analytify_bar_graph"><span style="width:' . round( WPANALYTIFY_Utils::fraction_to_percentage( $row['engagementRate'] ), 2 ) . '%"></span></span></div>',
					);
					$num++;
				}

				$headers = array(
					'title_link'             => array(
						'label'    => esc_html__( 'Title / Link', 'wp-analytify' ),
						'th_class' => 'analytify_txt_left analytify_link_title',
						'td_class' => 'analytify_page_url_detials',
					),
					'userEngagementDuration' => array(
						'label'    => esc_html__( 'User Engagement Duration', 'wp-analytify' ),
						'th_class' => 'analytify_compair_value_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
					'engagedSessions'        => array(
						'label'    => esc_html__( 'Engaged Sessions', 'wp-analytify' ),
						'th_class' => 'analytify_compair_value_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
					'engagementRate'         => array(
						'label'    => esc_html__( 'Engagement Rate', 'wp-analytify' ),
						'th_class' => 'analytify_compair_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
				);
			}
		} else {

			$what_happen_stats_raw = $this->wp_analytify->pa_get_analytics_dashboard_via_rest( 'ga:entrances,ga:exits,ga:entranceRate,ga:exitRate', $this->start_date, $this->end_date, 'ga:pageTitle,ga:pagePath', '-ga:entrances', false, $api_stats_limit, 'show-default-what-happen' );

			if ( isset( $what_happen_stats_raw['api_error'] ) ) {
				return array(
					'success'       => false,
					'error_message' => $what_happen_stats_raw['api_error'],
				);
			}

			if ( isset( $what_happen_stats_raw['rows'] ) && $what_happen_stats_raw['rows'] ) {
				$site_url = $this->get_profile_info( 'website_url' );
				$num      = 1;
				foreach ( $what_happen_stats_raw['rows'] as $row ) {

					$entrance_num = round( $row[4], 2 );
					$exit_num     = round( $row[5], 2 );

					$what_happen_stats[] = array(
						'title_link'    => '<span class="analytify_page_name analytify_bullet_' . $num . '">' . $row[0] . '</span><a target="_blank" href="' . $site_url . $row[1] . '">' . $row[1] . '</a>',
						'entrance'      => WPANALYTIFY_Utils::pretty_numbers( $row[2] ),
						'exits'         => WPANALYTIFY_Utils::pretty_numbers( $row[3] ),
						'entrance_exit' => '<div class="analytify_enter_exit_bars analytify_enter">' . $entrance_num . '<span class="analytify_persantage_sign">%</span><span class="analytify_bar_graph"><span style="width:' . $entrance_num . '%"></span></span></div><div class="analytify_enter_exit_bars">' . $exit_num . '<span class="analytify_persantage_sign">%</span><span class="analytify_bar_graph"><span style="width:' . $exit_num . '%"></span></span></div>',
					);
					$num++;
				}

				$headers = array(
					'title_link'    => array(
						'label'    => esc_html__( 'Title / Link', 'wp-analytify' ),
						'th_class' => 'analytify_txt_left analytify_link_title',
						'td_class' => 'analytify_page_url_detials',
					),
					'entrance'      => array(
						'label'    => esc_html__( 'Entrance', 'wp-analytify' ),
						'th_class' => 'analytify_compair_value_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
					'exits'         => array(
						'label'    => esc_html__( 'Exits', 'wp-analytify' ),
						'th_class' => 'analytify_compair_value_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
					'entrance_exit' => array(
						'label'    => esc_html__( 'Entrance% Exits%', 'wp-analytify' ),
						'th_class' => 'analytify_compair_row',
						'td_class' => 'analytify_txt_center analytify_w_300 analytify_l_f',
					),
				);

				$footer_text = sprintf( __( 'Did you know that %1$s people landed directly to your site at %2$s?', 'wp-analytify' ), WPANALYTIFY_Utils::pretty_numbers( $what_happen_stats_raw['rows'][0][2] ), $what_happen_stats_raw['rows'][0][1] );

				$footer = apply_filters( 'analytify_what_is_happening_footer', $footer_text, array( $this->start_date, $this->end_date ) );
			}
		}

		return array(
			'success' => true,
			'headers' => $headers,
			'stats'   => $what_happen_stats,
			'footer'  => $footer,
		);
	}

	/**
	 * Endpoint for all the stat sections on single post edit page.
	 *
	 * @return array
	 */
	private function get_single_post_stats() {
		$sections = array();

		/**
		 * Sections added by the Core:
		 * 'General Statistics', 'Scroll Depth Reach'.
		 *
		 * Section added by Pro:
		 * 'Geographic', 'System Stats', 'How people are finding you (keywords)',
		 * 'Social Media', 'Top Referrers', 'What's happening when users come to your page'.
		 *
		 * More sections, can be added via the filter.
		 */
		$sections = apply_filters( 'analytify_single_post_sections', $sections, $this->post_id, array( $this->start_date, $this->end_date ) );

		if ( ! $sections || ! is_array( $sections ) ) {
			$sections['success'] = false;
			$sections['message'] = esc_html__( 'No sections found.', 'wp-analytify' );
		} else {
			$sections['success'] = true;
			$sections['heading'] = sprintf( esc_html__( 'Displaying Analytics of this page from %1$s to %2$s.', 'wp-analytify' ), wp_date( 'jS F, Y', strtotime( $this->start_date ) ), wp_date( 'jS F, Y', strtotime( $this->end_date ) ) );
		}

		return $sections;
	}

	/**
	 * Adds 'General Statistics', 'Scroll Depth Reach' sections for single post stats.
	 *
	 * @param array $sections Sections.
	 * @param int   $post_id  Post id.
	 * @param array $date     Start and End date.
	 * @return array
	 */
	public function single_post_sections( $sections, $post_id, $date ) {

		$show_settings = $this->wp_analytify->settings->get_option( 'show_panels_back_end', 'wp-analytify-admin', array( 'show-overall-dashboard' ) );
		if ( empty( $show_settings ) || ( ! in_array( 'show-overall-dashboard', $show_settings, true ) && ! in_array( 'show-scroll-depth-stats', $show_settings, true ) ) ) {
			return $sections;
		}

		$report = new Analytify_Report(
			array(
				'dashboard_type' => 'single_post',
				'start_date'     => $date[0],
				'end_date'       => $date[1],
				'post_id'        => $post_id,
			)
		);

		if ( in_array( 'show-overall-dashboard', $show_settings, true ) ) {
			$general_stats = $report->get_general_stats();

			$sections['general_stats'] = array(
				'title' => esc_html__( 'General Statistics', 'wp-analytify' ),
				'type'  => 'boxes',
				'stats' => $general_stats['boxes'],
				// TODO: add footer.
				// 'footer' => apply_filters( 'analytify_general_stats_single_footer', $general_stats_footer, $post_id, $date ),
			);
		}

		if ( in_array( 'show-scroll-depth-stats', $show_settings, true ) && 'on' === $this->wp_analytify->settings->get_option( 'depth_percentage', 'wp-analytify-advanced' ) ) {

			$scroll_depth_stats = $report->get_scroll_depth_stats();

			$sections['scroll_depth'] = array(
				'title'       => esc_html__( 'Scroll Depth Reach', 'wp-analytify' ),
				'type'        => 'table',
				'table_class' => 'analytify_bar_tables',
				'headers'     => array(
					'percentage' => array(
						'label'    => esc_html__( 'Scroll Percentage', 'wp-analytify' ),
						'th_class' => 'analytify_txt_left',
						'td_class' => '',
					),
					'events'     => array(
						'label'    => esc_html__( 'Total Reached', 'wp-analytify' ),
						'th_class' => '',
						'td_class' => 'analytify_txt_center analytify_value_row',
					),
				),
				'stats'       => $scroll_depth_stats['stats'],
			);
		}

		return $sections;
	}

	/**
	 * Formate 'general_statistics' footer, add labels and description.
	 *
	 * @param string $number Number to format.
	 * @param array  $data   Start and End date.
	 *
	 * @return string
	 */
	public function general_stats_footer( $number, $data ) {
		return sprintf( __( 'Total time visitors spent on your site: %s?', 'wp-analytify' ), '<span class="analytify_red general_stats_message">' . WPANALYTIFY_Utils::pretty_time( $number ) . '</span>' );
	}

	/**
	 * Get profile related data based on the key (option) provided.
	 *
	 * @param string $key Option name.
	 * @return string|null
	 */
	private function get_profile_info( $key ) {
		$dashboard_profile_id = $this->wp_analytify->settings->get_option( 'profile_for_dashboard', 'wp-analytify-profile' );
		switch ( $key ) {
			case 'profile_id':
				return $dashboard_profile_id;
			case 'website_url':
				return WP_ANALYTIFY_FUNCTIONS::search_profile_info( $dashboard_profile_id, 'websiteUrl' );
			default:
				return null;
		}
	}

	/**
	 * Sets compare dates based on the start an end dates.
	 *
	 * @return void
	 */
	private function set_compare_dates() {
		$date_diff = WPANALYTIFY_Utils::calculate_date_diff( $this->start_date, $this->end_date );
		if ( ! $date_diff ) {
			return;
		}

		$this->compare_start_date = $date_diff['start_date'];
		$this->compare_end_date   = $date_diff['end_date'];
		$this->compare_days       = $date_diff['diff_days'];
	}

	/**
	 * Compares current stat with the previous one and returns the formatted difference.
	 *
	 * @param int    $current_stat Current stat.
	 * @param int    $old_stat     Old stat to compare with.
	 * @param string $type         Type of stat (key).
	 *
	 * @return array
	 */
	private function compare_stat( $current_stat, $old_stat, $type ) {

		// Check for compare dates.
		if ( is_null( $this->compare_start_date ) || is_null( $this->compare_end_date ) || is_null( $this->compare_days ) ) {
			return false;
		}

		// So we don't divide by zero.
		if ( ! $old_stat || 0 == $old_stat ) {
			return false;
		}
		$number = number_format( ( ( $current_stat - $old_stat ) / $old_stat ) * 100, 2 );

		if ( 'bounce_rate' === $type ) {
			$arrow_type = ( $number < 0 ) ? 'analytify_green_inverted' : 'analytify_red_inverted';
		} else {
			$arrow_type = ( $number > 0 ) ? 'analytify_green' : 'analytify_red';
		}

		return array(
			'arrow_type' => $arrow_type,
			'main_text'  => $number . esc_html__( '%', 'wp-analytify' ),
			'sub_text'   => sprintf( esc_html__( '%s days ago', 'wp-analytify' ), $this->compare_days ),
		);
	}

	/**
	 * Returns start and end date as an array to be used for GA4's get_reports()
	 *
	 * @return array
	 */
	private function get_dates() {
		return array(
			'start' => $this->start_date,
			'end'   => $this->end_date,
		);
	}

}

/**
 * Init the instance.
 */
Analytify_Rest_API::get_instance();

Spamworldpro Mini