/home/ivoiecob/www/wp-content/plugins/wp-social-reviews/app/Services/Platforms/Reviews/Helper.php
<?php

namespace WPSocialReviews\App\Services\Platforms\Reviews;

use Exception;
use WPSocialReviews\App\Models\Review;
use WPSocialReviews\Framework\Database\Orm\Collection;
use WPSocialReviews\Framework\Support\Arr;
use WPSocialReviews\App\Services\Helper as GlobalHelper;
use WPSocialReviews\App\Services\GlobalSettings;
use WPSocialReviews\App\Services\Platforms\MediaManager;
use WPSocialReviews\App\Services\Platforms\Feeds\CacheHandler;

if (!defined('ABSPATH')) {
    exit;
}

class Helper
{
    public static function getConnectedAccountsBusinessInfo($platforms)
    {
        $business_info = [];
        if (!is_array($platforms)) {
            $platforms = [$platforms];
        }

        foreach ($platforms as $platform) {
            $infos = get_option('wpsr_reviews_' . $platform . '_business_info');

            if (!empty($infos)) {
                $business_info += get_option('wpsr_reviews_' . $platform . '_business_info');
            } else {
                //for custom or fluent forms platform
                if ($platform === 'custom') {
                    $data = Review::getInternalBusinessInfo($platform);
                    if (!empty($data) && is_array($data)) {
                        $business_info += $data;
                    }
                }
            }
        }
        return $business_info;
    }

    public static function getNotificationMessage($businessInfo = [], $key = '')
    {
        $downloadedReviews = Arr::get($businessInfo, 'total_fetched_reviews');
        $platform_name = Arr::get($businessInfo, $key . '.platform_name');
        $businessName = Arr::get($businessInfo, $key . '.name');
        $message = $platform_name === 'woocommerce' ? __('Product connected successfully!!', 'wp-social-reviews') : __('Reviews fetched successfully!!', 'wp-social-reviews');
        if($platform_name === 'woocommerce' && (empty($downloadedReviews))) {
            return $message;
        }

        if ($downloadedReviews && $businessName && $downloadedReviews > 0) {
            // translators: Please retain the placeholders (%s, %d, etc.) and ensure they are correctly used in context.
            $message = sprintf(__('%1$s reviews fetched successfully from %2$s!!', 'wp-social-reviews'), $downloadedReviews, $businessName);
        } else if ($downloadedReviews && $downloadedReviews > 0) {
            // translators: Please retain the placeholders (%s, %d, etc.) and ensure they are correctly used in context.
            $message = sprintf(__('%s reviews fetched successfully!!', 'wp-social-reviews'), $downloadedReviews);
        } else if ( $platform_name !== 'woocommerce' && (empty($downloadedReviews) || $downloadedReviews < 1)) {
            throw new \Exception(
                esc_html__('Reviews fetched failed, Please try again!!', 'wp-social-reviews')
            );
        }

        return $message;
    }

