<?php

/**
 * File: /extension/e2pdf-wordpress.php
 *
 * @package  E2Pdf
 * @license  GPLv3
 * @link     https://e2pdf.com
 */
if (!defined('ABSPATH')) {
    die('Access denied.');
}

// phpcs:ignore WordPress.WP.CapitalPDangit.MisspelledClassName
class Extension_E2pdf_Wordpress extends Model_E2pdf_Model {

    private $options;
    private $info = array(
        'key' => 'wordpress',
        'title' => 'WordPress',
    );

    // info
    public function info($key = false) {
        if ($key && isset($this->info[$key])) {
            return $this->info[$key];
        } else {
            return array(
                $this->info['key'] => $this->info['title'],
            );
        }
    }

    // active
    public function active() {
        return true;
    }

    // set
    public function set($key, $value) {
        if (!isset($this->options)) {
            $this->options = new stdClass();
        }
        $this->options->$key = $value;
        switch ($key) {
            case 'dataset':
                $this->set('cached_post', false);
                if ($this->get('dataset')) {
                    if ($this->get('item') == '-3') {
                        $this->set('cached_post', get_user_by('id', $this->get('dataset')));
                    } else {
                        $pll = $this->helper->load('translator')->isPolylang();
                        if ($pll) {
                            $lang = pll_get_post_language($this->get('dataset'));
                            if ($lang) {
                                PLL()->curlang = PLL()->model->get_language($lang);
                            }
                        }
                        $this->set('cached_post', get_post($this->get('dataset')));
                    }
                }
                break;
            default:
                break;
        }
    }

    // get
    public function get($key) {
        if ($key == 'user_id' && $this->get('item') == '-3') {
            $key = 'dataset';
        }
        if (isset($this->options->$key)) {
            $value = $this->options->$key;
        } else {
            switch ($key) {
                case 'args':
                    $value = array();
                    break;
                default:
                    $value = false;
                    break;
            }
        }
        return $value;
    }

    // items
    public function items() {
        $items = array();
        $forms = get_post_types(array(), 'names');
        foreach ($forms as $form) {
            if ($form != 'attachment') {
                $items[] = $this->item($form);
            }
        }
        $items[] = $this->item('-3');
        return $items;
    }

    // datasets
    public function datasets($item_id = false, $name = false) {
        $datasets = array();
        if ($item_id) {
            if ($item_id == '-3') {
                $entries = get_users(
                        array(
                            'fields' => array(
                                'ID', 'user_login',
                            ),
                        )
                );

                if ($entries) {
                    $this->set('item', $item_id);
                    foreach ($entries as $key => $entry) {
                        $this->set('dataset', $entry->ID);
                        $entry_title = $this->render($name);
                        if (!$entry_title) {
                            $entry_title = isset($entry->user_login) && $entry->user_login ? $entry->user_login : $entry->ID;
                        }
                        $datasets[] = array(
                            'key' => $entry->ID,
                            'value' => $entry_title,
                        );
                    }
                }
            } else {
                $wpml = $this->helper->load('translator')->isWPML();
                if ($wpml) {
                    $lang = apply_filters('wpml_current_language', null);
                    $entries = get_posts(
                            array(
                                'post_type' => $item_id,
                                'numberposts' => -1,
                                'post_status' => 'any',
                                'lang' => $lang,
                                'suppress_filters' => false,
                            )
                    );
                } else {
                    $entries = get_posts(
                            array(
                                'post_type' => $item_id,
                                'numberposts' => -1,
                                'post_status' => 'any',
                            )
                    );
                }
                if ($entries) {
                    $this->set('item', $item_id);
                    foreach ($entries as $key => $entry) {
                        $this->set('dataset', $entry->ID);
                        $entry_title = $this->render($name);
                        if (!$entry_title) {
                            $entry_title = isset($entry->post_title) && $entry->post_title ? $entry->post_title : $entry->ID;
                        }
                        $datasets[] = array(
                            'key' => $entry->ID,
                            'value' => $entry_title,
                        );
                    }
                }
            }
        }
        return $datasets;
    }

    // get dataset actions
    public function get_dataset_actions($dataset_id = false) {
        $dataset_id = (int) $dataset_id;
        if (!$dataset_id) {
            return false;
        }
        $actions = new stdClass();
        if ($this->get('item') == '-3') {
            $actions->view = $this->helper->get_url(
                    array(
                        'user_id' => $dataset_id,
                    ), 'user-edit.php?'
            );
        } else {
            $actions->view = $this->helper->get_url(
                    array(
                        'post' => $dataset_id,
                        'action' => 'edit',
                    ), 'post.php?'
            );
        }
        $actions->delete = false;
        return $actions;
    }

    // get template actions
    public function get_template_actions($template = false) {
        $template = (int) $template;
        if (!$template) {
            return;
        }
        $actions = new stdClass();
        $actions->delete = false;
        return $actions;
    }

    // item
    public function item($item_id = false) {
        if (!$item_id && $this->get('item')) {
            $item_id = $this->get('item');
        }
        $item = new stdClass();
        if ($item_id == '-3') {
            $item->id = $item_id;
            $item->name = __('Users');
            $item->url = $this->helper->get_url(array(), 'users.php');
        } else {
            $form = get_post_type_object($item_id);
            if ($form) {
                $item->id = $item_id;
                $item->name = $form->label ? $form->label : $item_id;
                $item->url = $this->helper->get_url(array('post_type' => $item_id), 'edit.php?');
            } else {
                $item->id = '';
                $item->name = '';
                $item->url = 'javascript:void(0);';
            }
        }
        return $item;
    }

