/**
 * parse shortcodes
 *
 * @param array @args
 * @param string @content
 * @param string @tag
 * @return string $content
 */
function mgm_shortcode_parse($args, $content, $tag)
{
    // current_user
    $current_user = wp_get_current_user();
    // system
    $system_obj = mgm_get_class('system');
    // issue#: 859
    // add <p> to the beggining and </p> to the end of content
    // as WP pass $content with incomplete p tags
    $content = '<p>' . $content . '</p>';
    // remove any '<p></p> found
    $content = str_replace(array('<p></p>'), '', $content);
    // @todo test with force_balance_tags();
    // tag block
    switch ($tag) {
        case 'private':
            // [private] protected content [/private]
            if (mgm_protect_content() || mgm_post_is_purchasable()) {
                //issue #1687
                if (mgm_content_post_access_delay($args)) {
                    $content = mgm_replace_postdealy_content($content);
                } else {
                    $content = mgm_replace_content_tags($tag, $content, $args);
                }
            }
            break;
        case 'private_or':
            // [private_or#member] protected content [/private_or]
            // [private_or membership_type="member"] protected content [/private_or]
            $membership_type = isset($args['membership_type']) ? $args['membership_type'] : str_replace('#', '', mgm_array_shift($args));
            // match
            if ($membership_type) {
                $content = mgm_replace_content_tags($tag, $content, $membership_type);
            }
            break;
        case 'private_and':
            // [private_and#member] protected content [/private_and]
            // [private_and membership_type="member"] protected content [/private_and]
            $membership_type = isset($args['membership_type']) ? $args['membership_type'] : str_replace('#', '', mgm_array_shift($args));
            // match
            if ($membership_type) {
                $content = mgm_replace_content_tags($tag, $content, $membership_type);
            }
            break;
        case 'payperpost_pack':
            // [payperpost_pack#1] : 1 = pack_id, packs to be created in MGM -> PayPerPost -> Post Packs, use the id here
            // [payperpost_pack id=1] : 1 = pack_id
            $pack_id = isset($args['id']) ? $args['id'] : str_replace('#', '', mgm_array_shift($args));
            // match
            if ($pack_id) {
                $content = mgm_replace_content_tags($tag, $content, $pack_id);
            }
            break;
        case 'payperpost':
            // [payperpost#1] : 1 = post_id
            // [payperpost id=1] : 1 = post_id
            $pack_id = isset($args['id']) ? $args['id'] : str_replace('#', '', mgm_array_shift($args));
            // match
            if ($pack_id) {
                $content = mgm_replace_content_tags($tag, $content, $pack_id);
            }
            break;
        case 'subscription_packs':
            // subscription packs / payment gateways
            $content = mgm_sidebar_register_links($current_user->user_login, true, 'page');
            // @todo test
            break;
        case 'user_unsubscribe':
            // user unsubscribe
            $content = mgm_user_unsubscribe_info(null, $args);
            // view current user
            break;
        case 'user_other_subscriptions':
            // other subscriptions
            $content = mgm_user_other_subscriptions_info();
            break;
        case 'membership_details':
            // user subscription
            $content = mgm_membership_details();
            // view current user
            break;
        case 'user_upgrade':
            // user upgrade membership
            $content = mgm_get_upgrade_buttons($args);
            break;
        case 'user_purchase_another_membership':
            // purchase another subscription
            $content = mgm_get_purchase_another_subscription_button($args);
            break;
        case 'user_subscribe':
        case 'user_register':
            // named
            if ($method = mgm_get_var('method', '', true)) {
                // method
                switch ($method) {
                    case 'login':
                        $content = mgm_user_login_form(false);
                        break;
                    case 'lostpassword':
                        $content = mgm_user_lostpassword_form(false);
                        break;
                    default:
                        if (preg_match('/^payment/', $method)) {
                            $content = mgm_transactions_page($args);
                        }
                        break;
                }
            } else {
                $content = mgm_user_register_form($args);
            }
            break;
        case 'user_profile':
            // user profile
            $content = mgm_user_profile_form(NULL, false, $args);
            // view
            break;
        case 'user_public_profile':
            // user profile
            $content = mgm_user_public_profile($args);
            // view
            break;
        case 'transactions':
            // user payments/transactions
            $content = mgm_transactions_page($args);
            break;
        case 'user_contents_by_membership':
            // user contents by membership level
            $content = mgm_membership_content_page();
            break;
        case 'user_lostpassword':
            // user lost password form
            $content = mgm_user_lostpassword_form(false);
            break;
        case 'user_login':
            // user login form
            $content = mgm_user_login_form(false);
            break;
        case 'user_field':
            // user field
            $content = __('Experimental', 'mgm');
            break;
        case 'membership_contents':
            // membership contents
            $content = mgm_membership_contents();
            // view current user
            break;
        case 'logout_link':
            // custom logout link
            // [logout_link#Logout]
            // [logout_link label="Logout"]
            $label = isset($args['label']) ? $args['label'] : str_replace('#', '', mgm_array_shift($args));
            // match
            $content = mgm_logout_link($label);
            break;
        case 'membership_extend_link':
            //INCOMPLETE
            // membership extend link
            // [membership_extend_link#Extend]
            // [membership_extend_link label="Extend"]
            $label = isset($args['label']) ? $args['label'] : str_replace('#', '', mgm_array_shift($args));
            // match
            $content = mgm_membership_extend_link($label);
            break;
        case 'download_error':
            // content
            $content = isset($_GET['error_code']) ? mgm_download_error($_GET['error_code']) : '';
            break;
        case 'user_payment_history':
            // content
            $content = mgm_user_payment_history();
            // view current user
            break;
        case 'user_list':
            // content
            $content = mgm_generate_member_list($args);
            break;
        case 'user_facebook_login':
            // content
            $content = mgm_generate_facebook_login();
            break;
        case 'user_facebook_registration':
            // content
            $content = mgm_generate_facebook_registration();
            break;
        case 'user_purchased_contents':
            // content
            $content = mgm_generate_purchased_contents();
            break;
        case 'user_purchasable_contents':
            // content
            $content = mgm_generate_purchasable_contents();
            break;
            /*case 'addon':
            			// content
             			$content = mgm_purchase_addons($args);
            		break;*/
        /*case 'addon':
        			// content
         			$content = mgm_purchase_addons($args);
        		break;*/
        default:
            // default, which are not shortcode but content tags
            $args = str_replace('#', '', mgm_array_shift($args));
            // match
            $content = mgm_replace_content_tags($tag, $content, $args);
            break;
    }
    // return
    return $content;
}
/**
 * Magic Members verify file download
 *
 * @package MagicMembers
 * @since 2.5
 * @desc verify file download
 * @param string download code
 * @return none
 */
