/home/smartbloks/www/new/wp-content/plugins/mailoptin/src/connections/LearnDashConnect/Connect.php
<?php

namespace MailOptin\LearnDashConnect;

use MailOptin\Core\Admin\Customizer\CustomControls\WP_Customize_Chosen_Select_Control;
use MailOptin\Core\Admin\Customizer\EmailCampaign\Customizer;
use MailOptin\Core\Repositories\EmailCampaignRepository;

class Connect extends \MailOptin\RegisteredUsersConnect\Connect
{
    /**
     * @var Mail_BG_Process
     */
    public $ld_bg_process_instance;

    /**
     * @var string key of connection service. its important all connection name ends with "Connect"
     */
    public static $connectionName = 'LearnDashConnect';


    public function __construct()
    {
        add_action('plugins_loaded', function () {

            if (class_exists('\SFWD_LMS')) {
                Course::get_instance();
                Group::get_instance();
                LearnDashInit::get_instance();

                add_filter('mailoptin_registered_connections', array($this, 'register_connection'));
                add_filter('mailoptin_email_campaign_customizer_page_settings', array($this, 'integration_customizer_settings'), 10, 2);
                add_filter('mailoptin_email_campaign_customizer_settings_controls', array($this, 'integration_customizer_controls'), 10, 4);

                $this->ld_bg_process_instance = new Mail_BG_Process();

                add_action('init', [$this, 'unsubscribe_handler']);
                add_action('init', [$this, 'view_online_version']);
            }
        });
    }

    /**
     * @param array $connections
     *
     * @return array
     */
    public function register_connection($connections)
    {
        $connections[self::$connectionName] = __('LearnDash', 'mailoptin');

        return $connections;
    }

    /**
     * @param array $settings
     *
     * @return mixed
     */
    public function integration_customizer_settings($settings)
    {
        $settings['LearnDashConnect_courses'] = [
            'default'   => '',
            'type'      => 'option',
            'transport' => 'postMessage',
        ];

        $settings['LearnDashConnect_groups'] = [
            'default'   => '',
            'type'      => 'option',
            'transport' => 'postMessage',
        ];

        return $settings;
    }

    /**
     * @param array $controls
     * @param \WP_Customize_Manager $wp_customize
     * @param string $option_prefix
     * @param Customizer $customizerClassInstance
     *
     * @return mixed
     */
    public function integration_customizer_controls($controls, $wp_customize, $option_prefix, $customizerClassInstance)
    {
        // always prefix with the name of the connect/connection service.
        $controls['LearnDashConnect_courses'] = new WP_Customize_Chosen_Select_Control(
            $wp_customize,
            $option_prefix . '[LearnDashConnect_courses]',
            array(
                'label'       => __('Restrict to Courses', 'mailoptin'),
                'section'     => $customizerClassInstance->campaign_settings_section_id,
                'settings'    => $option_prefix . '[LearnDashConnect_courses]',
                'description' => __('Select the courses whose users with access will receive the emails from this campaign.', 'mailoptin'),
                'choices'     => $this->get_courses(),
                'priority'    => 62
            )
        );

        $controls['LearnDashConnect_groups'] = new WP_Customize_Chosen_Select_Control(
            $wp_customize,
            $option_prefix . '[LearnDashConnect_groups]',
            array(
                'label'       => __('Restrict to Groups', 'mailoptin'),
                'section'     => $customizerClassInstance->campaign_settings_section_id,
                'settings'    => $option_prefix . '[LearnDashConnect_groups]',
                'description' => __('Select the groups whose users with access will receive the emails from this campaign.', 'mailoptin'),
                'choices'     => $this->get_groups(),
                'priority'    => 63
            )
        );

        return $controls;
    }

    protected function get_courses()
    {
        $args = [
            'post_type'   => 'sfwd-courses',
            'post_status' => 'publish',
            'numberposts' => -1,
        ];

        $courses = get_posts($args);
        $options = [];

        foreach ($courses as $course) {
            $options[$course->ID] = $course->post_title;
        }

        return $options;
    }