    public static function formattedTemplateMeta($settings = array())
    {
        $platform = Arr::get($settings, 'platform', []);

        $template = in_array('testimonial', $platform) ? 'testimonial1' : 'grid1';
        $timestamp = in_array('testimonial', $platform) ? 'false' : 'true';
        $selectedIncList = Arr::get($settings, 'selectedIncList', []);
        $selectedExcList = Arr::get($settings, 'selectedExcList', []);
        $filterByTitle = Arr::get($settings, 'filterByTitle', 'all');

        if (empty($selectedExcList) && empty($selectedIncList)) {
            $filterByTitle = 'all';
        }

        // support old minimum rating values 11/6
        if ((Arr::get($settings, 'starFilterVal') === 11) || (!in_array('booking.com', $platform) && Arr::get($settings, 'starFilterVal') >= 6)) {
            $settings['starFilterVal'] = -1;
        }

        extract(static::getCarouselSettings($settings));

        //notification and badge old settings compatible for new version
        $notification_settings = Arr::get($settings, 'notification_settings');
        if (!Arr::get($notification_settings, 'display_mode', 'false')) {
            $settings['notification_settings']['display_mode'] = (Arr::get($notification_settings, 'display_reviews_on_click') === 'true') ? 'popup' : 'none';
        }

        $badge_settings = Arr::get($settings, 'badge_settings');
        if (!Arr::get($badge_settings, 'display_mode', 'false')) {
            $settings['badge_settings']['display_mode'] = (Arr::get($badge_settings, 'display_reviews_on_click') === 'true') ? 'popup' : 'none';
        }

        return array(
            //source
            'platform' => $platform,

            //template
            'platformType' => Arr::get($settings, 'platformType', 'single'),
            'template' => Arr::get($settings, 'template', $template),
            'templateType' => Arr::get($settings, 'templateType', 'grid'),
            'column' => Arr::get($settings, 'column', '4'),
            'responsive_column_number' => array(
                'desktop' => Arr::get($settings, 'responsive_column_number.desktop', Arr::get($settings, 'column', '4')),
                'tablet' => Arr::get($settings, 'responsive_column_number.tablet', '4'),
                'mobile' => Arr::get($settings, 'responsive_column_number.mobile', '12')
            ),
            //settings
            'reviewer_name' => Arr::get($settings, 'reviewer_name', 'true'),
            'reviewer_name_format' => Arr::get($settings, 'reviewer_name_format', 'full-name'),
            'author_position' => Arr::get($settings, 'author_position', 'true'),
            'author_company_name' => Arr::get($settings, 'author_company_name', 'false'),
            'website_logo' => Arr::get($settings, 'website_logo', 'true'),
            'rating_style' => Arr::get($settings, 'rating_style', 'default'),
            'reviewer_image' => Arr::get($settings, 'reviewer_image', 'true'),
            'timestamp' => Arr::get($settings, 'timestamp', $timestamp),
            'reviewerrating' => Arr::get($settings, 'reviewerrating', 'true'),
            'enable_verified_badge' => Arr::get($settings, 'enable_verified_badge', 'false'),
            'verified_badge_tooltip_text' => Arr::get($settings, 'verified_badge_tooltip_text', __('Verified Customer', 'wp-social-reviews')),
            'resolution' => Arr::get($settings, 'resolution', 'full'),

            'platform_label' => Arr::get($settings, 'platform_label', __('On Site', 'wp-social-reviews')),

            'equal_height' => Arr::get($settings, 'equal_height', 'false'),
            'equalHeightLen' => (int) Arr::get($settings, 'equalHeightLen', '250'),
            'content_length' => (int) Arr::get($settings, 'content_length', 10),
            'contentLanguage' => Arr::get($settings, 'contentLanguage', 'original'),
            'contentType' => Arr::get($settings, 'contentType', 'excerpt'),
            'enableExternalLink' => Arr::get($settings, 'enableExternalLink', 'true'),

            'display_review_title' => Arr::get($settings, 'display_review_title', 'true'),
            'isReviewerText' => Arr::get($settings, 'isReviewerText', 'true'),
            'isPlatformIcon' => Arr::get($settings, 'isPlatformIcon', 'true'),
            'current_template_type' => Arr::get($settings, 'current_template_type', 'grid'),

            //carousel
            'carousel_settings' => array(
                'autoplay' => Arr::get($settings, 'carousel_settings.autoplay', $autoplay),
                'autoplay_speed' => (int) Arr::get($settings, 'carousel_settings.autoplay_speed', $autoplay_speed),
                'slides_to_show' => (int) Arr::get($settings, 'carousel_settings.slides_to_show', $slides_to_show),
                'spaceBetween' => (int) Arr::get($settings, 'carousel_settings.spaceBetween', 20),
                'responsive_slides_to_show' => array(
                    'desktop' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_show.desktop', Arr::get($settings, 'carousel_settings.slides_to_show', $slides_to_show)),
                    'tablet' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_show.tablet', 2),
                    'mobile' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_show.mobile', 1)
                ),
                'slides_to_scroll' => (int) Arr::get($settings, 'carousel_settings.slides_to_scroll', $slides_to_scroll),
                'responsive_slides_to_scroll' => array(
                    'desktop' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_scroll.desktop', Arr::get($settings, 'carousel_settings.slides_to_scroll', $slides_to_scroll)),
                    'tablet' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_scroll.tablet', 2),
                    'mobile' => (int) Arr::get($settings, 'carousel_settings.responsive_slides_to_scroll.mobile', 1)
                ),
                'navigation' => Arr::get($settings, 'carousel_settings.navigation', $navigation),
            ),

            //filters
            'totalReviewsVal' => (int) Arr::get($settings, 'totalReviewsVal', '50'),
            'totalReviewsNumber' => array(
                'desktop' => (int) Arr::get($settings, 'totalReviewsNumber.desktop', Arr::get($settings, 'totalReviewsVal', '50')),
                'mobile' => (int) Arr::get($settings, 'totalReviewsNumber.mobile', Arr::get($settings, 'totalReviewsVal', '50'))
            ),
            'starFilterVal' => (int) Arr::get($settings, 'starFilterVal', -1),
            'filterByTitle' => $filterByTitle,
            'selectedIncList' => $selectedIncList,
            'selectedExcList' => $selectedExcList,
            'includes_inputs' => Arr::get($settings, 'includes_inputs', ''),
            'excludes_inputs' => Arr::get($settings, 'excludes_inputs', ''),
            'order' => Arr::get($settings, 'order', 'desc'),
            'hide_empty_reviews' => Arr::get($settings, 'hide_empty_reviews', false),
            'selectedBusinesses' => Arr::get($settings, 'selectedBusinesses', []),
            'selectedCategories' => Arr::get($settings, 'selectedCategories', []),

            //header
            'show_header'                  => Arr::get($settings,'show_header','true'),
            'display_header_business_logo' => Arr::get($settings, 'display_header_business_logo', true),
            'display_header_business_name' => Arr::get($settings, 'display_header_business_name', true),
            'display_header_rating' => Arr::get($settings, 'display_header_rating', true),
            'display_header_reviews' => Arr::get($settings, 'display_header_reviews', true),
            'display_header_write_review' => Arr::get($settings, 'display_header_write_review', true),
            'header_template' => Arr::get($settings, 'header_template', 'template1'),
            'custom_write_review_text' => Arr::get($settings, 'custom_write_review_text', __('Write a Review', 'wp-social-reviews')),
            'add_custom_war_btn_url' => Arr::get($settings, 'add_custom_war_btn_url', false),
            'war_btn_source' => Arr::get($settings, 'war_btn_source', 'custom_url'),
            'war_btn_source_custom_url' => Arr::get($settings, 'war_btn_source_custom_url', ''),
            'war_btn_open_in_new_window' => Arr::get($settings, 'war_btn_open_in_new_window', 'true'),
            'war_btn_source_form_shortcode_id' => Arr::get($settings, 'war_btn_source_form_shortcode_id', null),
            'custom_title_text' => Arr::get($settings, 'custom_title_text', ''),
            // translators: {total_reviews} is a placeholder for the total number of reviews
            'custom_number_of_reviews_text' => Arr::get($settings, 'custom_number_of_reviews_text', __('Based on {total_reviews} Reviews', 'wp-social-reviews')),
            'display_tp_brand' => Arr::get($settings, 'display_tp_brand', 'false'),

            //pagination
            'pagination_type' => Arr::get($settings, 'pagination_type', 'none'),
            'load_more_button_text' => Arr::get($settings, 'load_more_button_text', __('Load More', 'wp-social-reviews')),
            'paginate' => (int) Arr::get($settings, 'paginate', '6'),
            'paginate_number' => array(
                'desktop' => (int) Arr::get($settings, 'paginate_number.desktop', Arr::get($settings, 'paginate', '6')),
                'mobile' => (int) Arr::get($settings, 'paginate_number.mobile', '6')
            ),

            //Badge Settings
            'badge_settings' => array(
                'template' => Arr::get($settings, 'badge_settings.template', 'badge1'),
                'badge_position' => Arr::get($settings, 'badge_settings.badge_position', 'default'),
                'display_platform_icon' => Arr::get($settings, 'badge_settings.display_platform_icon', 'true'),
                'custom_title' => Arr::get($settings, 'badge_settings.custom_title', __('Rating', 'wp-social-reviews')),
                // translators: {reviews_count} is a placeholder for the number of reviews
                'custom_num_of_reviews_text' => Arr::get($settings, 'badge_settings.custom_num_of_reviews_text', __('Read our {reviews_count} Reviews', 'wp-social-reviews')),
                'display_mode' => Arr::get($settings, 'badge_settings.display_mode', 'popup'),
                'url' => Arr::get($settings, 'badge_settings.url', ''),
                'custom_url' => Arr::get($settings, 'badge_settings.custom_url', ''),
                'form_shortcode_id' => Arr::get($settings, 'badge_settings.form_shortcode_id', null),
                'id' => Arr::get($settings, 'badge_settings.id', ''),
                'open_in_new_window' => Arr::get($settings, 'badge_settings.open_in_new_window', 'true'),
            ),

            //Notification Settings
            'notification_settings' => array(
                'template' => Arr::get($settings, 'notification_settings.template', 'notification1'),
                'notification_position' => Arr::get($settings, 'notification_settings.notification_position', 'float_left_bottom'),
                'display_mode' => Arr::get($settings, 'notification_settings.display_mode', 'popup'),
                'custom_url' => Arr::get($settings, 'notification_settings.custom_url', ''),
                'id' => Arr::get($settings, 'notification_settings.id', null),
                'url' => Arr::get($settings, 'notification_settings.url', ''),
                'page_list' => Arr::get($settings, 'notification_settings.page_list', array('-1')),
                'exclude_page_list' => Arr::get($settings, 'notification_settings.exclude_page_list', array()),
                'post_types' => Arr::get($settings, 'notification_settings.post_types', array()),
                'hide_on_desktop' => Arr::get($settings, 'notification_settings.hide_on_desktop', 'false'),
                'hide_on_mobile' => Arr::get($settings, 'notification_settings.hide_on_mobile', 'false'),
                'notification_priority' => Arr::get($settings, 'notification_settings.notification_priority', 0),
                'display_close_button' => Arr::get($settings, 'notification_settings.display_close_button', 'true'),
                'display_date' => Arr::get($settings, 'notification_settings.display_date', 'true'),
                // translators: {review_rating} is a placeholder for the star rating value
                'custom_notification_text' => Arr::get($settings, 'notification_settings.custom_notification_text', __('Just left us a {review_rating} star review', 'wp-social-reviews')),
                'initial_delay' => (int) Arr::get($settings, 'notification_settings.initial_delay', 6000),
                'notification_delay' => (int) Arr::get($settings, 'notification_settings.notification_delay', 5000),
                'delay_for' => (int) Arr::get($settings, 'notification_settings.delay_for', 5000),
                'display_read_all_reviews_btn' => Arr::get($settings, 'notification_settings.display_read_all_reviews_btn', 'false'),
                'read_all_reviews_btn_url' => Arr::get($settings, 'notification_settings.read_all_reviews_btn_url', '#'),
            ),
            'enable_schema' => Arr::get($settings, 'enable_schema', 'false'),
            'schema_settings' => array(
                'schema_type' => Arr::get($settings, 'schema_settings.schema_type', 'aggregate_rating'),
                'business_logo' => Arr::get($settings, 'schema_settings.business_logo', ''),
                'business_name' => Arr::get($settings, 'schema_settings.business_name', ''),
                'business_description' => Arr::get($settings, 'schema_settings.business_description', ''),
                'business_type' => Arr::get($settings, 'schema_settings.business_type', ''),
                'business_telephone' => Arr::get($settings, 'schema_settings.business_telephone', ''),
                'include_business_address' => Arr::get($settings, 'schema_settings.include_business_address', 'false'),
                'business_street_address' => Arr::get($settings, 'schema_settings.business_street_address', ''),
                'business_address_city' => Arr::get($settings, 'schema_settings.business_address_city', ''),
                'business_address_state' => Arr::get($settings, 'schema_settings.business_address_state', ''),
                'business_address_postal_code' => Arr::get($settings, 'schema_settings.business_address_postal_code', ''),
                'business_address_country' => Arr::get($settings, 'schema_settings.business_address_country', ''),
                'business_average_rating' => Arr::get($settings, 'schema_settings.business_average_rating', null),
                'business_total_rating' => Arr::get($settings, 'schema_settings.business_total_rating', null),
                'include_reviews_in_schema' => Arr::get($settings, 'schema_settings.include_reviews_in_schema', 1),
            ),

            //styles
            'feed_settings' => array(
                'enable_style' => 'true',
                'created_from_onboarding'  => Arr::get($settings,'feed_settings.created_from_onboarding', false),
            ),
            'template_width' => Arr::get($settings, 'template_width', ''),
            'template_height' => Arr::get($settings, 'template_height', ''),
            'ai_summary' => array(
                'enabled' => Arr::get($settings, 'ai_summary.enabled', 'false'),
                'style' => Arr::get($settings, 'ai_summary.style', 'list'),
                'display_readmore' => Arr::get($settings, 'ai_summary.display_readmore', false),
                'text_typing_animation' => Arr::get($settings, 'ai_summary.text_typing_animation', true),
                'display_ai_summary_icon' => Arr::get($settings, 'ai_summary.display_ai_summary_icon', true),
            ),
        );
    }