    // load filters
    public function load_filters() {
        add_filter('the_content', array($this, 'filter_the_content'), 10, 2);
        add_filter('widget_text', array($this, 'filter_content_custom'));
        add_filter('widget_block_content', array($this, 'filter_content_custom'));

        /**
         * Popup Maker – Popup for opt-ins, lead gen, & more
         * https://wordpress.org/plugins/popup-maker/
         */
        add_filter('pum_popup_content', array($this, 'filter_the_content'), 10, 2);

        /**
         * Events Manager
         * https://wordpress.org/plugins/events-manager/
         */
        add_filter('em_event_output_placeholder', array($this, 'filter_content_custom'), 0);
        add_filter('em_event_output', array($this, 'filter_content_custom'));
        add_filter('em_booking_output_placeholder', array($this, 'filter_content_custom'), 0);
        add_filter('em_booking_output', array($this, 'filter_content_custom'));
        add_filter('em_location_output_placeholder', array($this, 'filter_content_custom'), 0);
        add_filter('em_location_output', array($this, 'filter_content_custom'));
        add_filter('em_category_output_placeholder', array($this, 'filter_content_custom'), 0);

        /**
         * Beaver Builder – WordPress Page Builder
         * https://wordpress.org/plugins/beaver-builder-lite-version/
         */
        add_filter('fl_builder_before_render_shortcodes', array($this, 'filter_content_loop'));

        /**
         * WPBakery Page Builder Image Object Link
         */
        add_filter('vc_map_get_attributes', array($this, 'filter_vc_map_get_attributes'), 10, 2);

        /**
         * Flatsome theme global tab content
         */
        add_filter('theme_mod_tab_content', array($this, 'filter_content_custom'));

        /**
         * MemberPress Mail attachments
         * https://memberpress.com/
         */
        add_filter('mepr_email_send_attachments', array($this, 'filter_mepr_email_send_attachments'), 10, 4);
        add_filter('the_content', array($this, 'filter_mepr_the_content'), 99);
        add_filter('mepr_custom_thankyou_message', array($this, 'filter_mepr_custom_thankyou_message'));

        /**
         * Thrive Theme Builder dynamic shortcode support
         */
        add_filter('thrive_theme_template_content', array($this, 'filter_thrive_theme_template_content'));

        /**
         * WPBakery Page Builder Grid Item
         * [e2pdf-download id="1" dataset="{{ post_data:ID }}"]
         */
        add_filter('vc_basic_grid_items_list', array($this, 'filter_vc_basic_grid_items_list'));

        /**
         * Themify Builder dynamic shortcode support
         * https://wordpress.org/plugins/themify-builder/
         */
        add_filter('themify_builder_module_content', array($this, 'filter_themify_builder_module_content'));

        /**
         * Impreza theme by Up Solutions
         * https://themeforest.net/item/impreza-retina-responsive-wordpress-theme/6434280
         */
        add_filter('us_content_template_the_content', array($this, 'filter_content_custom'));

        /**
         * Cornerstone Builder
         * https://theme.co/cornerstone/
         */
        add_filter('cs_element_pre_render', array($this, 'filter_cs_element_pre_render'));

        /**
         * Divi Theme Builder
         * https://www.elegantthemes.com/
         */
        add_filter('et_pb_module_content', array($this, 'filter_et_pb_module_content'), 30, 6);

        /**
         * User Registration & Membership – Custom Registration Form, Login Form, and User Profile
         * https://wordpress.org/plugins/user-registration/
         */
        add_filter('user_registration_smart_tag_values', array($this, 'filter_user_registration_smart_tag_values'), 0);

        /* Hooks */
        add_filter('post_row_actions', array($this, 'hook_wordpress_row_actions'), 10, 2);
        add_filter('page_row_actions', array($this, 'hook_wordpress_row_actions'), 10, 2);
        add_filter('user_row_actions', array($this, 'hook_wordpress_row_actions'), 10, 2);
    }

    // load actions
    public function load_actions() {
        /**
         * Elementor Website Builder – More than Just a Page Builder
         * https://wordpress.org/plugins/elementor/
         */
        add_action('elementor/widget/before_render_content', array($this, 'action_elementor_widget_before_render_content'));
        add_action('elementor/frontend/widget/before_render', array($this, 'action_elementor_widget_before_render_content'), 5);

        /**
         * JetEngine: WordPress Plugin for Elementor
         * https://crocoblock.com
         */
        add_action('jet-engine/listing/grid/before-render', array($this, 'action_jet_engine_listing_grid_before_render'));
        add_action('jet-engine/listing/grid/after-render', array($this, 'action_jet_engine_listing_grid_after_render'));

        /**
         * Happy Addons for Elementor
         * https://wordpress.org/plugins/happy-elementor-addons/ compatibility fix
         */
        add_action('elementor/frontend/before_render', array($this, 'action_elementor_widget_before_render_content'), 0);

        /**
         * MemberPress Mail attachments remove
         * https://memberpress.com/
         */
        add_action('mepr_email_sent', array($this, 'action_mepr_email_sent'), 10, 3);

        /**
         * User Registration & Membership – Custom Registration Form, Login Form, and User Profile
         * https://wordpress.org/plugins/user-registration/
         */
        add_action('user_registration_email_send_before', array($this, 'action_user_registration_email_send_before'));
        add_action('user_registration_email_send_after', array($this, 'action_user_registration_email_send_after'));

        /* Hooks */
        add_action('add_meta_boxes', array($this, 'hook_wordpress_page_edit'));
    }

    // render
    public function render($value, $field = array(), $convert_shortcodes = true, $raw = false) {
        $value = $this->render_shortcodes($value, $field);
        if (!$raw) {
            $value = $this->strip_shortcodes($value);
            $value = $this->convert_shortcodes($value, $convert_shortcodes, isset($field['type']) && $field['type'] == 'e2pdf-html' ? true : false);
            $value = $this->helper->load('field')->render_checkbox($value, $this, $field);
        }
        return $value;
    }

