<?php
/**
 * @package    WordPress
 * @subpackage Traveler
 * @since      1.0
 *
 * Class STUser
 *
 * Created by ShineTheme
 *
 */
if (!class_exists('STUser')) {

    class STUser extends STAdmin
    {
	    protected static $countComments=[];

        function __construct()
        {
            //parent::__construct();

        }

        //Do one time
        function init()
        {



            add_action('show_user_profile', [$this, 'show_user_profile']);

            add_action('edit_user_profile', [$this, 'show_user_profile']);

            add_action('show_user_profile', [$this, 'show_user_certificates']);
            add_action('edit_user_profile', [$this, 'show_user_certificates']);

            add_action('show_user_profile', [$this, 'show_user_partner_service']);
            add_action('edit_user_profile', [$this, 'show_user_partner_service']);

            add_action('personal_options_update', [$this, 'personal_options_update']);
            add_action('edit_user_profile_update', [$this, 'personal_options_update']);


            add_action('admin_menu', [$this, 'st_users_partner_menu']);
            add_action('admin_menu', [$this, 'st_refund_manager_menu']);

            add_action('set_user_role', [$this, '_st_check_change_role'], 999, 3);

            //Check booking edit and redirect
            if (self::is_admin_user_page()) {
                add_action('admin_enqueue_scripts', [__CLASS__, 'add_edit_scripts']);
            }

            add_action('wp_ajax_st_load_more_service_partner', [$this, '_load_more_service_partner']);
            add_action('wp_ajax_nopriv_st_load_more_service_partner', [$this, '_load_more_service_partner']);

            /**
             * @since   1.3.1
             * @updated 1.3.1
             **/
            if (is_super_admin()) {
                add_filter('manage_users_columns', [$this, 'new_modify_user_table']);
                add_filter('manage_users_custom_column', [$this, 'new_modify_user_table_row'], 10, 3);
                add_action('init', [$this, 'admin_change_status_order']);
            }

            add_action('wp_ajax_st_sendmail_expire_partner', [$this, '_sendmail_expire_partner']);
            add_action('wp_ajax_nopriv_st_sendmail_expire_partner', [$this, '_sendmail_expire_partner']);

            //Get User Verifications Info
            add_action('wp_ajax_get_user_verifications_info', array($this, '__getUserVerificationsInfo'));
	        add_action('wp_ajax_user_verify_all_info', array($this, '__userVerifyAllnInfo'));
	        add_action('wp_ajax_user_verify_each_info', array($this, '__userVerifyEachInfo'));
	        add_action('wp_ajax_user_deny_each_info', array($this, '__userDenyEachInfo'));

            add_filter( 'comment_row_actions', array($this, '__filterCommentRowAdmin'), 10, 2 );
            add_filter( 'get_avatar' , array($this, '__customAvatarInAdmin') , 1 , 5 );

            /*add field*/
            add_action( 'show_user_profile', array($this,'_phone_number_field_profile' ));
            add_action( 'edit_user_profile', array($this,'_phone_number_field_profile' ));
            add_action( 'show_user_profile', array($this,'_facebook_field_profile' ));
            add_action( 'edit_user_profile', array($this,'_facebook_field_profile' ));
            add_action( 'show_user_profile', array($this,'_instagram_field_profile' ));
            add_action( 'edit_user_profile', array($this,'_instagram_field_profile' ));
            add_action( 'show_user_profile', array($this,'_twitter_field_profile' ));
            add_action( 'edit_user_profile', array($this,'_twitter_field_profile' ));

            add_action( 'personal_options_update', array($this,'st_phone_number_register') );
            add_action( 'edit_user_profile_update', array($this,'st_phone_number_register') );

            add_action( 'personal_options_update', array($this,'st_facebook_author_register') );
            add_action( 'edit_user_profile_update', array($this,'st_facebook_author_register') );
            add_action( 'personal_options_update', array($this,'st_twitter_author_register') );
            add_action( 'edit_user_profile_update', array($this,'st_twitter_author_register') );
            add_action( 'personal_options_update', array($this,'st_instagram_author_register') );
            add_action( 'edit_user_profile_update', array($this,'st_instagram_author_register') );
            //Sent Email to partner When admin change Pending / Draft to publish
            add_action('draft_to_publish', [ $this,'st_notifyauthor_callback' ] ,10, 1);
            // add_action('publish_st_tours', [ $this,'st_notifyauthor_callback' ] ,10, 2);
            // add_action('publish_st_rental', [ $this,'st_notifyauthor_callback' ] ,10, 2);
            // add_action('publish_st_activity', [ $this,'st_notifyauthor_callback' ] ,10, 2);
            // add_action('publish_st_hotel', [ $this,'st_notifyauthor_callback' ] ,10, 2);
            // add_action('publish_hotel_room', [ $this,'st_notifyauthor_callback' ] ,10, 2);
            // add_action('publish_st_cars', [ $this,'st_notifyauthor_callback' ] ,10, 2);

        }

        public function st_notifyauthor_callback( $post){
            $author = get_userdata($post->post_author);
            if (!empty( $author->roles ) && in_array( 'partner' , $author->roles ) && st()->get_option('partner_post_by_admin', 'on') == 'on') {

                $subject = __('Service Published:','traveler')." ".$post->post_title."";
                $message = __('Hi','traveler')." ".esc_html($author->nickname).",<br>";
                $message .= sprintf(__( "Your service item, %s has just been published.", 'traveler' ),$post->post_title);
                $message .= '<br>';
                $message .= __( 'View this service item ', 'traveler' ) .' <a href="'.get_permalink( $post->ID ).'">'.$post->post_title.'</a>';

				$from = st()->get_option( 'email_from' );
				$from_address = get_option( 'new_admin_email' );
				$headers = [];

				if ( $from && $from_address ) {
					$headers[] = 'From:' . $from . ' <' . $from_address . '>';
				}

                add_filter( 'wp_mail_content_type', [ $this, 'set_html_content_type' ] );
                wp_mail( $author->user_email, $subject, $message, $headers, false );
                remove_filter( 'wp_mail_content_type', [ $this, 'set_html_content_type' ] );
            }


        }
        public function __customAvatarInAdmin($avatar, $id_or_email, $size, $default, $alt){
            if(is_admin()) {
                $user = false;

                if (is_numeric($id_or_email)) {

                    $id = (int)$id_or_email;
                    $user = get_user_by('id', $id);

                } elseif (is_object($id_or_email)) {

                    if (!empty($id_or_email->user_id)) {
                        $id = (int)$id_or_email->user_id;
                        $user = get_user_by('id', $id);
                    }

                } else {
                    $user = get_user_by('email', $id_or_email);
                }

                if ($user && is_object($user)) {
                    if ($user->data->ID) {
                        $avatar_id = get_user_meta($user->data->ID, 'st_avatar', true);
                        if(!empty($avatar_id)) {
                            $avatar = wp_get_attachment_image_url($avatar_id, array(50, 50));
                            $avatar = "<img alt='{$alt}' src='{$avatar}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
                            return $avatar;
                        }
                    }
                }
                return $avatar;
            }
            return $avatar;
        }

        public function __filterCommentRowAdmin($array, $comment){
            $arr_comment = $comment;

            if(!empty($comment)){
                foreach ($comment as $k => $v){
                    $arr_comment->comment_type = '';
                }
            }

            return $arr_comment;
        }

        public function __get($name)
        {
            switch ($name){
                case "extra_fields":
                    return $this->get_extra_fields();
                    break;
            }
            // TODO: Implement __get() method.
        }

        public function get_extra_fields()
        {
            $this->extra_fields = [

                'st_address' => [
                    'type' => 'text',
                    'label' => __('Address Line 1', 'traveler'),
                    'desc' => __('Show under your reviews', 'traveler')
                ],
                'st_address2' => [
                    'type' => 'text',
                    'label' => __('Address Line 2', 'traveler'),
                    'desc' => __('Address Line 2', 'traveler')
                ],
                'st_phone' => [
                    'type' => 'text',
                    'label' => __('Phone', 'traveler'),
                    'desc' => __('Phone', 'traveler')
                ],
                'st_fax' => [
                    'type' => 'text',
                    'label' => __('Fax Number', 'traveler'),
                    'desc' => __('Fax Number', 'traveler')
                ],
                'st_airport' => [
                    'type' => 'text',
                    'label' => __('Airport', 'traveler'),
                    'desc' => __('Airport', 'traveler')
                ],
                'st_city' => [
                    'type' => 'text',
                    'label' => __('City', 'traveler'),
                    'desc' => __('City', 'traveler')
                ],
                'st_province' => [
                    'type' => 'text',
                    'label' => __('State/Province/Region', 'traveler'),
                    'desc' => __('State/Province/Region', 'traveler')
                ],
                'st_zip_code' => [
                    'type' => 'text',
                    'label' => __('ZIP code/Postal code', 'traveler'),
                    'desc' => __('ZIP code/Postal code', 'traveler')
                ],
                'st_country' => [
                    'type' => 'text',
                    'label' => __('Country', 'traveler'),
                    'desc' => __('Country', 'traveler')
                ]
            ];

            $this->extra_fields = apply_filters('st_user_extra_fields', $this->extra_fields);
        }

        public function __userDenyEachInfo(){

			if ( ! current_user_can( 'edit_user' ) ) {
				return;
			}

			check_ajax_referer( 'st_backend_security', 'security' );

	        $user_id = STInput::post('user_id');
	        $criteria = STInput::post('criteria');
	        $notice = STInput::post('notice');

	        if(empty($user_id) || empty($criteria)) return;

	        st_update_user_verify($criteria, $user_id, '0');

	        $arr_old_notice = get_user_meta($user_id, 'admin_verify_notes', true);
	        if(empty($arr_old_notice))
	        	$arr_old_notice = array();
	        $arr_old_notice[$criteria] = $notice;
	        $res = update_user_meta($user_id, 'admin_verify_notes', $arr_old_notice);

	        if($res){
		        $status = STUser::verify_status($user_id)['value'];
		        $data = ['status' => 1, 'verify_info' => $status];
		        wp_send_json($data);
	        }else{
		        $data = ['status' => 0];
		        wp_send_json($data);
	        }
        }

        public function __userVerifyEachInfo(){
	        if(!is_user_logged_in()) return;
	        $user_id = STInput::post('user_id');
	        $criteria = STInput::post('criteria');

	        if(empty($user_id) || empty($criteria)) return;

	        st_update_user_verify( $criteria, $user_id, 1 );
	        $arr_notice = get_user_meta($user_id, 'admin_verify_notes', true);

	        if(empty($arr_notice))
		        $arr_notice = array();

	        if(isset($arr_notice[$criteria])){
	            unset($arr_notice[$criteria]);
	            update_user_meta($user_id, 'admin_verify_notes', $arr_notice);
	        }

	        $status = STUser::verify_status($user_id)['value'];

	        $data = ['status' => 1, 'verify_info' => $status];
	        wp_send_json($data);
        }

        public function __userVerifyAllnInfo(){
	        check_ajax_referer('user_verifications', 'security');
	        if(!is_user_logged_in()) return;
	        $user_id = STInput::post('user_id');
	        if(empty($user_id)) return;
	        st_update_user_verify( '', $user_id, 1 );
	        update_user_meta($user_id, 'admin_verify_notes', array());
	        $data = [ 'status' => 1];
	        echo json_encode($data);die;
        }

	    public static function verify_status_by_key($user_id, $verify_key, $icon = false){
		    $verify_status = st_check_user_verify($verify_key, $user_id);
		    if($verify_status) {
			    if ( $icon ) {
				    return '<div class="verify-status-item icon all"><span class="dashicons dashicons-yes"></span><span class="dashicons dashicons-minus"></span></div>';
			    } else {
				    return '<span class="verify-status-item all">' . __( 'Verified', 'traveler' ) . '</span>';
			    }
		    }else{
			    if($icon){
				    return '<div class="verify-status-item icon none"><span class="dashicons dashicons-yes"></span><span class="dashicons dashicons-minus"></span></div>';
			    }else{
				    return '<span class="verify-status-item none">' . __('Not Verified', 'traveler') . '</span>';
			    }
		    }

	    }

	    public static function verify_status($user_id){
		    $st_verify_email = st_check_user_verify('email', $user_id);
		    $st_verify_phone = st_check_user_verify('phone', $user_id);
		    $st_verify_passport = st_check_user_verify('passport', $user_id);
		    $st_verify_cer = st_check_user_verify('travel_certificate', $user_id);
		    $st_verify_social = st_check_user_verify('social', $user_id);

		    $count = 0;
		    if(!empty($st_verify_phone) && $st_verify_phone == 1)
			    $count++;
		    if(!empty($st_verify_passport) && $st_verify_passport == 1)
			    $count++;
		    if(!empty($st_verify_email) && $st_verify_email == 1)
			    $count++;
		    if(!empty($st_verify_cer) && $st_verify_cer == 1)
			    $count++;
		    if(!empty($st_verify_social) && $st_verify_social == 1)
			    $count++;


			$list_key =	st_get_user_verify_keys();
			$count_c  = count( $list_key );

		    if($count >= $count_c){
			    return [
				    'value' => 'verified',
				    'html' => '<span class="verify-status all">' . __('Verified', 'traveler') . '</span>'
			    ];
		    }
		    if($count > 0 && $count < $count_c){
			    return [
				    'value' => 'apart',
				    'html' => '<span class="verify-status apart">' . __('A Part', 'traveler') . '</span>'
			    ];
		    }
		    if($count == 0){
			    return [
				    'value' => 'none',
				    'html' => '<span class="verify-status none">' . __('Not Verified', 'traveler') . '</span>'
			    ];
		    }
	    }

        public function __getUserVerificationsInfo(){
	        check_ajax_referer('user_verifications', 'security');
	        if(!is_user_logged_in()) return;
	        $user_id = STInput::post('user_id');
	        $user_info = get_userdata($user_id);

	        $model = [
		        'user_email' => $user_info->user_email,
		        'st_phone'       => get_user_meta($user_id, 'st_phone', true ),
	            'passport_name' => get_user_meta( $user_id, 'passport_name', true ),
		        'passport_id' => get_user_meta( $user_id, 'passport_id', true ),
		        'passport_birthday' => get_user_meta( $user_id, 'passport_birthday', true ),
		        'passport_photos' => get_user_meta( $user_id, 'passport_photos', true ),
	            'business_c_name' => get_user_meta( $user_id, 'business_c_name', true ),
		        'business_c_email' => get_user_meta( $user_id, 'business_c_email', true ),
		        'business_c_address' => get_user_meta( $user_id, 'business_c_address', true ),
		        'business_c_phone' => get_user_meta( $user_id, 'business_c_phone', true ),
		        'business_r_name' => get_user_meta( $user_id, 'business_r_name', true ),
		        'business_r_position' => get_user_meta( $user_id, 'business_r_position', true ),
		        'business_r_passport_id' => get_user_meta( $user_id, 'business_r_passport_id', true ),
		        'business_r_issue_date' => get_user_meta( $user_id, 'business_r_issue_date', true ),
		        'social_facebook_uid' => get_user_meta( $user_id, 'social_facebook_uid', true ),
		        'social_facebook_name' => get_user_meta( $user_id, 'social_facebook_name', true ),
		        'business_photos' => get_user_meta( $user_id, 'business_photos', true ),
		        'user_id' => $user_id
	        ];

	        $html = st()->load_template('user/verify/info', '', array('data' => $model));
	        $data = [ 'status' => 1, 'htmlData' => $html ];
	        echo json_encode($data);die;
        }

        public function new_modify_user_table($columns)
        {
            $columns['package'] = __('Member package', 'traveler');
            $columns['status'] = __('Package Status', 'traveler');
            $columns['expiration'] = __('Expiration date', 'traveler');

            return $columns;
        }

        public function new_modify_user_table_row($val, $column_name, $user_id)
        {
            $cls_package = STPackages::get_inst();
            $order = $cls_package->get_order_package_by("partner = {$user_id}");

            if ($order) {
                $currency = get_post_meta($order->id, 'currency', true);
                $currency = (isset($currency['symbol'])) ? $currency['symbol'] : '';

                switch ($column_name) {
                    case 'package':
                        return esc_attr($order->package_name) . ' (' . TravelHelper::format_money_raw($order->package_price, $currency) . ')';
                        break;
                    case 'status':
                        $link_completed = add_query_arg([
                            'order_id' => $order->id,
                            'order_status' => 'completed',
                            'order_user' => $user_id,
                            'security' => wp_create_nonce('st-security')
                        ], admin_url('/users.php'));

                        $link_incomplete = add_query_arg([
                            'order_id' => $order->id,
                            'order_status' => 'incomplete',
                            'order_user' => $user_id,
                            'security' => wp_create_nonce('st-security')
                        ], admin_url('/users.php'));

                        $link_cancelled = add_query_arg([
                            'order_id' => $order->id,
                            'order_status' => 'cancelled',
                            'order_user' => $user_id,
                            'security' => wp_create_nonce('st-security')
                        ], admin_url('/users.php'));

                        $link_deleted = add_query_arg([
                            'order_id' => $order->id,
                            'order_status' => 'deleted',
                            'order_user' => $user_id,
                            'security' => wp_create_nonce('st-security')
                        ], admin_url('/users.php'));

                        $rows_action = '<div class="row-actions">
                            <span><a href="' . esc_url($link_completed) . '" title="' . __('Completed', 'traveler') . '">' . __('Completed', 'traveler') . '</a></span> |
                            <span><a href="' . esc_url($link_incomplete) . '" title="' . __('Incomplete', 'traveler') . '">' . __('Incomplete', 'traveler') . '</a></span> |
                            <span><a href="' . esc_url($link_cancelled) . '" title="' . __('Cancelled', 'traveler') . '">' . __('Cancelled', 'traveler') . '</a></span> |
                            <span><a href="' . esc_url($link_deleted) . '" title="' . __('Delete', 'traveler') . '">' . __('Delete', 'traveler') . '</a></span>
                            </div>
                        ';
                        return esc_attr($order->status) . $rows_action;
                        break;
                    case 'expiration':
                        $created = (int)$order->created;
                        $time = $order->package_time;
                        if ($time == 'unlimited') {
                            $expiration = esc_html__('Unlimited', 'traveler');
                        } else {
                            $expiration = date('Y-m-d', strtotime('+' . (int)$time . ' days', $created));
                        }

                        return esc_attr($expiration);
                        break;
                    default:
                        break;
                }
            }

        }

        public function admin_change_status_order()
        {

            if (wp_verify_nonce(STInput::get('security', ''), 'st-security') && is_admin()) {
                $order_id = (int)STInput::get('order_id', '');
                $user_id = (int)STInput::get('order_user', '');
                $status = STInput::get('order_status', '');

                $admin_package = STAdminPackages::get_inst();

                global $wpdb;

                $order = $admin_package->get_order_by_partner($user_id);
                if (!empty($order) && (int)$order->id == $order_id) {
                    if (in_array($status, ['incomplete', 'completed', 'cancelled'])) {
                        $admin_package->update_status($status, $order_id);
                        $is_page = STInput::request('page');
                        if($status === 'completed'){
                            STUser::_send_approved_customer_register_partner($user_id);
                        }
                        if ($is_page == 'st-users-list-partner-menu') {
                            wp_redirect(admin_url('/admin.php?page=st-users-list-partner-menu&st_tab=' . STInput::request('st_tab')));
                            exit();
                        } else {
                            wp_redirect(admin_url('/users.php'));
                            exit();
                        }
                    } elseif ($status == 'deleted') {
                        $admin_package->delete_order($order_id);
                        $is_page = STInput::request('page');
                        if ($is_page == 'st-users-list-partner-menu') {
                            wp_redirect(admin_url('/admin.php?page=st-users-list-partner-menu&st_tab=' . STInput::request('st_tab')));
                            exit();
                        } else {
                            wp_redirect(admin_url('/users.php'));
                            exit();
                        }
                    }
                }

            }
        }

        static function is_admin_user_page()
        {
            if (is_admin() and isset($_GET['page']) and $_GET['page'] == 'st-users-partner-static-menu') return TRUE;
            if (is_admin() and isset($_GET['page']) and $_GET['page'] == 'st-users-top-partner-menu') return TRUE;
            if (is_admin() and isset($_GET['page']) and $_GET['page'] == 'st-users-list-partner-menu') return TRUE;
            if (is_admin() and isset($_GET['page']) and $_GET['page'] == 'st-users-partner-withdrawal-menu') return TRUE;

            return FALSE;
        }

        static function add_edit_scripts()
        {
            if (get_post_type() != 'product') {
                wp_enqueue_script('select2');
            }
            wp_enqueue_script('st-jquery-ui-datepicker', get_template_directory_uri() . '/js/jquery-ui.js');
            wp_enqueue_style('jjquery-ui.theme.min.css', get_template_directory_uri() . '/css/admin/jquery-ui.min.css');
            wp_enqueue_script('thickbox');
            wp_enqueue_style('thickbox');
            wp_enqueue_style('bootstrap.css', get_template_directory_uri() . '/inc/css/bootstrap_admin.css');
            wp_enqueue_script('Chart.min.js', get_template_directory_uri() . '/inc/plugins/chart-master/Chart.js', ['jquery'], null, true);

	        wp_enqueue_script('verify.js', get_template_directory_uri() . '/js/admin/verify.js', ['jquery'], null, true);

            wp_localize_script('jquery', 'st_params_partner', [
                'ajax_url' => admin_url('admin-ajax.php'),
                'loading_url' => admin_url('/images/wpspin_light.gif'),
                'text_loading' => __("Loading...", 'traveler'),
                'text_no_more' => __("No More", 'traveler'),
				'_s'           => wp_create_nonce( 'st_backend_security' ),
				'nonce' => wp_create_nonce('change_status_withdrawal')
            ]);


        }

        function _st_check_change_role($user_id, $role_new, $role_old)
        {
            $role_old = array_shift($role_old);
            if ($role_new == "partner" and $role_old == "subscriber") {
                update_user_meta($user_id, 'st_pending_partner', '0');
                if (!get_user_meta($user_id, 'st_partner_approved_date', true)) {
                    $date = date('Y-m-d');
                    update_user_meta($user_id, 'st_partner_approved_date', $date);
                }
                STUser::_send_approved_customer_register_partner($user_id);
            }
        }


        function st_users_partner_menu()
        {
            if (current_user_can('manage_options') && class_exists('STTravelCode')) {

                add_menu_page(
                    __('Partner Statistic', 'traveler'),
                    __('Partner Statistic', 'traveler'),
                    'manage_options',
                    'st-users-partner-static-menu',
                    [
                        $this,
                        'st_callback_user_partner_static_function'
                    ]
                    ,
                    'dashicons-admin-users',
                    35
                );

                add_submenu_page('st-users-partner-static-menu', __('List Partner', 'traveler'), __('List Partner', 'traveler'), 'manage_options', 'st-users-list-partner-menu', [$this, 'st_callback_user_partner_function']);

                add_submenu_page('st-users-partner-static-menu', __('Top Partner', 'traveler'), __('Top Partner', 'traveler'), 'manage_options', 'st-users-top-partner-menu', [$this, 'st_callback_user_partner_top_function']);

            }
        }


        function st_callback_user_partner_static_function()
        {
            echo balanceTags($this->load_view('users/partner_static', false));
        }

        /**
         * Refund manager menu
         */
        function st_refund_manager_menu()
        {
            if (current_user_can('manage_options') && class_exists('STTravelCode')) {
                add_menu_page(
                    __('Refund Manager', 'traveler'),
                    __('Refund Manager', 'traveler'),
                    'manage_options',
                    'st-refund-manager-menu',
                    [
                        $this,
                        'st_callback_refund_manager_function'
                    ]
                    ,
                    'dashicons-randomize',
                    35
                );
            }
        }

        function st_callback_refund_manager_function()
        {
            echo balanceTags($this->load_view('users/refund_manager', false));
        }

        //End Refund manager menu for admin

        function st_callback_user_partner_function()
        {
            $action = STInput::request('st_action', false);
            switch ($action) {
                case "delete":
                    //$this->_delete_items();
                    break;
                case "approve_role":
                    $user_id = STInput::request('user_id');
                    if (!empty($user_id)) {
                        $user_data = new WP_User($user_id);
                        $user__permission = array_shift($user_data->roles);
                        if ($user__permission == "subscriber" or $user__permission == "" or $user__permission == "Subscriber" or $user__permission == "partner") {
                            $check_pending = get_user_meta($user_id, 'st_pending_partner', true);
                            if(isset($check_pending) && intval($check_pending) != 0){
                                if (!empty($user_data->roles)) {
                                    foreach ($user_data->roles as $k => $v) {
                                        $user_data->remove_role($v);
                                    }
                                }

                                $user_data = new WP_User($user_id);
                                $user_data->remove_role($user__permission);
                                $user_data->add_role('partner');
                                update_user_meta($user_id, 'st_pending_partner', '0');
                                if (!get_user_meta($user_id, 'st_partner_approved_date', true)) {
                                    $date = date('Y-m-d');
                                    update_user_meta($user_id, 'st_partner_approved_date', $date);
                                }
                                $st_certificates = get_user_meta($user_id, 'st_certificates', true);
                                update_user_meta($user_id, 'st_partner_service', $st_certificates);

                                STAdmin::set_message(__("Approve success !", 'traveler'), 'updated');
                                // send email
                                STUser::_send_approved_customer_register_partner($user_id);
                            }
                        }
                        unset($user_data);
                    }
                    break;
                case "cancel_role":
                    $user_id = STInput::request('user_id');
                    if (!empty($user_id)) {
                        update_user_meta($user_id, 'st_pending_partner', '0');
                        STAdmin::set_message(__("Cancel success !", 'traveler'), 'updated');
                        // send email
                        STUser::_send_cancel_customer_register_partner($user_id);
                    }
                    break;
            }
            echo balanceTags($this->load_view('users/partner_index', false));
        }

        function st_callback_user_partner_top_function()
        {
            $action = STInput::request('st_action', false);
            echo balanceTags($this->load_view('users/partner_top', false));
        }

        function _delete_items()
        {

            if (empty($_POST) or !check_admin_referer('shb_action', 'shb_field')) {
                //// process form data, e.g. update fields
                return;
            }
            $ids = isset($_POST['users']) ? $_POST['users'] : [];
            if (!empty($ids)) {
                foreach ($ids as $id)
                    wp_delete_user($id, true);

            }

            STAdmin::set_message(__("Delete item(s) success", 'traveler'), 'updated');

        }

        function show_user_profile($user)
        {
            echo balanceTags($this->load_view('users/profile', null, ['user' => $user, 'extra_fields' => $this->extra_fields]));
        }

        function show_user_certificates($user)
        {
            echo balanceTags($this->load_view('users/certificates', null, ['user' => $user]));

        }

        function show_user_partner_service($user)
        {
            echo balanceTags($this->load_view('users/partner_service', null, ['user' => $user]));
        }


        static function get_list_partner($permission = "partner", $offset = 0, $limit = 1)
        {
            global $wpdb;
            $where = '';
            $join = '';
            $order_by = '';
            if ($permission == "partner") {
                $join .= " INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id ) ";
                $where .= " AND
                            ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' )";
            }
            if ($permission == "partner_pending") {
                $join .= " INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id )
                           INNER JOIN {$wpdb->prefix}usermeta AS mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id )";
                $where .= " AND
                            (
                                (
                                    (
                                        ( {$wpdb->prefix}usermeta.meta_key = 'st_pending_partner' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) = '1' )
                                    )
                                    AND
                                    (
                                        (
                                            ( mt1.meta_key = '{$wpdb->prefix}capabilities' AND CAST(mt1.meta_value AS CHAR) LIKE '%\"Subscriber\"%' )
                                        )
                                    )
                                )
                            )";
            }
            if ($permission == "partner_update") {
                $join .= " INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id )
                           INNER JOIN {$wpdb->prefix}usermeta AS mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id )";
                $where .= " AND
                            (
                                (
                                    (
                                        ( {$wpdb->prefix}usermeta.meta_key = 'st_pending_partner' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) = '2' )
                                    )
                                    AND
                                    (
                                        (
                                            ( mt1.meta_key = '{$wpdb->prefix}capabilities' AND CAST(mt1.meta_value AS CHAR) LIKE '%\"partner\"%' )
                                        )
                                    )
                                )
                            )";
            }
            if ($permission == "partner_expire") {
                $select = "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}users.*, DATEDIFF(DATE_ADD(DATE_FORMAT(FROM_UNIXTIME({$wpdb->prefix}st_member_packages_order.created), '%Y-%m-%d'), INTERVAL {$wpdb->prefix}st_member_packages_order.package_time DAY),CURDATE()) as expire_date  FROM {$wpdb->prefix}users";
                $join .= " INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id ) INNER JOIN {$wpdb->prefix}st_member_packages_order ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}st_member_packages_order.partner )";
                $where .= " AND
                            ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' ) AND {$wpdb->prefix}st_member_packages_order.package_time <> 'unlimited'";
                if ($number_day = STInput::get('st_custommer_daydiff')) {
                    $where .= " AND  DATEDIFF(DATE_ADD(DATE_FORMAT(FROM_UNIXTIME({$wpdb->prefix}st_member_packages_order.created), '%Y-%m-%d'), INTERVAL {$wpdb->prefix}st_member_packages_order.package_time DAY),CURDATE()) <= {$number_day}";
                }
                $order_by .= " ORDER BY expire_date ASC ";
            } else {
                $select = "SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}users.* FROM {$wpdb->prefix}users";
                $order_by .= " ORDER BY user_registered DESC ";
            }


            if ($c_name = STInput::request('st_custommer_name')) {
                $where .= "
                AND (  {$wpdb->users}.user_login LIKE '%{$c_name}%'
                    OR {$wpdb->users}.user_email LIKE '%{$c_name}%'
                    OR {$wpdb->users}.user_nicename LIKE '%{$c_name}%'
                    OR {$wpdb->users}.display_name LIKE '%{$c_name}%')
                ";
            }


            $querystr = "
                {$select}
                {$join}
                WHERE 1=1
                " . $where . "
                " . $order_by . "
                LIMIT {$offset},{$limit}
            ";
            $pageposts = $wpdb->get_results($querystr, OBJECT);

            return ['total' => $wpdb->get_var("SELECT FOUND_ROWS();"), 'rows' => $pageposts];
        }

        static function _admin_get_fist_date_approved_user_partner()
        {
            global $wpdb;
            $querystr = "
                    SELECT SQL_CALC_FOUND_ROWS mt1.meta_value AS st_fist_date FROM {$wpdb->prefix}users

                    INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id  )

                    INNER JOIN {$wpdb->prefix}usermeta as mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id ) and mt1.meta_key = 'st_partner_approved_date'

                    WHERE 1=1

                    AND ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' )

                    ORDER BY st_fist_date ASC LIMIT 1
                ";

            $rs = $wpdb->get_row($querystr, OBJECT);
            if (!empty($rs)) {
                return date_i18n('Y', strtotime($rs->st_fist_date));
            } else {
                return date_i18n('Y');
            }
        }

        /***
         *
         *
         * since 1.2.7
         * by quandq ahii
         */
        static function _admin_get_data_chart_number_user_partner()
        {
            $st_month = STInput::request('st_month', date('m'));
            $st_year = STInput::request('st_year', date('Y'));
            if ($st_year == "all") {
                $data_default = [];
                global $wpdb;
                $querystr = "
                                SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}users.* ,mt1.meta_value as st_date FROM {$wpdb->prefix}users

                                INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id  )

                                INNER JOIN {$wpdb->prefix}usermeta as mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id ) and mt1.meta_key = 'st_partner_approved_date'

                                WHERE 1=1

                                AND ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' )

                                GROUP BY {$wpdb->prefix}users.ID

                                ORDER BY
                                mt1.meta_value ASC
                            ";
                $total = 0;
                $pageposts = $wpdb->get_results($querystr, OBJECT);
                if (!empty($pageposts)) {
                    foreach ($pageposts as $key => $value) {
                        $tmp_date = date("Y", strtotime($value->st_date));
                        if (empty($data_default[$tmp_date]['number'])) {
                            $data_default[$tmp_date]['number'] = 0;
                        }
                        $data_default[$tmp_date]['number'] += 1;
                        $total++;
                    }
                }
                $data_lable = '[';
                $data_number = '[';
                foreach ($data_default as $k => $v) {
                    $date = $k;
                    $data_lable .= '"' . $date . '",';
                    $data_number .= '"' . $v['number'] . '",';
                }
                $data_lable = substr($data_lable, 0, -1);
                $data_number = substr($data_number, 0, -1);
                $data_lable .= ']';
                $data_number .= ']';

                return ['total' => $total, 'php' => $data_default, 'js' => ['lable' => $data_lable, 'number' => $data_number]];
            } else {
                if ($st_month == 'all') {
                    $date_start = date($st_year . '-01-01');
                    $date_end = date('Y-m-t', strtotime(date($st_year . '-12-01')));
                    $data_default = [];
                    for ($j = 1; $j <= 12; $j++) {
                        if ($j < 10) {
                            $data_default['0' . $j] = [
                                'number' => 0,
                            ];
                        } else {
                            $data_default[$j] = [
                                'number' => 0,
                            ];
                        }
                    }
                    global $wpdb;
                    $querystr = "
                            SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}users.* ,mt1.meta_value as st_date FROM {$wpdb->prefix}users

                            INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id  )

                            INNER JOIN {$wpdb->prefix}usermeta as mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id ) and mt1.meta_key = 'st_partner_approved_date'

                            WHERE 1=1

                            AND ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' )

                            AND mt1.meta_value >= '{$date_start}'

                            AND mt1.meta_value <= '{$date_end}'

                            GROUP BY {$wpdb->prefix}users.ID
                        ";
                    $total = 0;
                    $pageposts = $wpdb->get_results($querystr, OBJECT);
                    if (!empty($pageposts)) {
                        foreach ($pageposts as $key => $value) {
                            $tmp_date = date("m", strtotime($value->st_date));
                            $data_default[$tmp_date]['number'] += 1;
                            $total++;
                        }

                    }
                    $data_lable = '[';
                    $data_number = '[';
                    foreach ($data_default as $k => $v) {
                        $date = date("F", strtotime($st_year . "-" . $k . '-01'));
                        $data_lable .= '"' . $date . '",';
                        $data_number .= '"' . $v['number'] . '",';
                    }
                    $data_lable = substr($data_lable, 0, -1);
                    $data_number = substr($data_number, 0, -1);
                    $data_lable .= ']';
                    $data_number .= ']';

                    return ['total' => $total, 'php' => $data_default, 'js' => ['lable' => $data_lable, 'number' => $data_number]];
                } else {
                    $date_start = date($st_year . '-' . $st_month . '-01');
                    $date_end = date('Y-m-t', strtotime($date_start));
                    $this_month = date('m');
                    $data_default = [];
                    if ($this_month == 2)
                        $day = 28; else $day = 31;
                    for ($j = 1; $j <= $day; $j++) {
                        if ($j < 10) {
                            $data_default['0' . $j] = [
                                'number' => 0,
                            ];
                        } else {
                            $data_default[$j] = [
                                'number' => 0,
                            ];
                        }
                    }
                    global $wpdb;
                    $querystr = "
                                SELECT SQL_CALC_FOUND_ROWS {$wpdb->prefix}users.* ,mt1.meta_value as st_date FROM {$wpdb->prefix}users

                                INNER JOIN {$wpdb->prefix}usermeta ON ( {$wpdb->prefix}users.ID = {$wpdb->prefix}usermeta.user_id  )

                                INNER JOIN {$wpdb->prefix}usermeta as mt1 ON ( {$wpdb->prefix}users.ID = mt1.user_id ) and mt1.meta_key = 'st_partner_approved_date'

                                WHERE 1=1

                                AND ( {$wpdb->prefix}usermeta.meta_key = '{$wpdb->prefix}capabilities' AND CAST({$wpdb->prefix}usermeta.meta_value AS CHAR) LIKE '%\"partner\"%' )

                                AND mt1.meta_value >= '{$date_start}'

                                AND mt1.meta_value <= '{$date_end}'

                                GROUP BY {$wpdb->prefix}users.ID
                            ";
                    $total = 0;
                    $pageposts = $wpdb->get_results($querystr, OBJECT);
                    if (!empty($pageposts)) {
                        foreach ($pageposts as $key => $value) {
                            $tmp_date = date("d", strtotime($value->st_date));
                            $data_default[$tmp_date]['number'] += 1;
                            $total++;
                        }
                    }
                    $data_lable = '[';
                    $data_number = '[';
                    foreach ($data_default as $k => $v) {
                        $date = $k;
                        $data_lable .= '"' . $date . '",';
                        $data_number .= '"' . $v['number'] . '",';
                    }
                    $data_lable = substr($data_lable, 0, -1);
                    $data_number = substr($data_number, 0, -1);
                    $data_lable .= ']';
                    $data_number .= ']';

                    return ['total' => $total, 'php' => $data_default, 'js' => ['lable' => $data_lable, 'number' => $data_number]];
                }

            }
        }

        static function _admin_get_list_top_partner($offset, $limit)
        {
            global $wpdb;
            $where = "";
            if ($c_name = STInput::request('st_custommer_name')) {

                $where .= "
                AND (  {$wpdb->users}.user_login LIKE '%{$c_name}%'
                    OR {$wpdb->users}.user_email LIKE '%{$c_name}%'
                    OR {$wpdb->users}.user_nicename LIKE '%{$c_name}%'
                    OR {$wpdb->users}.display_name LIKE '%{$c_name}%')
                ";

            }
            $querystr = "SELECT SQL_CALC_FOUND_ROWS
                            {$wpdb->prefix}users.user_login,
                            {$wpdb->prefix}users.user_email,
                            {$wpdb->prefix}users.user_nicename,
                            {$wpdb->prefix}users.display_name,
                            {$wpdb->prefix}st_withdrawal.*,
                        SUM({$wpdb->prefix}st_withdrawal.price) AS total_price
                        FROM
                            {$wpdb->prefix}st_withdrawal
                        INNER JOIN {$wpdb->prefix}users ON {$wpdb->prefix}users.ID = {$wpdb->prefix}st_withdrawal.user_id
                        WHERE
                            1 = 1
                        AND {$wpdb->prefix}st_withdrawal.status = 'completed'
                            {$where}
                        GROUP BY
                            {$wpdb->prefix}st_withdrawal.user_id
            ";
            $pageposts = $wpdb->get_results($querystr, OBJECT);

            return ['total' => $wpdb->get_var("SELECT FOUND_ROWS();"), 'rows' => $pageposts];
        }

        static function _send_partner_notice_expire_date($user_id)
        {
            global $expire_partner_id;
            $expire_partner_id = $user_id;

            if ($user_id) {
                $message          = "";
                $id_page_email_for_partner_expired_date = st()->get_option('email_for_partner_expired_date', '');
                $content = !empty(get_post($id_page_email_for_partner_expired_date)) ? wp_kses_post(get_post($id_page_email_for_partner_expired_date)->post_content) : "";
	            $message .= TravelHelper::_get_template_email($message, $content);
                $user_data = get_userdata($user_id);
                $title = $user_data->user_nicename . " - " . $user_data->user_email;
                $subject = sprintf(__('Notification expired membership package: %s', 'traveler'), $title);
                $check = self::_send_mail_user($user_data->user_email, $subject, $message);
            }

            unset($expire_partner_id);
            return $check;
        }

        static function _send_admin_new_register_partner($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $admin_email = st()->get_option('email_admin_address');
            if (!$admin_email) return false;
            $to = $admin_email;
            if ($user_id) {
                $message          = "";
                $id_page_partner_email_for_admin = st()->get_option('partner_email_for_admin', '');
                $content = get_post($id_page_partner_email_for_admin);
                $message .=  do_shortcode($content->post_content);
                $user_data = get_userdata($user_id);
                $title = $user_data->user_nicename . " - " . $user_data->user_email . " - " . $user_data->user_registered;
                $subject = sprintf(__('New Register Partner: %s', 'traveler'), $title);
                $check = self::_send_mail_user($to, $subject, wp_kses_post($message));
            }
            unset($st_user_id);

            return $check;
        }

        static function _send_admin_new_register_user($user_id)
        {

            global $st_user_id;
            $st_user_id = $user_id;
            $admin_email = st()->get_option('email_admin_address');
            if (!$admin_email) return false;
            $to = $admin_email;
            if ($user_id) {
                $message          = "";
                $id_page_user_register_email_for_admin = st()->get_option('user_register_email_for_admin', '');
                $content = get_post($id_page_user_register_email_for_admin);
                $message .=  do_shortcode($content->post_content);
                $title = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
                $subject = sprintf(__('[%s] New User Registration', 'traveler'), $title);
                $check = self::_send_mail_user($to, $subject, $message);
            }
            unset($st_user_id);

            return $check;
        }

        static function _resend_send_admin_update_certificate_partner($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $admin_email = st()->get_option('email_admin_address');
            if (!$admin_email) return false;
            $to = $admin_email;
            if ($user_id) {

                $message          = "";
                $partner_resend_email_for_admin = st()->get_option('partner_resend_email_for_admin', '');
                $content = get_post($partner_resend_email_for_admin);
                $message .=  do_shortcode($content->post_content);

                $user_data = get_userdata($user_id);
                $title = $user_data->user_nicename . " - " . $user_data->user_email;
                $subject = sprintf(__('New Update Certificate Partner: %s', 'traveler'), $title);
                $check = self::_send_mail_user($to, $subject, $message);
            }
            unset($st_user_id);

            return $check;
        }

		static function _send_customer_register_normal($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $user_data = get_userdata($user_id);
            $user_email = $user_data->user_email;
            if (!$user_email) return false;
            $to = $user_email;
            $message          = "";
            $register_email_for_customer = st()->get_option('register_email_for_customer', '');
            $content = get_post($register_email_for_customer);
            $message .=  do_shortcode($content->post_content);
            $title = get_option('blogname');
			$subject = sprintf(__('Your account at %s is created!', 'traveler'), $title);

            $check = self::_send_mail_user($to, $subject, $message);
            unset($st_user_id);

            return $check;
        }

        static function _send_customer_register_partner($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $user_data = get_userdata($user_id);
            $user_email = $user_data->user_email;
            if (!$user_email) return false;
            $to = $user_email;
            $message          = "";
            $partner_email_for_customer = st()->get_option('partner_email_for_customer', '');
            $content = get_post($partner_email_for_customer);
            $message .=  do_shortcode($content->post_content);
            $title = get_option('blogname');
            $auto_approve     = st()->get_option( 'enable_automatic_approval_partner', 'off' );
            if ( $auto_approve == 'on' ) {
                $subject = sprintf(__('Your partner registration at %s is pending approval!', 'traveler'), $title);
            } else {
                $subject = sprintf(__('Your Partner Registration is being approved at %s', 'traveler'), $title);
            }

            $check = self::_send_mail_user($to, $subject, $message);
            unset($st_user_id);

            return $check;
        }

        static function _send_approved_customer_register_partner($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $user_data = get_userdata($user_id);
            $user_email = $user_data->user_email;
            if (!$user_email) return false;
            $to = $user_email;
            $message          = "";
            $id_page_partner_email_approved = st()->get_option('partner_email_approved', '');
            $content = get_post($id_page_partner_email_approved);
            $message .=  do_shortcode($content->post_content);
            $title = get_option('blogname');
            $subject = sprintf(__('Your Partner Registration has been approved and welcome to %s!', 'traveler'), $title);
            $check = self::_send_mail_user($to, $subject, $message);
            unset($st_user_id);

            return $check;
        }

        static function _send_cancel_customer_register_partner($user_id)
        {
            global $st_user_id;
            $st_user_id = $user_id;
            $user_data = get_userdata($user_id);
            $user_email = $user_data->user_email;
            if (!$user_email) return false;
            $to = $user_email;
            $message          = "";
            $id_page_partner_email_cancel = st()->get_option('partner_email_cancel', '');
            $content = get_post($id_page_partner_email_cancel);
            $message .=  do_shortcode($content->post_content);

            $title = get_option('blogname');
            $subject = sprintf(__('%s Partner Registration Has Been Cancel! ', 'traveler'), $title);
            $check = self::_send_mail_user($to, $subject, $message);
            unset($st_user_id);

            return $check;
        }

        private static function _send_mail_user($to, $subject, $message, $attachment = false)
        {
            if (!$message) return [
                'status' => false,
                'data' => '',
                'message' => __("Email content is empty", 'traveler')
            ];
            $from = st()->get_option('email_from');
            $from_address = st()->get_option('email_admin_address');
            $headers = [];

            if ($from && $from_address) {
                $headers []= "MIME-Version: 1.0\r\n";
                $headers []= "Content-Type: text/html; charset=UTF-8\r\n";
                $headers []= 'From: "' . $from . '"<' . $from_address . '>' . "\r\n";
            }
            add_filter('wp_mail_content_type', [__CLASS__, 'set_html_content_type']);
            $check = wp_mail($to, $subject, $message, $headers, $attachment);
            remove_filter('wp_mail_content_type', [__CLASS__, 'set_html_content_type']);

            return [
                'status' => $check,
                'data' => [
                    'to' => $to,
                    'subject' => $subject,
                    'message' => $message,
                    'headers' => $headers
                ]
            ];
        }

        static function set_html_content_type()
        {
            return 'text/html';
        }

        function personal_options_update($user_id)
        {
            if (!current_user_can('edit_user', $user_id))
                return false;

            if (!empty($this->extra_fields)) {

                foreach ($this->extra_fields as $key => $value) {
                    update_user_meta($user_id, $key, sanitize_text_field($_POST[$key]));
                }

                //Update service partner
                $user_data = new WP_User($user_id);

                $user__permission = array_shift($user_data->roles);
                if ($user__permission == "partner") {
                    $data_service_new = STInput::request('st_partner_service');
                    $st_partner_service = [];
                    if (!empty($data_service_new)) {
                        foreach ($data_service_new as $k => $v) {
                            $st_partner_service[$v] = ['name' => $v, 'image' => ''];
                        }
                    }
                    $data_service_old = get_user_meta($user_id, 'st_partner_service', true);
                    if (!empty($data_service_old) and !empty($st_partner_service)) {
                        $check = true;
                        foreach ($data_service_old as $k => $v) {
                            if (empty($st_partner_service[$k])) {
                                $check = false;
                            }
                        }
                        foreach ($st_partner_service as $k => $v) {
                            if (empty($data_service_old[$k])) {
                                $check = false;
                            }
                        }
                        if ($check == false) {
                            STUser::_send_approved_customer_register_partner($user_id);
                            if (!get_user_meta($user_id, 'st_partner_approved_date', true)) {
                                $date = date('Y-m-d');
                                update_user_meta($user_id, 'st_partner_approved_date', $date);
                            }
                        }
                    }
                    if (empty($st_partner_service)) {
                        STUser::_send_cancel_customer_register_partner($user_id);
                    }
                    update_user_meta($user_id, 'st_pending_partner', '0');
                    update_user_meta($user_id, 'st_partner_service', $st_partner_service);
                }

            }
        }

        static function count_comment($user_id = false, $post_id = false, $comment_type = false)
        {
            if (!$user_id) {
                if (is_user_logged_in()) {

                    global $current_user;

                    $user_id = $current_user->ID;
                }
            }

            if ($user_id) {
                global $wpdb;

                $query = 'SELECT COUNT(comment_ID) FROM ' . $wpdb->comments . ' WHERE user_id = "' . sanitize_title_for_query($user_id) . '"';


                if ($post_id) {
                    $query .= ' AND comment_post_ID="' . sanitize_title_for_query($post_id) . '"';
                }

                if ($comment_type) {
                    $query .= ' AND comment_type="' . sanitize_title_for_query($comment_type) . '"';
                }

                $count = $wpdb->get_var($query);


                return $count;
            }
        }

        static function count_comment_by_email($email, $post_id = false, $comment_type = false)
        {
            if (!$email)
                return 0;

            if ($email) {
	            if(array_key_exists($email,self::$countComments)) return self::$countComments[$email];
                global $wpdb;

                $query = 'SELECT COUNT(comment_ID) FROM ' . $wpdb->comments . ' WHERE comment_author_email = "' . $email . '"';


                if ($post_id) {
                    $query .= ' AND comment_post_ID="' . sanitize_title_for_query($post_id) . '"';
                }

                if ($comment_type) {
                    $query .= ' AND comment_type="' . sanitize_title_for_query($comment_type) . '"';
                }

                $count = $wpdb->get_var($query);
	            self::$countComments[$email]=$count;
                return $count;
            }
        }

        static function count_review($user_id = false, $post_id = false)
        {
            return self::count_comment($user_id, $post_id, "st_reviews");
        }

        static function count_review_by_email($email, $post_id = false)
        {
            return self::count_comment_by_email($email, $post_id, "st_reviews");
        }

        static function _load_more_service_partner($post_type = false, $user_id = false)
        {
            if (STInput::request('st_post_type', '') != '') {
                $post_type = esc_html( STInput::request('st_post_type') );
            }
            if (STInput::request('st_user_id', '') != '') {
                $user_id = esc_html( STInput::request('st_user_id') );
            }
            if (!empty($post_type) and !empty($user_id)) {
                $paged = 1;
                $limit = 10;
                if (!empty($_REQUEST['st_paged'])) {
                    $paged = $_REQUEST['st_paged'];
                }
                $offset = ($paged - 1) * $limit;
                global $wpdb;

                $querystr = "SELECT SQL_CALC_FOUND_ROWS *
                        FROM
                            {$wpdb->prefix}posts
                        WHERE 1 = 1

                        AND {$wpdb->prefix}posts.post_author = {$user_id}

                        AND {$wpdb->prefix}posts.post_type = '{$post_type}'

                        ORDER BY
                            {$wpdb->prefix}posts.post_date DESC
                        LIMIT {$offset},{$limit}";
                $pageposts = $wpdb->get_results($querystr, OBJECT);
                $number_post = $wpdb->get_var("SELECT FOUND_ROWS();");
                $html = '';
                if (!empty($pageposts)) {
                    foreach ($pageposts as $k => $v) {
                        $post_id = $v->ID;
                        $address = get_post_meta($post_id, 'address', true);
                        switch ($post_type) {
                            case "st_hotel":
                                $price = TravelHelper::format_money(STHotel::get_price($post_id));
                                break;
                            case "st_rental":
                                $price = TravelHelper::format_money(get_post_meta($post_id, 'price', true));
                                break;
                            case "st_tours":
                                $adult_price = TravelHelper::format_money(get_post_meta($post_id, 'adult_price', true));
                                $child_price = TravelHelper::format_money(get_post_meta($post_id, 'child_price', true));
                                $infant_price = TravelHelper::format_money(get_post_meta($post_id, 'infant_price', true));
                                $price = "
                                	" . __("Adult Price", 'traveler') . ": {$adult_price} <br>
                                	" . __("Child Price", 'traveler') . ": {$child_price} <br>
                                	" . __("Infant Price", 'traveler') . ": {$infant_price}";
                                break;
                            case "st_cars":
                                $price = TravelHelper::format_money(get_post_meta($post_id, 'cars_price', true));
                                $address = get_post_meta($post_id, 'cars_address', true);
                                break;
                            case "st_activity":
                                $adult_price = TravelHelper::format_money(get_post_meta($post_id, 'adult_price', true));
                                $child_price = TravelHelper::format_money(get_post_meta($post_id, 'child_price', true));
                                $infant_price = TravelHelper::format_money(get_post_meta($post_id, 'infant_price', true));
                                $price = "
                                	" . __("Adult Price", 'traveler') . ": {$adult_price} <br>
                                	" . __("Child Price", 'traveler') . ": {$child_price} <br>
                                	" . __("Infant Price", 'traveler') . ": {$infant_price}";
                                break;
                        }
                        $date_create = date_i18n(TravelHelper::getDateFormat(), strtotime($v->post_date));
                        $status = $v->post_status;
                        $img = get_the_post_thumbnail($post_id, [50, 50], array('alt' => TravelHelper::get_alt_image(get_post_thumbnail_id($post_id))));
                        if (empty($img)) {
                            $img = '<img width="50" height="50" alt="no-image" class="wp-post-image" src="' . bfi_thumb(get_template_directory_uri() . '/img/no-image.png', ['width' => 50, 'height' => 50]) . '" alt="' . TravelHelper::get_alt_image() . '">';
                        }
                        $title = "<a href=" . admin_url("post.php?post={$post_id}&action=edit") . ">" . $v->post_title . "</a>";
                        $number = $offset + $k + 1;
                        $html .= "
                                    <tr class='post-id-{$post_id}'>
                                        <td style='text-align: center'>{$number}</td>
                                        <td>{$img}</td>
                                        <td>{$title}</td>
                                        <td>{$price}</td>
                                        <td>{$address}</td>
                                        <td>{$date_create}</td>
                                        <td >{$status}</td>
                                    </tr>";
                    }
                }
                if (STInput::request('st_show') == 'true') {
                    echo json_encode(['data_html' => $html]);
                    die();
                } else {
                    return ["html" => $html, "number_post" => $number_post];
                }

            }
        }

        public static function _update_partner_log_mail($v){
            if($v){
                global $wpdb;
                $table = $wpdb->prefix . 'st_member_packages_order';
                $data  = [
                    'log_mail' => strtotime(date('Y-m-d'))
                ];
                $where = [
                    'partner' => $v
                ];
                $res = $wpdb->update( $table, $data, $where );
                return $res;
            }
            return;
        }

        public function _sendmail_expire_partner()
        {
			if ( ! isset( $_POST['security'] ) || !wp_verify_nonce( $_POST['security'], 'sendmail_expire_partner' ) ) {
				echo json_encode( [
					'status'  => 'error',
					'message' => __( 'You are not allowed', 'traveler' )
				] );
				die;
			}

            $users = STInput::post('users', '');
            if (!empty($users)) {
                foreach ($users as $k => $v) {
                    $check = self::_send_partner_notice_expire_date($v);
                    self::_update_partner_log_mail($v);
                }
                if ($check) {
                    $return = [
                        'status' => true,
                        'message' => __('Send notification expired date membership package successful!', 'traveler')
                    ];
                }
            } else {
                $return = [
                    'status' => false,
                    'message' => __('Please select least 1 partner', 'traveler')
                ];
            }
            echo json_encode($return);
            die;
        }


        /*Add new field social ngothoai*/
        public function _phone_number_field_profile($user){
            $st_phone = get_the_author_meta( 'st_phone', $user->ID ); ?>
            <table class="form-table">
                <tr>
                    <th><label for="st_phone"><?php esc_html_e( 'Phone Number', 'traveler' ); ?></label></th>
                    <td>
                        <input type="url"
                           value="<?php echo esc_attr( $st_phone ); ?>"
                           class="regular-text"
                           name="st_phone"
                        />
                    </td>
                </tr>
            </table>
        <?php }
        public function _facebook_field_profile($user){
            $facebook_author = get_the_author_meta( 'facebook_author', $user->ID ); ?>
            <table class="form-table">
                <tr>
                    <th><label for="facebook_author"><?php esc_html_e( 'Url facebook', 'traveler' ); ?></label></th>
                    <td>
                        <input type="url"
                           value="<?php echo esc_attr( $facebook_author ); ?>"
                           class="regular-text"
                           name="facebook_author"
                        />
                    </td>
                </tr>
            </table>
        <?php }
        public function _twitter_field_profile( $user ){
            $twitter_author = get_the_author_meta( 'twitter_author', $user->ID ); ?>
            <table class="form-table">
                <tr>
                    <th><label for="twitter_author"><?php esc_html_e( 'Url twitter', 'traveler' ); ?></label></th>
                    <td>
                        <input type="url"
                           value="<?php echo esc_attr( $twitter_author ); ?>"
                           class="regular-text"
                           name="twitter_author"
                        />
                    </td>
                </tr>
            </table>
        <?php }
        public function _instagram_field_profile( $user){
            $instagram_author = get_the_author_meta( 'instagram_author', $user->ID ); ?>
            <table class="form-table">
                <tr>
                    <th><label for="instagram_author"><?php esc_html_e( 'Url instagram', 'traveler' ); ?></label></th>
                    <td>
                        <input type="url"
                           value="<?php echo esc_attr( $instagram_author ); ?>"
                           class="regular-text"
                           name="instagram_author"
                        />
                    </td>
                </tr>
            </table>
        <?php }

        public function st_phone_number_register( $user_id){
            if ( ! empty( $_POST['st_phone'] ) ) {
                update_user_meta( $user_id, 'st_phone', sanitize_text_field( $_POST['st_phone'] ) );
            }
        }
        public function st_facebook_author_register( $user_id ) {
            if ( ! empty( $_POST['facebook_author'] ) ) {
                update_user_meta( $user_id, 'facebook_author', sanitize_text_field( $_POST['facebook_author'] ) );
            }
        }
        public function st_twitter_author_register( $user_id ) {
            if ( ! empty( $_POST['twitter_author'] ) ) {
                update_user_meta( $user_id, 'twitter_author', sanitize_text_field( $_POST['twitter_author'] ) );
            }
        }
        public function st_instagram_author_register( $user_id ) {
            if ( ! empty( $_POST['instagram_author'] ) ) {
                update_user_meta( $user_id, 'instagram_author', sanitize_text_field( $_POST['instagram_author'] ) );
            }
        }
    }

    $User = new STUser();

    $User->init();
}