    public static function getCarouselSettings($settings)
    {
        $carousel_settings = array(
            'autoplay' => Arr::get($settings, 'autoplay', 'false'),
            'autoplay_speed' => (int) Arr::get($settings, 'autoplay_speed', '3000'),
            'slides_to_show' => (int) Arr::get($settings, 'slides_to_show', '3'),
            'slides_to_scroll' => (int) Arr::get($settings, 'slides_to_scroll', '3'),
            'navigation' => Arr::get($settings, 'navigation', 'dot'),
        );

        return $carousel_settings;
    }

    public static function validPlatforms($platforms = array())
    {
        $activePlatforms = apply_filters('wpsocialreviews/available_valid_reviews_platforms', []);

        //add custom with platforms if custom reviews exists
        $isCustomReviewsExists = Review::where('platform_name', 'custom')
            ->count();

        if ($isCustomReviewsExists) {
            $activePlatforms['custom'] = __('Custom', 'wp-social-reviews');
        }
        $customValidPlatforms = get_option('wpsr_available_valid_platforms', []);
        if(!empty($customValidPlatforms)){
            $activePlatforms = array_merge($activePlatforms, $customValidPlatforms);
        }
        if (!empty($platforms)) {
            $activePlatforms = array_intersect($platforms, array_keys($activePlatforms));
        }

        return $activePlatforms;
    }