    protected function get_groups()
    {
        $collection = learndash_get_groups();

        $options = [];

        foreach ($collection as $item) {
            $options[$item->ID] = $item->post_title;
        }

        return $options;
    }


    /**
     * @param int $email_campaign_id
     * @param int $campaign_log_id
     * @param string $subject
     * @param string $content_html
     * @param string $content_text
     *
     * @return array
     * @throws \Exception
     *
     */
    public function send_newsletter($email_campaign_id, $campaign_log_id, $subject, $content_html, $content_text)
    {
        $courses = EmailCampaignRepository::get_customizer_value($email_campaign_id, 'LearnDashConnect_courses', []);
        $groups  = EmailCampaignRepository::get_customizer_value($email_campaign_id, 'LearnDashConnect_groups', []);

        $bucket = [];

        if (is_array($courses) && ! empty($courses)) {

            foreach ($courses as $course_id) {

                $_offset = 0;
                $_loop   = true;
                $_limit  = 2000;

                while ($_loop === true) {

                    $_users = learndash_get_users_for_course($course_id, ['fields' => ['user_email'], 'number' => $_limit, 'offset' => $_offset]);

                    if (is_a($_users, '\WP_User_Query')) {

                        $_users = $_users->get_results();

                        if ( ! empty($_users)) {

                            foreach ($_users as $_user) {

                                if (in_array($_user->user_email, $bucket)) continue;

                                $_item             = new \stdClass();
                                $_item->user_email = $_user->user_email;
                                $bucket[]          = $_user->user_email;

                                $_item->email_campaign_id = $email_campaign_id;
                                $_item->campaign_log_id   = $campaign_log_id;

                                $this->ld_bg_process_instance->push_to_queue($_item);
                            }
                        }

                        if (count($_users) < $_limit) {
                            $_loop = false;
                        }

                        $_offset += $_limit;

                    } else {
                        $_loop = false;
                    }
                }
            }
        }

        if (is_array($groups) && ! empty($groups)) {

            foreach ($groups as $group_id) {

                $users = learndash_get_groups_users($group_id, true);

                if ( ! empty($users)) {

                    foreach ($users as $user) {

                        if (in_array($user->user_email, $bucket)) continue;

                        $_item             = new \stdClass();
                        $_item->user_email = $user->user_email;
                        $bucket[]          = $user->user_email;

                        $_item->email_campaign_id = $email_campaign_id;
                        $_item->campaign_log_id   = $campaign_log_id;

                        $this->ld_bg_process_instance->push_to_queue($_item);
                    }
                }
            }
        }

        $this->ld_bg_process_instance->mo_save($campaign_log_id, $email_campaign_id)
                                     ->mo_dispatch($campaign_log_id, $email_campaign_id);


        return ['success' => true];
    }

    public function unsubscribe_handler()
    {
        if ( ! isset($_GET['mo_learndash_unsubscribe']) || empty($_GET['mo_learndash_unsubscribe'])) return;

        $email = sanitize_text_field($_GET['mo_learndash_unsubscribe']);

        $contacts   = get_option('mo_learndash_unsubscribers', []);
        $contacts[] = $email;

        update_option('mo_learndash_unsubscribers', $contacts, false);

        $this->delete_unsubscribe_leadbank_contact($email);

        do_action('mo_learndash_unsubscribe', $contacts, $email);

        $success_message = apply_filters('mo_learndash_unsubscribe_message', esc_html__("You've successfully been unsubscribed.", 'mailoptin'));

        wp_die($success_message, $success_message, ['response' => 200]);
    }

    /**
     * @return self
     */
    public static function get_instance()
    {
        static $instance = null;

        if (is_null($instance)) {
            $instance = new self();
        }

        return $instance;
    }
}