    // render shortcodes
    public function render_shortcodes($value, $field = array()) {

        $element_id = isset($field['element_id']) ? $field['element_id'] : false;

        if ($this->verify()) {
            /**
             * Set current Post for Toolset Views
             * https://toolset.com/
             */
            do_action('wpv_action_wpv_set_top_current_post', $this->get('cached_post'));

            $wordpress_shortcodes = array(
                'id',
                'post_author',
                'post_date',
                'post_date_gmt',
                'post_content',
                'post_title',
                'post_excerpt',
                'post_status',
                'comment_status',
                'ping_status',
                'post_password',
                'post_name',
                'to_ping',
                'pinged',
                'post_modified',
                'post_modified_gmt',
                'post_content_filtered',
                'post_parent',
                'guid',
                'menu_order',
                'post_type',
                'post_mime_type',
                'comment_count',
                'filter',
                'post_thumbnail',
                'get_the_post_thumbnail',
                'get_the_post_thumbnail_url',
                'get_permalink',
                'get_post_permalink',
            );

            if (false !== strpos($value, '[')) {
                $value = $this->helper->load('field')->pre_shortcodes($value, $this, $field);
                $value = $this->helper->load('field')->inner_shortcodes($value, $this, $field);
                if ($this->get('item') == '-3') {
                    $shortcode_tags = array(
                        'acf',
                    );
                } else {
                    $shortcode_tags = array(
                        'meta',
                        'terms',
                        'e2pdf-wp',
                        'e2pdf-wp-term',
                        'e2pdf-content',
                        'acf',
                    );
                    $shortcode_tags = array_merge($shortcode_tags, $wordpress_shortcodes);
                }
                preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
                $tagnames = array_intersect($shortcode_tags, $matches[1]);
                if (!empty($tagnames)) {
                    preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $value, $shortcodes);
                    foreach ($shortcodes[0] as $key => $shortcode_value) {
                        $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                        $atts = shortcode_parse_atts($shortcode[3]);
                        if ($shortcode[2] === 'e2pdf-content') {
                            if (!isset($atts['id']) && isset($this->get('cached_post')->ID) && $this->get('cached_post')->ID) {
                                $shortcode[3] .= ' id=' . $this->get('cached_post')->ID . '';
                                $value = str_replace($shortcode_value, '[' . $shortcode[2] . $shortcode[3] . ']', $value);
                            }
                        } elseif ($shortcode[2] === 'meta' || $shortcode[2] === 'terms' || $shortcode[2] == 'e2pdf-wp') {
                            if (!isset($atts['id']) && isset($this->get('cached_post')->ID) && $this->get('cached_post')->ID) {
                                $shortcode[3] .= ' id=' . $this->get('cached_post')->ID . '';
                            }
                            if ($shortcode[2] === 'meta') {
                                $shortcode[3] .= ' meta=true';
                            }
                            if ($shortcode[2] === 'terms') {
                                $shortcode[3] .= ' terms=true';
                            }
                            if (substr($shortcode_value, -11) === '[/e2pdf-wp]' || substr($shortcode_value, -8) === '[/terms]' || substr($shortcode_value, -7) === '[/meta]') {
                                if ($shortcode[5]) {
                                    $shortcode[5] = $this->render($shortcode[5], array(), false);
                                }
                                $value = str_replace($shortcode_value, '[e2pdf-wp' . $shortcode[3] . ']' . $shortcode[5] . '[/e2pdf-wp]', $value);
                            } else {
                                $value = str_replace($shortcode_value, '[e2pdf-wp' . $shortcode[3] . ']', $value);
                            }
                        } elseif ($shortcode[2] === 'e2pdf-wp-term') {
                            if (substr($shortcode_value, -16) === '[/e2pdf-wp-term]') {
                                if ($shortcode[5]) {
                                    $shortcode[5] = $this->render($shortcode[5], array(), false);
                                }
                                $value = str_replace($shortcode_value, '[e2pdf-wp-term' . $shortcode[3] . ']' . $shortcode[5] . '[/e2pdf-wp-term]', $value);
                            }
                        } elseif (in_array($shortcode[2], $wordpress_shortcodes, false)) {
                            if (!isset($atts['id']) && isset($this->get('cached_post')->ID) && $this->get('cached_post')->ID) {
                                $shortcode[3] .= ' id=' . $this->get('cached_post')->ID . '';
                            }
                            $shortcode[3] .= ' key=' . $shortcode[2] . '';
                            $value = str_replace($shortcode_value, '[e2pdf-wp' . $shortcode[3] . ']', $value);
                        } elseif ($shortcode[2] === 'acf') {
                            if (!isset($atts['post_id']) && isset($this->get('cached_post')->ID) && $this->get('cached_post')->ID) {
                                if ($this->get('item') == '-3') {
                                    $shortcode[3] .= ' post_id=user_' . $this->get('cached_post')->ID . '';
                                } else {
                                    $shortcode[3] .= ' post_id=' . $this->get('cached_post')->ID . '';
                                }
                                $value = str_replace($shortcode_value, '[' . $shortcode[2] . $shortcode[3] . ']', $value);
                            }
                        }
                    }
                }
                $value = $this->helper->load('field')->wrapper_shortcodes($value, $this, $field);
            }

            add_filter('frm_filter_view', array($this, 'filter_frm_filter_view'));
            $value = $this->helper->load('field')->do_shortcodes($value, $this, $field);
            $value = $this->helper->load('field')->render(
                    apply_filters('e2pdf_extension_render_shortcodes_pre_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), false, false),
                    $this,
                    $field
            );
            remove_filter('frm_filter_view', array($this, 'filter_frm_filter_view'));
        }
        return apply_filters(
                'e2pdf_extension_render_shortcodes_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), false, false
        );
    }

    // strip shortcodes
    public function strip_shortcodes($value) {
        $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
        return $value;
    }

    // convert shortcodes
    public function convert_shortcodes($value, $to = false, $html = false) {
        if ($value) {
            if ($to) {
                $value = str_replace('&#91;', '[', $value);
                if (!$html) {
                    $value = wp_specialchars_decode($value, ENT_QUOTES);
                }
            } else {
                $value = str_replace('[', '&#91;', $value);
            }
        }
        return $value;
    }

    // auto
    public function auto() {

        $response = array();
        $elements = array();

        if ($this->get('item') == '-3') {
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => '<h1>[e2pdf-user key="user_login"]</h1>',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-image',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => '100',
                    'vertical' => 'top',
                    'value' => '[e2pdf-user key="get_avatar_url"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'ID: [e2pdf-user key="ID"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'First Name: [e2pdf-user key="user_firstname"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Last Name: [e2pdf-user key="user_lastname"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Email: [e2pdf-user key="user_email"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Registered: [e2pdf-user key="user_registered"]',
                ),
            );
        } else {
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => '<h1>[e2pdf-wp key="post_title"]</h1>',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Post name: [e2pdf-wp key="post_name"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Post type: [e2pdf-wp key="post_type"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'ID: [e2pdf-wp key="id"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Author: [e2pdf-wp key="post_author"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => '300',
                    'value' => '[e2pdf-wp key="post_content"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Created: [e2pdf-wp key="post_date"]',
                ),
            );
            $elements[] = array(
                'type' => 'e2pdf-html',
                'block' => true,
                'properties' => array(
                    'top' => '20',
                    'left' => '20',
                    'right' => '20',
                    'width' => '100%',
                    'height' => 'auto',
                    'value' => 'Modified: [e2pdf-wp key="post_modified"]',
                ),
            );
        }
        $response['page'] = array(
            'bottom' => '20',
            'top' => '20',
            'left' => '20',
            'right' => '20',
        );