    public static function generateQrCodeArray($id, $name, $url, $custom_url = '', $scan_counter = null)
    {
        return [
            'id' => $id,
            'name' => $name,
            'url' => $url,
            'custom_url' => $custom_url,
            'qrcode_url' => home_url('/?wpsr_qr_code=' . $id),
            'scan_counter' => isset($scan_counter) ? $scan_counter : 0,
        ];
    }

    //public static function addCustomBusinessInfo($business_info, $template_meta)
//    {
//        $platforms = Arr::get($business_info, 'platforms', []);
//        if (!empty($platforms) && in_array('custom', array_column($platforms, 'platform_name'))) {
//            $business_info['platforms']['custom']['url'] = Arr::get($template_meta, 'war_btn_source_custom_url', '');
//            $business_info['total_business'] = count($platforms);
//            $business_info['total_platforms'] = count($platforms);
//        }
//        return $business_info;
//    }

    public static function getBusinessInfoByPlatforms($platforms, $calculateBreakdown = true)
    {
        $multi_business_info = [];
        $platform_urls = [];
        $avg_rating = 0;
        $total_rating = 0;
        $connected_business_info = Helper::getConnectedAccountsBusinessInfo($platforms);

        $value = array_values($connected_business_info);
        $platformNames = array_column($value, 'platform_name');

        $isBooking = false;
        if (in_array('booking.com', $platformNames)) {
            if (count(array_unique($platformNames)) === 1 && end($platformNames) === 'booking.com') {
                $isBooking = true;
            }
        }

        $platform_count = 0;
        $cnt = 0;
        $url = "";
        $platform_name = "";
        $total_platforms = count(array_unique($platformNames));
        foreach ($connected_business_info as $index => $business_info) {
            $place_id = Arr::get($business_info, 'place_id');
            $platform_urls[$place_id] = [
                'platform_name' => Arr::get($business_info, 'platform_name'),
                'platform_label' => Arr::get($business_info, 'platform_label'),
                'name' => Arr::get($business_info, 'name'),
                'url' => Arr::get($business_info, 'url'),
                'logo' => Arr::get($business_info, 'logo', ''),
                'privacy_policy_url' => Arr::get($business_info, 'privacy_policy_url', ''),
                'average_rating' => Arr::get($business_info, 'average_rating'),
                'total_rating' => Arr::get($business_info, 'total_rating'),
                'product_url' => Arr::get($business_info, 'platform_name') === 'woocommerce' ? get_the_post_thumbnail_url($place_id) : ''
            ];

            if (!empty(Arr::get($business_info, 'url')) || !empty(Arr::get($business_info, 'logo'))) {
                $cnt++;
                $url = Arr::get($business_info, 'url');
                $platform_name = Arr::get($business_info, 'platform_name');
            } else {
                $total_platforms--;
                // Still set platform_name even if URL is empty (for platforms like WooCommerce)
                if (empty($platform_name)) {
                    $platform_name = Arr::get($business_info, 'platform_name');
                }
            }

            $multi_business_info['platforms'] = $platform_urls;

            if (Arr::get($business_info, 'total_rating')) {
                $total_rating += $business_info['total_rating'];
                $multi_business_info['total_rating'] = $total_rating;
            }

            $average_rating = Arr::get($business_info, 'average_rating');
            if ($average_rating) {
                $platform_count++;

                if (Arr::get($business_info, 'platform_name') === 'booking.com' && !$isBooking) {
                    $avg_rating += ((float) $average_rating / 2);
                } else {
                    $avg_rating += $average_rating;
                }
                $multi_business_info['average_rating'] = $platform_urls && $avg_rating ? $avg_rating / $platform_count : $avg_rating;
            }
        }

        if ($calculateBreakdown) {
            // Calculate star rating breakdown for all reviews
            $multi_business_info['rating_breakdown'] = static::calculateStarRatingBreakdown($platforms, $platform_urls);
        }

        $multi_business_info['url'] = $url;
        $multi_business_info['platform_name'] = $platform_name;
        $multi_business_info['total_business'] = $cnt;
        $multi_business_info['total_platforms'] = $total_platforms;
        return apply_filters('wpsocialreviews/reviews_business_info', $multi_business_info);
    }