function mgm_download_file($code)
{
    global $wpdb;
    // current_user
    $current_user = wp_get_current_user();
    // system
    $system_obj = mgm_get_class('system');
    // url
    $no_access_redirect_download = $system_obj->get_setting('no_access_redirect_download');
    // redirect
    $do_redirect = empty($no_access_redirect_download) ? false : true;
    // allow default
    $allow_download = true;
    // data fetch
    if ($download = mgm_get_download_data($code)) {
        // for members
        if (bool_from_yn($download->members_only)) {
            // reset as restricted
            $allow_download = false;
            // user check
            if ($current_user->ID) {
                // allow admin
                if (is_super_admin()) {
                    // is_super_admin
                    $allow_download = true;
                } else {
                    // get post mapped
                    $posts = mgm_get_download_post_ids($download->id);
                    // loop
                    foreach ($posts as $post_id) {
                        // only  when user has access to mapped post
                        if (mgm_user_has_access($post_id)) {
                            // set access
                            $allow_download = true;
                            // skip
                            break;
                        }
                    }
                    //check download included in guest restrict via post/page access issue #1609
                    if (!$allow_download && isset($_REQUEST['guest_token']) && isset($_REQUEST['post_id'])) {
                        // only  when user has access to mapped post
                        if (mgm_user_has_access($_REQUEST['post_id'])) {
                            // set access
                            $allow_download = true;
                        }
                    }
                    // download limit user member access issue #902
                    if (!empty($download->download_limit) && (int) $download->download_limit > 0 && $allow_download) {
                        $download_limit = mgm_download_user_limit_check($download->id);
                        if (empty($download_limit)) {
                            mgm_download_user_limit_insert($download->id);
                        } else {
                            if ($download_limit->count < $download->download_limit) {
                                // count
                                $count = $download_limit->count + 1;
                                // update
                                mgm_download_user_limit_update($download->id, $count);
                            } else {
                                $allow_download = false;
                                // redirect
                                if ($do_redirect) {
                                    mgm_redirect(add_query_arg(array('error_code' => 1), $no_access_redirect_download));
                                }
                                // show mesage if redirect does not set
                                mgm_download_error(1);
                                exit;
                            }
                        }
                    }
                }
            } else {
                //check download included in guest restrict via post/page access issue #1609
                if (!$allow_download && isset($_REQUEST['guest_token']) && isset($_REQUEST['post_id'])) {
                    // only  when user has access to mapped post
                    if (mgm_user_has_access($_REQUEST['post_id'])) {
                        // set access
                        $allow_download = true;
                    }
                }
            }
            // end member restriction check
        } else {
            // download limit user member access issue #902
            if ($current_user->ID) {
                // download limit user member access issue #902
                if (!empty($download->download_limit) && (int) $download->download_limit > 0) {
                    $download_limit = mgm_download_user_limit_check($download->id);
                    if (empty($download_limit)) {
                        mgm_download_user_limit_insert($download->id);
                    } else {
                        if ($download_limit->count < $download->download_limit) {
                            $count = $download_limit->count + 1;
                            mgm_download_user_limit_update($download->id, $count);
                        } else {
                            $allow_download = false;
                            // redirect
                            if ($do_redirect) {
                                mgm_redirect(add_query_arg(array('error_code' => 1), $no_access_redirect_download));
                            }
                            // show mesage if redirect does not set
                            mgm_download_error(1);
                            exit;
                        }
                    }
                }
            } else {
                if (bool_from_yn($download->restrict_acces_ip)) {
                    // download limit ip member access issue #902
                    if (!empty($download->download_limit) && (int) $download->download_limit > 0) {
                        $download_limit = mgm_download_ip_limit_check($download->id);
                        if (empty($download_limit)) {
                            mgm_download_ip_limit_insert($download->id);
                        } else {
                            if ($download_limit->count < $download->download_limit) {
                                $count = $download_limit->count + 1;
                                mgm_download_ip_limit_update($download->id, $count);
                            } else {
                                $allow_download = false;
                                // redirect
                                if ($do_redirect) {
                                    mgm_redirect(add_query_arg(array('error_code' => 1), $no_access_redirect_download));
                                }
                                // show mesage if redirect does not set
                                mgm_download_error(1);
                                exit;
                            }
                        }
                    }
                }
            }
        }
        // check expire
        $download_expired = false;
        // allowed alreay
        if ($allow_download) {
            // expire date
            if (!is_null($download->expire_dt)) {
                // expired
                if (intval($download->expire_dt) && time() > strtotime($download->expire_dt)) {
                    $download_expired = true;
                }
            }
        }
        // allowed
        if ($allow_download && !$download_expired) {
            // check if s3 resource
            if (mgm_is_s3_file($download->filename)) {
                //decode - issue #1727
                $download->filename = urldecode($download->filename);
                // expired
                $aws_qsa_expires = $system_obj->get_setting('aws_qsa_expires', '1 HOUR');
                // check if torrent
                if (bool_from_yn($download->is_s3_torrent)) {
                    // redirect to amazon secure url
                    if ($torent_url = mgm_get_s3torent_url($download->filename, $aws_qsa_expires)) {
                        wp_redirect($torent_url);
                        exit;
                    }
                } else {
                    // check
                    if (bool_from_yn($system_obj->get_setting('aws_enable_qsa', 'N'))) {
                        // redirect to amazon secure url
                        if ($token_url = mgm_get_s3token_url($download->filename, $aws_qsa_expires)) {
                            wp_redirect($token_url);
                            exit;
                        }
                    }
                }
                // download as usual
                mgm_stream_download_s3($download->filename);
                exit;
            } else {
                // filepath
                $filepath = mgm_get_abs_file($download->filename);
                // check
                if (file_exists($filepath)) {
                    // do the  download
                    mgm_stream_download($filepath);
                    // delete if s3 file
                    if (mgm_is_s3_file($filepath)) {
                        // old code kept
                        // delete
                        mgm_delete_file($filepath);
                    }
                    // exit
                    exit;
                } else {
                    // redirect
                    if ($do_redirect) {
                        mgm_redirect(add_query_arg(array('error_code' => 2), $no_access_redirect_download));
                    }
                    // show mesage if redirect does not set
                    mgm_download_error(2);
                    exit;
                }
            }
        } else {
            // redirect
            $code = $download_expired ? '3' : '4';
            // redirect
            if ($do_redirect) {
                mgm_redirect(add_query_arg(array('error_code' => $code), $no_access_redirect_download));
            }
            // show mesage if redirect does not set
            mgm_download_error($code);
            exit;
        }
    } else {
        // redirect
        if ($do_redirect) {
            mgm_redirect(add_query_arg(array('error_code' => 4), $no_access_redirect_download));
        }
        // show mesage if redirect does not set
        mgm_download_error(4);
        exit;
    }
}