        $response['elements'] = $elements;
        return $response;
    }

    // before render content widget action
    public function action_elementor_widget_before_render_content($widget) {
        if ($widget && ($widget->get_name() == 'shortcode' || $widget->get_name() == 'text-editor')) {
            $content = $widget->get_name() == 'shortcode' ? $widget->get_settings('shortcode') : $widget->get_settings('editor');
            if ($content && false !== strpos($content, '[e2pdf-')) {
                $wp_reset_postdata = true;
                if (class_exists('\ElementorPro\Plugin') && class_exists('\ElementorPro\Modules\LoopBuilder\Documents\Loop')) {
                    $document = \ElementorPro\Plugin::elementor()->documents->get_current();
                    if ($document && $document instanceof \ElementorPro\Modules\LoopBuilder\Documents\Loop) {
                        $wp_reset_postdata = false;
                    }
                }
                if ($widget->get_name() == 'shortcode') {
                    $widget->set_settings('shortcode', $this->filter_content($content, false, $wp_reset_postdata));
                } elseif ($widget->get_name() == 'text-editor' && !$wp_reset_postdata) {
                    $widget->set_settings('editor', $this->filter_content($content, false, $wp_reset_postdata));
                }
            }
        }
    }

    // jet engine listing grid before render action
    public function action_jet_engine_listing_grid_before_render($listing_grid) {
        $this->set('queried_object', true);
    }

    // jet engine listing grid after render action
    public function action_jet_engine_listing_grid_after_render($listing_grid) {
        $this->set('queried_object', false);
    }

    /**
     * Delete attachments that were sent by MemberPress email
     * https://memberpress.com/
     */
    public function action_mepr_email_sent($email, $values, $attachments) {
        $files = $this->helper->get('wordpress_attachments_mepr');
        if (is_array($files) && !empty($files)) {
            foreach ($files as $key => $file) {
                $this->helper->delete_dir(dirname($file) . '/');
            }
            $this->helper->deset('wordpress_attachments_mepr');
        }
    }

    // registration email send before action
    public function action_user_registration_email_send_before() {
        add_filter('wp_mail', array($this, 'filter_wp_mail'), 11);
    }

    // registration email send after action
    public function action_user_registration_email_send_after() {
        remove_filter('wp_mail', array($this, 'filter_wp_mail'), 11);
        $files = $this->helper->get('wordpress_attachments');
        if (is_array($files) && !empty($files)) {
            foreach ($files as $key => $file) {
                $this->helper->delete_dir(dirname($file) . '/');
            }
            $this->helper->deset('wordpress_attachments');
        }
    }

    // filter content
    public function filter_content($content, $post_id = false, $wp_reset_postdata = true) {
        global $post;
        if (!is_string($content) || false === strpos($content, '[')) {
            return $content;
        }
        $shortcode_tags = array(
            'e2pdf-download',
            'e2pdf-save',
            'e2pdf-view',
            'e2pdf-adobesign',
            'e2pdf-zapier',
        );
        preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
        $tagnames = array_intersect($shortcode_tags, $matches[1]);
        if (!empty($tagnames)) {
            preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
            foreach ($shortcodes[0] as $key => $shortcode_value) {
                $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                $atts = shortcode_parse_atts($shortcode[3]);
                if (isset($atts['wp_reset_postdata'])) {
                    if ($atts['wp_reset_postdata'] == 'true') {
                        $wp_reset_postdata = true;
                    } else {
                        $wp_reset_postdata = false;
                    }
                }
                if ($wp_reset_postdata) {
                    wp_reset_postdata();
                }
                if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
                } else {
                    if (isset($atts['id'])) {
                        $template = new Model_E2pdf_Template();
                        $template->load($atts['id']);
                        if ($template->get('extension') === 'woocommerce' || $template->get('extension') === 'jetformbuilder') {
                            continue;
                        } elseif ($template->get('extension') === 'wordpress') { // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
                            if (!isset($atts['dataset'])) {
                                if ($template->get('item') == '-3') {
                                    $dataset = get_current_user_id();
                                    $atts['dataset'] = $dataset;
                                    $shortcode[3] .= ' dataset="' . $dataset . '"';
                                } else {
                                    if ($this->get('queried_object') && !$post_id) {
                                        $queried_object = get_queried_object();
                                        $post_id = $queried_object && isset($queried_object->ID) ? $queried_object->ID : false;
                                    }
                                    if ($post_id || isset($post->ID)) {
                                        $dataset = $post_id ? $post_id : $post->ID;
                                        $atts['dataset'] = $dataset;
                                        $shortcode[3] .= ' dataset="' . $dataset . '"';
                                    }
                                }
                            }
                        }
                    }
                    if (!isset($atts['apply'])) {
                        $shortcode[3] .= ' apply="true"';
                    }
                    if (!isset($atts['filter'])) {
                        $shortcode[3] .= ' filter="true"';
                    }
                    $content = str_replace($shortcode_value, do_shortcode_tag($shortcode), $content);
                }
            }
        }
        return $content;
    }

    // [e2pdf-exclude] support inside Formidable Forms View beforeContent and afterContent
    public function filter_frm_filter_view($view) {
        if (isset($view->frm_before_content) && $view->frm_before_content) {
            $view->frm_before_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->frm_before_content);
        }
        if (isset($view->post_content) && $view->post_content) {
            $view->post_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->post_content);
        }
        if (isset($view->frm_after_content) && $view->frm_after_content) {
            $view->frm_after_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->frm_after_content);
        }
        return $view;
    }

    // vc map get attributes filter
    public function filter_vc_map_get_attributes($atts, $tag) {
        if ($tag == 'vc_single_image' && ((isset($atts['onclick']) && $atts['onclick'] == 'custom_link') || (empty($atts['onclick']) && (!isset($atts['img_link_large']) || 'yes' !== $atts['img_link_large']))) && (!empty($atts['link']) || !empty($atts['img_link']))) {

            if (!empty($atts['link'])) {
                $atts['link'] = $this->filter_content($atts['link']);
            }

            if (!empty($atts['img_link'])) {
                $atts['img_link'] = $this->filter_content($atts['img_link']);
            }
        }
        return $atts;
    }

    // filter cs element pre prender
    public function filter_cs_element_pre_render($data) {
        if (!empty($data['_type']) && $data['_type'] == 'raw-content' && !empty($data['raw_content']) && !empty($data['_p'])) {
            $data['raw_content'] = $this->filter_content($data['raw_content'], $data['_p']);
        }
        return $data;
    }

    // filter themify builder module content
    public function filter_themify_builder_module_content($content) {
        if ($content) {
            $content = $this->filter_content($content);
        }
        return $content;
    }

    // filter vs basic grid items list
    public function filter_vc_basic_grid_items_list($items) {
        if ($items) {
            $items = $this->filter_content($items);
        }
        return $items;
    }

    // filter the content
    public function filter_the_content($content, $post_id = false) {
        $content = $this->filter_content($content, $post_id);
        return $content;
    }

    // filter content custom
    public function filter_content_custom($content) {
        $content = $this->filter_content($content);
        return $content;
    }

    // filter content loop
    public function filter_content_loop($content) {
        $content = $this->filter_content($content, false, false);
        return $content;
    }

    /**
     * Memberpress Mail attachments filter
     * https://memberpress.com/
     */
    public function filter_mepr_email_send_attachments($attachments, $mail, $body, $values) {
        $message = $body ? $body : $mail->body();
        if ($message && false !== strpos($message, '[')) {
            $message = $mail->replace_variables($message, $values);
            $shortcode_tags = array(
                'e2pdf-attachment',
                'e2pdf-save',
            );
            preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $message, $matches);
            $tagnames = array_intersect($shortcode_tags, $matches[1]);
            if (!empty($tagnames)) {
                preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $message, $shortcodes);
                foreach ($shortcodes[0] as $key => $shortcode_value) {
                    $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                    $atts = shortcode_parse_atts($shortcode[3]);
                    $file = false;
                    if (isset($atts['id']) && isset($atts['dataset'])) {
                        if (!isset($atts['apply'])) {
                            $shortcode[3] .= ' apply="true"';
                        }
                        if (!isset($atts['filter'])) {
                            $shortcode[3] .= ' filter="true"';
                        }
                        if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) {
                            $file = do_shortcode_tag($shortcode);
                            if ($file) {
                                $tmp = false;
                                if (substr($file, 0, 4) === 'tmp:') {
                                    $file = substr($file, 4);
                                    $tmp = true;
                                }
                                if ($shortcode[2] === 'e2pdf-save' || isset($atts['pdf'])) {
                                    if ($tmp) {
                                        $this->helper->add('wordpress_attachments_mepr', $file);
                                    }
                                } else {
                                    $this->helper->add('wordpress_attachments_mepr', $file);
                                }
                                $attachments[] = $file;
                            }
                        }
                    }
                }
            }
        }
        return $attachments;
    }

    // mepr the content filter
    public function filter_mepr_the_content($content) {
        if (
                class_exists('MeprUtils') && method_exists('MeprUtils', 'get_current_post') &&
                class_exists('MeprOptions') && method_exists('MeprOptions', 'fetch')
        ) {
            $current_post = MeprUtils::get_current_post();
            if ($current_post !== false) {
                $mepr_options = MeprOptions::fetch();
                if ($current_post->ID == $mepr_options->thankyou_page_id) {
                    remove_shortcode('e2pdf-download');
                    remove_shortcode('e2pdf-view');
                    remove_shortcode('e2pdf-save');
                    remove_shortcode('e2pdf-zapier');
                    remove_shortcode('e2pdf-adobesign');
                }
            }
        }
        return $content;
    }

    // mepr custom thank you message filter
    public function filter_mepr_custom_thankyou_message($content) {
        add_shortcode('e2pdf-download', array(new Model_E2pdf_Shortcode(), 'e2pdf_download'));
        add_shortcode('e2pdf-view', array(new Model_E2pdf_Shortcode(), 'e2pdf_view'));
        add_shortcode('e2pdf-save', array(new Model_E2pdf_Shortcode(), 'e2pdf_save'));
        add_shortcode('e2pdf-zapier', array(new Model_E2pdf_Shortcode(), 'e2pdf_zapier'));
        add_shortcode('e2pdf-adobesign', array(new Model_E2pdf_Shortcode(), 'e2pdf_adobesign'));
        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        if (isset($_REQUEST['trans_num']) && class_exists('MeprTransaction') && method_exists('MeprTransaction', 'get_one_by_trans_num')) {
            $txn = new MeprTransaction();
            // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
            $data = MeprTransaction::get_one_by_trans_num($_REQUEST['trans_num']);
            if (method_exists($txn, 'load_data')) {
                $txn->load_data($data);
                if (false !== strpos($content, '[')) {
                    $shortcode_tags = array(
                        'e2pdf-download',
                        'e2pdf-view',
                        'e2pdf-save',
                        'e2pdf-zapier',
                        'e2pdf-adobesign',
                    );
                    preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
                    $tagnames = array_intersect($shortcode_tags, $matches[1]);
                    if (!empty($tagnames)) {
                        preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
                        foreach ($shortcodes[0] as $key => $shortcode_value) {
                            wp_reset_postdata();
                            $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                            $atts = shortcode_parse_atts($shortcode[3]);
                            if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
                            } elseif (isset($atts['id'])) {
                                $user_id = !empty($txn->user_id) ? $txn->user_id : get_current_user_id();
                                $template = new Model_E2pdf_Template();
                                $template->load($atts['id']);
                                if ($template->get('extension') === 'wordpress' && $template->get('item') == '-3') { // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
                                    if (!isset($atts['dataset'])) {
                                        $atts['dataset'] = $user_id;
                                        $shortcode[3] .= ' dataset="' . $user_id . '"';
                                    }
                                } else {
                                    if (!isset($atts['user_id'])) {
                                        $atts['user_id'] = $user_id;
                                        $shortcode[3] .= ' user_id="' . $user_id . '"';
                                    }
                                }
                            }
                            if (!isset($atts['apply'])) {
                                $shortcode[3] .= ' apply="true"';
                            }
                            if (!isset($atts['filter'])) {
                                $shortcode[3] .= ' filter="true"';
                            }
                            $content = str_replace($shortcode_value, do_shortcode_tag($shortcode), $content);
                        }
                    }
                }
            }
        }
        return $content;
    }

    // user registration smart tag values filter
    public function filter_user_registration_smart_tag_values($values) {
        foreach ($values as $key => $value) {
            if (is_string($value) && false !== strpos($value, '[e2pdf-')) {
                $values[$key] = str_replace('[e2pdf-', '&#91;e2pdf-', $value);
            }
        }
        return $values;
    }

    // wp mail filter
    public function filter_wp_mail($args) {
        if (isset($args['message'])) {
            if (false !== strpos($args['message'], '[')) {
                $shortcode_tags = array(
                    'e2pdf-download',
                    'e2pdf-save',
                    'e2pdf-attachment',
                    'e2pdf-adobesign',
                    'e2pdf-zapier',
                );
                preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
                $tagnames = array_intersect($shortcode_tags, $matches[1]);
                if (!empty($tagnames)) {
                    $args['attachments'] = $this->helper->load('convert')->is_string_array($args['attachments']);
                    preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
                    foreach ($shortcodes[0] as $key => $shortcode_value) {
                        $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                        $atts = shortcode_parse_atts($shortcode[3]);
                        if (!isset($atts['apply'])) {
                            $shortcode[3] .= ' apply="true"';
                        }
                        if (!isset($atts['filter'])) {
                            $shortcode[3] .= ' filter="true"';
                        }
                        $file = false;
                        if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) {
                            $file = do_shortcode_tag($shortcode);
                            if ($file) {
                                $tmp = false;
                                if (substr($file, 0, 4) === 'tmp:') {
                                    $file = substr($file, 4);
                                    $tmp = true;
                                }
                                if ($shortcode[2] === 'e2pdf-save' || isset($atts['pdf'])) {
                                    if ($tmp) {
                                        $this->helper->add('wordpress_attachments', $file);
                                    }
                                } else {
                                    $this->helper->add('wordpress_attachments', $file);
                                }
                                $args['attachments'][] = $file;
                            }
                            $args['message'] = str_replace($shortcode_value, '', $args['message']);
                        } else {
                            $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
                        }
                    }
                }
            }
        }
        $wp_mail = array(
            'to' => $args['to'],
            'subject' => $args['subject'],
            'message' => $args['message'],
            'headers' => $args['headers'],
            'attachments' => $args['attachments'],
        );
        return $wp_mail;
    }

    // Thrive Theme Builder dynamic shortcode support   
    public function filter_thrive_theme_template_content($html) {
        add_filter('e2pdf_model_shortcode_e2pdf_download_atts', array($this, 'filter_global_post_id'));
        add_filter('e2pdf_model_shortcode_e2pdf_view_atts', array($this, 'filter_global_post_id'));
        add_filter('e2pdf_model_shortcode_e2pdf_save_atts', array($this, 'filter_global_post_id'));
        add_filter('e2pdf_model_shortcode_e2pdf_zapier_atts', array($this, 'filter_global_post_id'));
        return $html;
    }

    // dynamic post id support filter
    public function filter_global_post_id($atts) {
        if (!isset($atts['dataset']) && isset($atts['id'])) {
            $template_id = isset($atts['id']) ? (int) $atts['id'] : 0;
            $template = new Model_E2pdf_Template();
            if ($template->load($template_id, false)) {
                if ($template->get('extension') === 'wordpress') { // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
                    global $post;
                    if (isset($post->ID)) {
                        $atts['dataset'] = (string) $post->ID;
                        if (!isset($atts['apply'])) {
                            $atts['apply'] = 'true';
                        }
                        if (!isset($atts['filter'])) {
                            $atts['filter'] = 'true';
                        }
                    }
                }
            }
        }
        return $atts;
    }

    // et pb module content filter
    public function filter_et_pb_module_content($content, $props, $attrs, $render_slug, $_address, $global_content) {
        if (($render_slug == 'et_pb_code' || $render_slug == 'et_pb_text') &&
                false !== strpos($content, '[') &&
                function_exists('et_core_is_builder_used_on_current_request') &&
                !et_core_is_builder_used_on_current_request()
        ) {
            global $post;
            $shortcode_tags = array(
                'e2pdf-download',
                'e2pdf-save',
                'e2pdf-view',
                'e2pdf-adobesign',
                'e2pdf-zapier',
            );
            preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
            $tagnames = array_intersect($shortcode_tags, $matches[1]);
            if (!empty($tagnames)) {
                preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
                foreach ($shortcodes[0] as $key => $shortcode_value) {
                    wp_reset_postdata();
                    $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
                    $atts = shortcode_parse_atts($shortcode[3]);
                    if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
                    } else {
                        if (!isset($atts['dataset']) && isset($atts['id']) && (isset($post->ID))) {
                            $dataset = $post->ID;
                            $atts['dataset'] = $dataset;
                            $shortcode[3] .= ' dataset="' . $dataset . '"';
                        }
                    }
                    if (!isset($atts['apply'])) {
                        $shortcode[3] .= ' apply="true"';
                    }

                    if (!isset($atts['filter'])) {
                        $shortcode[3] .= ' filter="true"';
                    }
                    $new_shortcode = '[' . $shortcode[2] . $shortcode[3] . ']';
                    $content = str_replace($shortcode_value, $new_shortcode, $content);
                }
            }
        }
        return $content;
    }

    // verify
    public function verify() {
        if ($this->get('item') && $this->get('cached_post') && (($this->get('item') == get_post_type($this->get('cached_post'))) || ($this->get('item') == '-3' && $this->get('cached_post')))) {
            return true;
        }
        return false;
    }

    // visual mapper
    public function visual_mapper() {

        $vc = '';

        if ($this->get('item') != '-3') {
            $vc .= '<h3 class="e2pdf-plr5">Common</h3>';
            $vc .= '<div class="e2pdf-grid">';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('ID', 'e2pdf-wp key="id"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Author', 'e2pdf-wp key="post_author"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Author ID', 'e2pdf-wp key="post_author_id"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Date', 'e2pdf-wp key="post_date"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Date (GMT)', 'e2pdf-wp key="post_date_gmt"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Content', 'e2pdf-wp key="post_content"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Title', 'e2pdf-wp key="post_title"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Excerpt', 'e2pdf-wp key="post_excerpt"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Status', 'e2pdf-wp key="post_status"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Comment Status', 'e2pdf-wp key="comment_status"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Ping Status', 'e2pdf-wp key="ping_status"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Password', 'e2pdf-wp key="post_password"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Name', 'e2pdf-wp key="post_name"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('To Ping', 'e2pdf-wp key="to_ping"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Ping', 'e2pdf-wp key="pinged"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Modified Date', 'e2pdf-wp key="post_modified"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Modified Date (GMT)', 'e2pdf-wp key="post_modified_gmt"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Filtered Content', 'e2pdf-wp key="post_content_filtered"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Parent ID', 'e2pdf-wp key="post_parent"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('GUID', 'e2pdf-wp key="guid"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Menu Order', 'e2pdf-wp key="menu_order"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Type', 'e2pdf-wp key="post_type"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Mime Type', 'e2pdf-wp key="post_mime_type"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Comments Count', 'e2pdf-wp key="comment_count"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Filter', 'e2pdf-wp key="filter"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Post Thumbnail', 'e2pdf-wp key="get_the_post_thumbnail"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Post Thumbnail URL', 'e2pdf-wp key="get_the_post_thumbnail_url"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Permalink', 'e2pdf-wp key="get_permalink"') . '</div>';
            $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Post Permalink', 'e2pdf-wp key="get_post_permalink"') . '</div>';
            $vc .= '</div>';

            $meta_keys = $this->get_post_meta_keys();
            if (!empty($meta_keys)) {
                $vc .= '<h3 class="e2pdf-plr5">Meta Keys</h3>';
                $vc .= "<div class='e2pdf-grid'>";
                foreach ($meta_keys as $meta_key) {
                    $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element($meta_key, 'e2pdf-wp key="' . $meta_key . '" meta="true"') . '</div>';
                }
                $vc .= '</div>';
            }

            $meta_keys = $this->get_post_taxonomy_keys();
            if (!empty($meta_keys)) {
                $vc .= '<h3 class="e2pdf-plr5">Taxonomy</h3>';
                $vc .= "<div class='e2pdf-grid'>";
                foreach ($meta_keys as $meta_key) {
                    $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element($meta_key, 'e2pdf-wp key="' . $meta_key . '" terms="true" names="true"') . '</div>';
                }
                $vc .= '</div>';
            }
        }

        $vc .= '<h3 class="e2pdf-plr5">User</h3>';
        $vc .= "<div class='e2pdf-grid'>";
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('ID', 'e2pdf-user key="ID"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Description', 'e2pdf-user key="user_description"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('First Name', 'e2pdf-user key="user_firstname"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Last Name', 'e2pdf-user key="user_lastname"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Login', 'e2pdf-user key="user_login"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Nicename', 'e2pdf-user key="user_nicename"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('E-mail', 'e2pdf-user key="user_email"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Url', 'e2pdf-user key="user_url"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Registered', 'e2pdf-user key="user_registered"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('User Status', 'e2pdf-user key="user_status"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('User Level', 'e2pdf-user key="user_level"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Display Name', 'e2pdf-user key="display_name"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Spam', 'e2pdf-user key="spam"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Deleted', 'e2pdf-user key="deleted"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Locale', 'e2pdf-user key="locale"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Rich Editing', 'e2pdf-user key="rich_editing"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Syntax Highlighting', 'e2pdf-user key="syntax_highlighting"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Use SSL', 'e2pdf-user key="use_ssl"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Roles', 'e2pdf-user key="roles"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Avatar', 'e2pdf-user key="get_avatar"') . '</div>';
        $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element('Avatar Url', 'e2pdf-user key="get_avatar_url"') . '</div>';
        $vc .= '</div>';

        $meta_keys = $this->get_user_meta_keys();
        if (!empty($meta_keys)) {
            $vc .= '<h3 class="e2pdf-plr5">User Meta Keys</h3>';
            $vc .= "<div class='e2pdf-grid'>";
            foreach ($meta_keys as $meta_key) {
                $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element($meta_key, 'e2pdf-user key="' . $meta_key . '" meta="true"') . '</div>';
            }
            $vc .= '</div>';
        }

        if (class_exists('ACF') && function_exists('acf_get_field_groups')) {
            $user_groups = acf_get_field_groups(
                    array(
                        'user_id' => 'new',
                        'user_form' => 'all',
                    )
            );
            if (!empty($user_groups)) {
                $user_groups = array_column($user_groups, 'key');
            }
            if ($this->get('item') == '-3') {
                $groups = acf_get_field_groups(
                        array(
                            'user_id' => 'new',
                            'user_form' => 'all',
                        )
                );
            } else {
                $groups = acf_get_field_groups(array('post_type' => $this->get('item')));
            }
            if (!empty($groups)) {
                $vc .= "<h3 class='e2pdf-plr5'>ACF</h3>";
                foreach ($groups as $group_key => $group) {
                    $post_id = '';
                    if (!empty($user_groups)) {
                        if (in_array($group['key'], $user_groups, false)) {
                            if ($this->get('item') == '-3') {
                                $post_id = ' post_id="user_[e2pdf-dataset]"';
                            } else {
                                $post_id = ' post_id="user_[e2pdf-userid]"';
                            }
                        }
                    }
                    $vc .= '<h3 class="e2pdf-plr5">' . $group['title'] . '</h3>';
                    $vc .= "<div class='e2pdf-grid'>";
                    foreach (acf_get_fields($group['key']) as $field_key => $field) {
                        $vc = $this->get_acf_field($vc, $field, $post_id);
                    }
                    $vc .= '</div>';
                }
            }
        }
        return $vc;
    }

    // get acf field
    public function get_acf_field($vc, $field, $post_id) {
        if ($field['type'] == 'repeater' && !empty($field['sub_fields'])) {
            $sub_fields = array();
            foreach ($field['sub_fields'] as $sub_field_key => $sub_field) {
                $sub_fields[] = '[acf field="' . $sub_field['name'] . '"' . $post_id . ']';
                $sub_field['label'] = $field['label'] . ' ' . $sub_field['label'];
                $sub_field['name'] = $field['name'] . '_0_' . $sub_field['name'];
                $vc = $this->get_acf_field($vc, $sub_field, $post_id);
            }
            if (!empty($sub_fields)) {
                $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element($field['label'] . ' Iteration', 'e2pdf-acf-repeater field="' . $field['name'] . '"' . $post_id . ']' . implode(' ', $sub_fields) . "\r\n" . '[/e2pdf-acf-repeater') . '</div>';
            }
        } elseif ($field['type'] == 'group' && !empty($field['sub_fields'])) {
            $sub_fields = array();
            foreach ($field['sub_fields'] as $sub_field_key => $sub_field) {
                $sub_field['label'] = $field['label'] . ' ' . $sub_field['label'];
                $sub_field['name'] = $field['name'] . '_' . $sub_field['name'];
                $vc = $this->get_acf_field($vc, $sub_field, $post_id);
            }
        } else {
            if ($field['name']) {
                $vc .= '<div class="e2pdf-ib e2pdf-w50 e2pdf-vm-item">' . $this->get_vm_element($field['label'], 'acf field="' . $field['name'] . '"' . $post_id) . '</div>';
            }
        }
        return $vc;
    }

    // get post meta keys
    public function get_post_meta_keys() {
        global $wpdb;
        $meta_keys = array();
        if ($this->get('item')) {
            $condition = array(
                'p.post_type' => array(
                    'condition' => '=',
                    'value' => $this->get('item'),
                    'type' => '%s',
                ),
            );
            $order_condition = array(
                'orderby' => 'meta_key',
                'order' => 'desc',
            );
            $where = $this->helper->load('db')->prepare_where($condition);
            $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
            // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
            $meta_keys = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT `meta_key` FROM `' . $wpdb->postmeta . '` `pm` LEFT JOIN ' . $wpdb->posts . ' `p` ON (`p`.`ID` = `pm`.`post_ID`) ' . $where['sql'] . $orderby . '', $where['filter']));
        }
        return $meta_keys;
    }

    // get user meta keys
    public function get_user_meta_keys() {
        global $wpdb;
        $meta_keys = array();
        if ($this->get('item')) {
            $order_condition = array(
                'orderby' => 'meta_key',
                'order' => 'desc',
            );
            $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
            // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
            $meta_keys = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT `meta_key` FROM `' . $wpdb->usermeta . '` ' . $orderby . ''));
        }
        return $meta_keys;
    }

    // get post taxonomy keys
    public function get_post_taxonomy_keys() {
        global $wpdb;
        $meta_keys = array();
        if ($this->get('item')) {
            $order_condition = array(
                'orderby' => 'taxonomy',
                'order' => 'desc',
            );
            $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
            // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
            $meta_keys = $wpdb->get_col($wpdb->prepare('SELECT DISTINCT `taxonomy` FROM `' . $wpdb->term_taxonomy . '` `t` ' . $orderby . ''));
        }
        return $meta_keys;
    }

    // get wm element
    public function get_vm_element($name, $id) {
        $element = '<div>';
        $element .= '<label>' . $name . ':</label>';
        $element .= '<input type="text" name=\'[' . $id . ']\' value=\'[' . $id . ']\' class="e2pdf-w100">';
        $element .= '</div>';
        return $element;
    }

    // page edit hook
    public function hook_wordpress_page_edit() {
        // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
        $items = $this->helper->load('hooks')->get_items('wordpress', 'hook_wordpress_page_edit');
        if (!empty($items)) {
            add_meta_box(
                    'e2pdf',
                    apply_filters('e2pdf_hook_section_title', __('E2Pdf Actions', 'e2pdf'), 'hook_wordpress_page_edit'),
                    array($this, 'hook_wordpress_page_edit_callback'),
                    $items,
                    'side',
                    'default'
            );
        }
    }

    // page edit callback hook
    public function hook_wordpress_page_edit_callback($post) {
        if (!empty($post->post_type)) {
            // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
            $hooks = $this->helper->load('hooks')->get('wordpress', 'hook_wordpress_page_edit', $post->post_type);
            if (!empty($hooks)) {
                foreach ($hooks as $hook) {
                    if ($this->helper->load('hooks')->process_hook(
                                    $hook,
                                    [
                                        'dataset' => $post->ID,
                                    ],
                                    'hook_wordpress_page_edit'
                            )
                    ) {
                        $action = apply_filters(
                                'e2pdf_hook_action_button',
                                array(
                                    'html' => '<p><a class="e2pdf-download-hook" target="_blank" title="%2$s" href="%1$s"><span class="dashicons dashicons-pdf"></span> %2$s</a></p>',
                                    'url' => $this->helper->get_url(
                                            array(
                                                'page' => 'e2pdf',
                                                'action' => 'export',
                                                'id' => $hook,
                                                'dataset' => $post->ID,
                                            ), 'admin.php?'
                                    ),
                                    'title' => 'PDF #' . $hook,
                                ), 'hook_wordpress_page_edit', $hook, $post->ID
                        );
                        if (!empty($action)) {
                            echo sprintf(
                                    $action['html'], $action['url'], $action['title']
                            );
                        }
                    }
                }
            }
        }
    }

    // row actions hook
    public function hook_wordpress_row_actions($actions, $post) {
        if ($post && is_a($post, 'WP_User')) {
            if (!empty($post->ID)) {
                // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
                $hooks = $this->helper->load('hooks')->get('wordpress', 'hook_wordpress_row_actions', '-3');
                foreach ($hooks as $hook) {
                    if ($this->helper->load('hooks')->process_hook(
                                    $hook,
                                    [
                                        'dataset' => $post->ID,
                                    ],
                                    'hook_wordpress_row_actions'
                            )
                    ) {
                        $action = apply_filters(
                                'e2pdf_hook_action_button',
                                array(
                                    'html' => '<a class="e2pdf-download-hook" target="_blank" href="%s">%s</a>',
                                    'url' => $this->helper->get_url(
                                            array(
                                                'page' => 'e2pdf',
                                                'action' => 'export',
                                                'id' => $hook,
                                                'dataset' => $post->ID,
                                            ), 'admin.php?'
                                    ),
                                    'title' => 'PDF #' . $hook,
                                ), 'hook_wordpress_row_actions', $hook, $post->ID
                        );
                        if (!empty($action)) {
                            $actions['e2pdf_' . $hook] = sprintf(
                                    $action['html'], $action['url'], $action['title']
                            );
                        }
                    }
                }
            }
        } else {
            if (!empty($post->post_type) && !empty($post->ID)) {
                // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled
                $hooks = $this->helper->load('hooks')->get('wordpress', 'hook_wordpress_row_actions', $post->post_type);
                foreach ($hooks as $hook) {
                    if ($this->helper->load('hooks')->process_hook(
                                    $hook,
                                    [
                                        'dataset' => $post->ID,
                                    ],
                                    'hook_wordpress_row_actions'
                            )
                    ) {
                        $action = apply_filters(
                                'e2pdf_hook_action_button',
                                array(
                                    'html' => '<a class="e2pdf-download-hook" target="_blank" href="%s">%s</a>',
                                    'url' => $this->helper->get_url(
                                            array(
                                                'page' => 'e2pdf',
                                                'action' => 'export',
                                                'id' => $hook,
                                                'dataset' => $post->ID,
                                            ), 'admin.php?'
                                    ),
                                    'title' => 'PDF #' . $hook,
                                ), 'hook_wordpress_row_actions', $hook, $post->ID
                        );
                        if (!empty($action)) {
                            $actions['e2pdf_' . $hook] = sprintf(
                                    $action['html'], $action['url'], $action['title']
                            );
                        }
                    }
                }
            }
        }
        return $actions;
    }
}