    public static function getSelectedBusinessInfoByPlatforms($platforms, $selectedBusinesses)
    {
        $cnt = 0; // Reset the count
        // Only skip breakdown calculation if we have selected businesses to filter
        $shouldCalculateBreakdown = empty($selectedBusinesses);
        $multi_business_info = static::getBusinessInfoByPlatforms($platforms, $shouldCalculateBreakdown);
        $cnt = Arr::get($multi_business_info, 'total_business', 0);
        $url = Arr::get($multi_business_info, 'url', '');
        $platform_name = Arr::get($multi_business_info, 'platform_name', '');
        $total_platforms = Arr::get($multi_business_info, 'total_platforms', 0);

        if (!empty($selectedBusinesses) && !empty($multi_business_info['platforms'])) {
            $multi_business_info['average_rating'] = 0;
            $multi_business_info['total_rating'] = 0;
            $avg_rating = 0;
            $total_rating = 0;
            $platform_count = 0;

            $allPlatforms = [];
            $selectedPlatformNames = [];
            foreach ($selectedBusinesses as $key => $selected) {
                $platformName = isset($multi_business_info['platforms'][$selected]['platform_name']) ? $multi_business_info['platforms'][$selected]['platform_name'] : '';
                $allPlatforms[] = $platformName;
                if (!empty($platformName)) {
                    $selectedPlatformNames[] = $platformName;
                }
            }

            $isBooking = false;
            if (in_array('booking.com', $allPlatforms)) {
                if (count(array_unique($allPlatforms)) === 1 && end($allPlatforms) === 'booking.com') {
                    $isBooking = true;
                }
            }

            $total_platforms = count(array_unique($allPlatforms));
            foreach ($multi_business_info['platforms'] as $businessId => $business) {
                if (in_array($businessId, $selectedBusinesses)) {
                    $cnt++; // Increment count for selected businesses
                    $average_rating = Arr::get($business, 'average_rating');
                    if ($average_rating) {
                        $platform_count++;
                        if (Arr::get($business, 'platform_name') === 'booking.com' && !$isBooking) {
                            $avg_rating += ((float) $average_rating / 2);
                        } else {
                            $avg_rating += $average_rating;
                        }
                        $multi_business_info['average_rating'] = $avg_rating ? $avg_rating / $platform_count : $avg_rating;
                    }
                    $total_rating += $business['total_rating'];
                    $multi_business_info['total_rating'] = $total_rating;

                    if (!empty(Arr::get($business, 'url'))) {
                        $url = Arr::get($business, 'url');
                        $platform_name = Arr::get($multi_business_info, 'platform_name', '');
                    } else {
                        $total_platforms--;
                    }
                } else {
                    unset($multi_business_info['platforms'][$businessId]);
                }
            }

            // Calculate rating breakdown for selected platforms only
            if (!empty($selectedPlatformNames)) {
                // Filter business info for selected businesses
                $selectedBusinessInfo = [];
                foreach ($multi_business_info['platforms'] as $businessId => $business) {
                    if (in_array($businessId, $selectedBusinesses)) {
                        $selectedBusinessInfo[$businessId] = $business;
                    }
                }
                $multi_business_info['rating_breakdown'] = static::calculateStarRatingBreakdown(array_unique($selectedPlatformNames), $selectedBusinessInfo);
            }
        }

        if ($cnt === 1) {
            $multi_business_info['url'] = $url;
            $multi_business_info['platform_name'] = $platform_name;

            if (empty($multi_business_info['platform_name']) && !empty($multi_business_info['platforms'])) {
                $firstPlatform = reset($multi_business_info['platforms']);
                if (isset($firstPlatform['platform_name'])) {
                    $multi_business_info['platform_name'] = $firstPlatform['platform_name'];
                }
            }
        }

        $multi_business_info['total_business'] = $cnt;
        $multi_business_info['total_platforms'] = $total_platforms;

        return !empty($multi_business_info) ? $multi_business_info : [];
    }

    public static function getConnectedBusinessesForAPlatform($platform)
    {
        $connected_businesses = [];
        $business_info = Helper::getConnectedAccountsBusinessInfo($platform);
        if (!empty($business_info)) {
            foreach ($business_info as $index => $info) {
                if (Arr::get($info, 'platform_name') === $platform) {
                    $connected_businesses[$index] = $info;
                }
            }
        }
        return $connected_businesses;

    }

    public static function platformDynamicClassName($business_info)
    {
        $count = [];
        $platforms = Arr::get($business_info, 'platforms');
        if (empty($platforms)) {
            return;
        }

        foreach ($platforms as $index => $platform) {
            $platformName = Arr::get($platform, 'platform_name');
            if (isset($count[$platformName]) && $count[$platformName]) {
                continue;
            }
            $count[$platformName] = 1;
        }
        $total_platforms = count($count);

        if ($total_platforms === 1) {
            $class = array_keys($count)[0];
        } else {
            $class = 'wpsr-has-multiple-reviews-platform';
        }
        return $class;
    }

    public static function convertToPercentage($value)
    {
        // Extract the decimal part of the value
        $decimalPart = $value - floor($value);

        // Convert the decimal part to a percentage
        $percentage = round($decimalPart * 100);

        return $percentage . '%';
    }

    /**
     * Generate rating SVG icon based on rating value
     *
     * @param $rating
     *
     * @return string
     * @since 1.0.0
     */
    public static function generateRatingIcon($rating, $templateId = null)
    {
        $stars = '';
        $uniqueId = $templateId ? 'rating-' . $templateId : 'rating-default';

        // Generate 5 stars
        for ($i = 0; $i < 5; $i++) {
            $fillPercentage = '0%';

            // Calculate fill percentage for each star
            $score = $rating - $i;
            if ($score >= 1) {
                $fillPercentage = '100%';
            } else if ($score > 0) {
                $fillPercentage = ($score * 100) . '%';
            }

            $stars .= sprintf(
                '<div class="wpsr-star-container %s" style="--wpsr-review-star-fill: %s;">
                    <div class="wpsr-star-empty"></div>
                    <div class="wpsr-star-filled"></div>
                </div>',
                $fillPercentage > 10 ? 'wpsr-star-background-filled' : 'wpsr-star-background-empty',
                $fillPercentage
            );
        }

        return $stars;
    }

    public static function platformIcon($platform_name = '', $size = '')
    {
        $customLogo = static::getCustomPlatformLogo($platform_name);
        if (!empty($customLogo['logo'])) {
            return $customLogo['logo'];
        }

        $img_size = $size === 'small' ? '-' . $size : '';

        $hidePlatformsIcon = static::getPlatformsWithCategories();
        if (in_array($platform_name, $hidePlatformsIcon)) {
            return '';
        }

        return apply_filters(
            'wpsocialreviews/' . $platform_name . '_reviews_platform_icon',
            WPSOCIALREVIEWS_URL . 'assets/images/icon/icon-' . $platform_name . $img_size . '.png'
        );
    }

    public static function removeSpecialChars($text)
    {
        $text = str_replace("&#x27;", "'", $text);
        $text = html_entity_decode($text, ENT_NOQUOTES, 'UTF-8');
        $text = htmlspecialchars_decode($text, ENT_QUOTES);
        $text = wp_specialchars_decode($text);
        return $text;
    }

    public static function getPlatformsWithCategories()
    {
        return apply_filters('wpsocialreviews/platforms_with_categories', ['fluent_forms', 'custom', 'testimonial', 'ai']);
    }

    public static function hasReviewApproved()
    {
        global $wpdb;
        $table_name = $wpdb->prefix . 'wpsr_reviews';
        $has_column = GlobalHelper::hasColumn($table_name, 'review_approved');

        return $has_column;
    }

    public static function is_tp($platform_name)
    {
        $trust = substr($platform_name, 0, 5);
        return ($trust === 'trust');
    }

    public static function hideLogo($templateMeta, $platform)
    {
        return Arr::get($templateMeta, 'isPlatformIcon') === 'false' || $platform === 'custom' || $platform === 'fluent_forms' || (static::is_tp($platform) && $templateMeta['display_tp_brand'] === 'false');
    }

    public static function trimProductTitle($reviews)
    {
        if (!empty($reviews)) {
            foreach ($reviews as $index => $review) {
                $product_name = Arr::get($review, 'fields.product_name', '');
                $product_data = [];
                $product_data['product_name'] = wp_trim_words($product_name, 4, '...');
                $product_data['product_thumbnail'] = Arr::get($review, 'fields.product_thumbnail', '');
                if ($product_name && Arr::get($review, 'fields')) {
                    $reviews[$index]['fields'] = $product_data;
                }
            }
        }

        return $reviews;
    }

    public static function getIdsExistReviews($existReviews, $uniqueIdentifierKey)
    {
        $idsExistReviews = $existReviews->pluck($uniqueIdentifierKey)->map(function ($item) {
            return $item;
        })->toArray();

        return $idsExistReviews;
    }

    public static function getIdsCurrentReviews($currentReviews, $reviewIdentifyValue, $platform)
    {
        $idsCurrentReviews = array_map(function ($item) use ($reviewIdentifyValue, $platform) {
            if ($platform == 'facebook') {
                return $reviewIdentifyValue . $item['reviewer']['id'];
            } else if ($platform == 'google') {
                return $item['reviewId'];
            }
            return '';
        }, $currentReviews);

        return $idsCurrentReviews;
    }

    public static function getImageSettings($platform)
    {
        if (empty($platform)) {
            return [];
        }

        $global_settings = get_option('wpsr_' . $platform . '_global_settings');
        $advanceSettings = (new GlobalSettings())->getGlobalSettings('advance_settings');
        $has_gdpr = Arr::get($advanceSettings, 'has_gdpr', "false");
        $image_format = Arr::get($advanceSettings, 'optimize_image_format', 'jpg');
        $optimized_images = $platform === 'reviews'
            ? Arr::get($advanceSettings, 'review_optimized_images', "false")
            : Arr::get($global_settings, 'global_settings.optimized_images', 'false');

        return [
            'optimized_images' => $optimized_images,
            'has_gdpr' => $has_gdpr,
            'image_format' => $image_format
        ];
    }

    public static function mediaUrlManage($platformName, $resizedImages, $advanceSettings, $imageSize, $filteredReviews, $isOptimizedImage)
    {
        $mediaManager = new MediaManager($resizedImages, $advanceSettings, $imageSize, $platformName);
        foreach ($filteredReviews as $index => $item) {
            if ($isOptimizedImage == 'true' && $item->platform_name != 'custom' && $item->platform_name != 'testimonial') {
                $item['media_url'] = $mediaManager->getMediaUri($item);
            } else {
                $item['media_url'] = Arr::get($item, 'reviewer_img');
            }
        }

        return $filteredReviews;
    }

    public static function handleReviewerName($reviews, $templateMeta)
    {
        $shouldShowName = filter_var(Arr::get($templateMeta, 'reviewer_name', false), FILTER_VALIDATE_BOOLEAN);
        $nameFormat = Arr::get($templateMeta, 'reviewer_name_format', 'full-name');

        if (!$shouldShowName) {
            return $reviews;
        }

        foreach ($reviews as &$review) {
            $fullName = trim($review['reviewer_name'] ?? '');

            if (empty($fullName)) {
                $review['reviewer_name'] = '';
                continue;
            }

            $nameParts = preg_split('/\s+/', $fullName);
            $firstName = $nameParts[0] ?? '';
            $lastName = $nameParts[1] ?? '';

            switch ($nameFormat) {
                case 'first-name':
                    $review['reviewer_name'] = $firstName;
                    break;

                case 'first-name-last-initial':
                    $lastInitial = $lastName ? strtoupper(substr($lastName, 0, 1)) . '.' : '';
                    $review['reviewer_name'] = trim("{$firstName} {$lastInitial}");
                    break;

                case 'initials-only':
                    $firstInitial = $firstName ? strtoupper(substr($firstName, 0, 1)) . '.' : '';
                    $lastInitial = $lastName ? strtoupper(substr($lastName, 0, 1)) . '.' : '';
                    $review['reviewer_name'] = trim("{$firstInitial} {$lastInitial}");
                    break;

                case 'full-name':
                default:
                    $review['reviewer_name'] = $fullName;
                    break;
            }
        }
        unset($review);

        return $reviews;
    }

    /**
     * Check if any reviews have review_images
     *
     * @param array|Collection $reviews
     * @return bool
     */
    public static function hasReviewImages($reviews){
        if (empty($reviews)) {
            return false;
        }
        // Handle Collection objects (from ORM)
        if ($reviews instanceof Collection) {
            foreach ($reviews as $review) {
                $reviewImages = Arr::get($review, 'fields.review_images', []);
                if (!empty($reviewImages)) {
                    return true;
                }
            }
        } elseif (is_array($reviews)) {
            foreach ($reviews as $review) {
                $reviewImages = Arr::get($review, 'fields.review_images', []);
                if (!empty($reviewImages)) {
                    return true;
                }
            }
        }

        return false;
    }

    public static function getValidPlatforms($platforms)
    {
        $validPlatforms = [];
        foreach ($platforms as $platform) {
            if ((!empty($platform['url']))) {
                $validPlatforms = $platform;
            }
        }
        return $validPlatforms;
    }

    public static function getTemplateMetaByTemplateId($templateId)
    {
        $templateMeta = get_post_meta($templateId, '_wpsr_template_config', true);
        $decodedMeta = json_decode($templateMeta, true);
        $formattedMeta = Helper::formattedTemplateMeta($decodedMeta);

        return $formattedMeta;
    }

    public static function getReviewsDataByTemplateId($templateId, $formattedMeta)
    {
        $reviewsData = Review::collectReviewsAndBusinessInfo($formattedMeta, $templateId);
        return $reviewsData;
    }

    public static function shouldShowAISummaryIcon($review, $shouldDisplayAISummaryIcon = true, $template_meta = [])
    {
        if ($review->platform_name === 'ai' && !$shouldDisplayAISummaryIcon) {
            return 'false';
        }

        return $template_meta['reviewer_image'];
    }

    /**
     * Calculate star rating breakdown for specific businesses and approved reviews only
     *
     * @param array $platforms Array of platform names
     * @param array $businessInfo Business info containing platform and source_id details
     * @return array Star rating breakdown with counts and percentages
     */
    public static function calculateStarRatingBreakdown($platforms, $businessInfo = [])
    {
        if (empty($platforms) || empty($businessInfo)) {
            return static::getDefaultRatingBreakdown();
        }

        // Group source IDs by platform
        $platformSources = [];
        $needsCustomAll = false;

        foreach ($businessInfo as $sourceId => $business) {
            $platformName = Arr::get($business, 'platform_name');

            if (!in_array($platformName, $platforms)) {
                continue;
            }

            if ($platformName === 'custom') {
                $needsCustomAll = true;
                continue;
            }

            $platformSources[$platformName][] = $sourceId;
        }

        // Build a single optimized query using raw SQL with GROUP BY for counting
        global $wpdb;
        $table_name = $wpdb->prefix . 'wpsr_reviews';

        $counts = [
            '5' => 0,
            '4' => 0,
            '3' => 0,
            '2' => 0,
            '1' => 0,
            '0' => 0
        ];
        $totalReviews = 0;

        // Build conditions for non-custom platforms (single query with OR conditions)
        $conditions = [];
        $values = [];

        foreach ($platformSources as $platformName => $sourceIds) {
            $uniqueIds = array_values(array_unique(array_map('strval', $sourceIds)));
            if (empty($uniqueIds)) {
                continue;
            }

            $placeholders = implode(',', array_fill(0, count($uniqueIds), '%s'));
            $conditions[] = "(platform_name = %s AND source_id IN ($placeholders))";
            $values[] = $platformName;
            $values = array_merge($values, $uniqueIds);
        }

        // Add custom platform condition if needed
        if ($needsCustomAll) {
            $conditions[] = "(platform_name = %s)";
            $values[] = 'custom';
        }

        if (!empty($conditions)) {
            // Build the WHERE clause with placeholders
            $whereClause = implode(' OR ', $conditions);

            // Single aggregated query to count ratings grouped by star value
            // Table name is safe (uses $wpdb->prefix which is trusted)
            // All placeholders in $whereClause are matched with values in $values array
            // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- $whereClause contains only %s placeholders that are properly escaped by $wpdb->prepare() with matching $values
            $query = $wpdb->prepare(
                "SELECT rating, COUNT(*) as count 
                 FROM `{$table_name}` 
                 WHERE review_approved = 1 
                   AND rating BETWEEN 0 AND 5
                   AND (" . $whereClause . ")
                 GROUP BY rating",
                $values
            );
            
            // phpcs:ignore PluginCheck.Security.DirectDB.UnescapedDBParameter -- $query is prepared and escaped by $wpdb->prepare() above
            $results = $wpdb->get_results($query);

            if (!empty($results)) {
                foreach ($results as $row) {
                    $rating = (int) $row->rating;
                    if ($rating >= 0 && $rating <= 5) {
                        $counts[(string) $rating] = (int) $row->count;
                        $totalReviews += (int) $row->count;
                    }
                }
            }
        }

        if ($totalReviews === 0) {
            return static::getDefaultRatingBreakdown();
        }

        // Build the breakdown array in the required format
        $breakdown = [];
        for ($star = 5; $star >= 0; $star--) {
            $count = $counts[(string) $star];
            $percentage = static::calculatePercentage($count, $totalReviews);

            $breakdown[] = [
                'type' => 'star_rating',
                'star' => $star,
                'count' => $count,
                'percentage' => $percentage
            ];
        }

        return $breakdown;
    }

    /**
     * Get default rating breakdown structure
     *
     * @return array Default breakdown with zero counts
     */
    private static function getDefaultRatingBreakdown()
    {
        $breakdown = [];
        for ($star = 5; $star >= 0; $star--) {
            $breakdown[] = [
                'type' => 'star_rating',
                'star' => $star,
                'count' => 0,
                'percentage' => '0%'
            ];
        }
        return $breakdown;
    }

    /**
     * Calculate star rating breakdown from reviews array
     *
     * @param array $reviews Array of review objects/arrays
     * @return array Star rating breakdown with proper structure
     */
    public static function calculateStarRatingBreakdownFromReviews($reviews)
    {
        if (empty($reviews)) {
            return static::getDefaultRatingBreakdown();
        }

        $counts = [
            '5' => 0,
            '4' => 0,
            '3' => 0,
            '2' => 0,
            '1' => 0,
            '0' => 0
        ];

        $totalReviews = count($reviews);

        // Count reviews by star rating
        foreach ($reviews as $review) {
            $rating = isset($review['rating']) ? (int) $review['rating'] : 0;

            // Ensure rating is between 0-5
            if ($rating >= 0 && $rating <= 5) {
                $counts[(string) $rating]++;
            }
        }

        // Build the breakdown array in the required format
        $breakdown = [];
        for ($star = 5; $star >= 0; $star--) {
            $count = $counts[(string) $star];
            $percentage = $totalReviews > 0 ? static::calculatePercentage($count, $totalReviews) : '0%';

            $breakdown[] = [
                'type' => 'star_rating',
                'star' => $star,
                'count' => $count,
                'percentage' => $percentage
            ];
        }

        return $breakdown;
    }

    /**
     * Calculate booking.com specific rating breakdown
     * Booking.com uses 10-point scale, so we need special handling
     *
     * @param array $reviews Array of booking.com reviews
     * @return array Star rating breakdown with proper structure
     */
    public static function calculateBookingRatingBreakdown($reviews)
    {
        if (empty($reviews)) {
            return static::getDefaultRatingBreakdown();
        }

        $counts = [
            '5' => 0,
            '4' => 0,
            '3' => 0,
            '2' => 0,
            '1' => 0,
            '0' => 0
        ];

        $totalReviews = count($reviews);

        // Count reviews by star rating (convert booking 10-point to 5-star)
        foreach ($reviews as $review) {
            $rating = isset($review['rating']) ? (float) $review['rating'] : 0;

            // Convert booking.com 10-point scale to 5-star scale
            if ($rating > 5) {
                $rating = $rating / 2; // Convert 10-point to 5-point scale
            }

            $starRating = round($rating);

            // Ensure rating is between 0-5
            if ($starRating >= 0 && $starRating <= 5) {
                $counts[(string) $starRating]++;
            }
        }

        // Build the breakdown array in the required format
        $breakdown = [];
        for ($star = 5; $star >= 0; $star--) {
            $count = $counts[(string) $star];
            $percentage = $totalReviews > 0 ? static::calculatePercentage($count, $totalReviews) : '0%';

            $breakdown[] = [
                'type' => 'star_rating',
                'star' => $star,
                'count' => $count,
                'percentage' => $percentage
            ];
        }

        return $breakdown;
    }

    /**
     * Count reviews within a rating range
     *
     * @param array $reviews Array of reviews
     * @param int $min Minimum rating
     * @param int $max Maximum rating
     * @return int Count of reviews in range
     */
    public static function countReviewsInRange($reviews, $min, $max)
    {
        $count = 0;
        foreach ($reviews as $review) {
            $rating = isset($review['rating']) ? (int) $review['rating'] : 0;
            if ($rating >= $min && $rating <= $max) {
                $count++;
            }
        }
        return $count;
    }

    /**
     * Calculate percentage for breakdown
     *
     * @param int $count Count of items
     * @param int $total Total items
     * @return string Formatted percentage
     */
    public static function calculatePercentage($count, $total)
    {
        if ($total <= 0) {
            return '0%';
        }

        $percentage = round(($count / $total) * 100, 1);
        return $percentage . '%';
    }

    /**
     * Get custom logo and name for a platform and source
     *
     * @param string $platform_name
     * @param string|null $source_id
     * @return array
     */
    public static function getCustomPlatformLogo($platform_name, $source_id = null)
    {
        $validPlatforms = get_option('wpsr_available_valid_platforms', []);

        if (!in_array($platform_name, array_keys($validPlatforms))) {
            return ['logo' => '', 'name' => ''];
        }

        $businessInfo = static::getConnectedAccountsBusinessInfo([$platform_name]);

        if (empty($businessInfo)) {
            return ['logo' => '', 'name' => ''];
        }

        // If source_id is provided, try to get logo for specific source
        if ($source_id && isset($businessInfo[$source_id])) {
            return [
                'logo' => Arr::get($businessInfo, $source_id . '.logo', ''),
                'name' => Arr::get($businessInfo, $source_id . '.platform_label', $platform_name)
            ];
        }

        // Fallback: get first available logo from any source
        foreach ($businessInfo as $info) {
            $logo = Arr::get($info, 'logo', '');
            if (!empty($logo)) {
                return [
                    'logo' => $logo,
                    'name' => Arr::get($info, 'platform_label', $platform_name)
                ];
            }
        }

        return ['logo' => '', 'name' => ''];
    }
}