/**
 * Get the nice name for a user membership status
 *
 * @since  1.0.0
 * @param  string $status
 * @return string
 */
function wc_memberships_get_user_membership_status_name($status)
{
    $statuses = wc_memberships_get_user_membership_statuses();
    $status = 'wcm-' === substr($status, 0, 4) ? substr($status, 4) : $status;
    $status = isset($statuses['wcm-' . $status]) ? $statuses['wcm-' . $status] : $status;
    return is_array($status) && isset($status['label']) ? $status['label'] : $status;
}
 /**
  * Updates status of membership
  *
  * @param string $new_status Status to change the order to. No internal wcm- prefix is required.
  * @param string $note (default: '') Optional note to add
  */
 public function update_status($new_status, $note = '')
 {
     if (!$this->get_id()) {
         return;
     }
     // Standardise status names.
     $new_status = 'wcm-' === substr($new_status, 0, 4) ? substr($new_status, 4) : $new_status;
     $old_status = $this->get_status();
     // Get valid statuses
     $valid_statuses = wc_memberships_get_user_membership_statuses();
     // Only update if they differ - and ensure post_status is a 'wcm' status.
     if ($new_status !== $old_status && in_array('wcm-' . $new_status, array_keys($valid_statuses))) {
         // Note will be added to the membership by the general User_Memberships utility class,
         // so that we add only 1 note instead of 2 when updating the status.
         wc_memberships()->user_memberships->set_membership_status_transition_note($note);
         // Update the order
         wp_update_post(array('ID' => $this->get_id(), 'post_status' => 'wcm-' . $new_status));
         $this->status = 'wcm-' . $new_status;
     }
 }
 /**
  * Init WooCommerce Memberships post statuses
  *
  * @since 1.0.0
  */
 private static function init_post_statuses()
 {
     $statuses = wc_memberships_get_user_membership_statuses();
     foreach ($statuses as $status => $labels) {
         register_post_status($status, array('label' => $labels['label'], 'public' => false, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => $labels['label_count']));
     }
 }
    /**
     * Render dropdowns for user membership filters
     *
     * @since 1.0.0
     */
    public function restrict_user_memberships()
    {
        global $typenow;
        if ('wc_user_membership' != $typenow) {
            return;
        }
        // membership plan options
        $membership_plans = wc_memberships_get_membership_plans();
        $selected_plan = isset($_GET['post_parent']) ? $_GET['post_parent'] : null;
        $statuses = wc_memberships_get_user_membership_statuses();
        $selected_status = isset($_GET['post_status']) ? $_GET['post_status'] : null;
        /**
         * Filter the expiry terms dropdown menu
         *
         * @param array $terms Associative array of expiry term keys and labels.
         * @since 1.0.0
         */
        $expires = apply_filters('wc_memberships_expiry_terms_dropdown_options', array('today' => __('Today', WC_Memberships::TEXT_DOMAIN), 'this_week' => __('This week', WC_Memberships::TEXT_DOMAIN), 'this_month' => __('This month', WC_Memberships::TEXT_DOMAIN)));
        $selected_expiry_term = isset($_GET['expires']) ? $_GET['expires'] : null;
        ?>
		<select name="post_parent">
			<option value=""><?php 
        _e('All plans', WC_Memberships::TEXT_DOMAIN);
        ?>
</option>
			<?php 
        if (!empty($membership_plans)) {
            foreach ($membership_plans as $membership_plan) {
                echo "\t<option value='" . esc_attr($membership_plan->get_id()) . "'" . selected($membership_plan->get_id(), $selected_plan, false) . '>' . esc_html($membership_plan->get_name()) . '</option>' . PHP_EOL;
            }
        }
        ?>
		</select>

		<select name="post_status">
			<option value=""><?php 
        _e('All statuses', WC_Memberships::TEXT_DOMAIN);
        ?>
</option>
			<?php 
        if (!empty($statuses)) {
            foreach ($statuses as $status => $labels) {
                echo "\t<option value='" . esc_attr($status) . "'" . selected($status, $selected_status, false) . '>' . esc_html($labels['label']) . '</option>' . PHP_EOL;
            }
        }
        ?>
		</select>

		<select name="expires">
			<option value=""><?php 
        _e('Expires', WC_Memberships::TEXT_DOMAIN);
        ?>
</option>
			<?php 
        if (!empty($expires)) {
            foreach ($expires as $expiry_term => $label) {
                echo "\t<option value='" . esc_attr($expiry_term) . "'" . selected($expiry_term, $selected_expiry_term, false) . '>' . esc_html($label) . '</option>' . PHP_EOL;
            }
        }
        ?>
		</select>
		<?php 
    }
    /**
     * Display the membership data meta box
     *
     * @param WP_Post $post
     * @since 1.0.0
     */
    public function output(WP_Post $post)
    {
        global $pagenow;
        // Prepare variables
        $user_membership = wc_memberships_get_user_membership($post->ID);
        $user_id = 'post.php' == $pagenow ? $user_membership->get_user_id() : (isset($_GET['user']) ? $_GET['user'] : null);
        // Bail out if no user ID
        if (!$user_id) {
            return;
        }
        // Get user details
        $user = get_userdata($user_id);
        // All the user memberships
        $user_memberships = wc_memberships_get_user_memberships($user->ID);
        // Prepare options
        $status_options = array();
        foreach (wc_memberships_get_user_membership_statuses() as $status => $labels) {
            $status_options[$status] = $labels['label'];
        }
        /**
         * Filter status options that appear in the edit user membership screen
         *
         * @since 1.0.0
         * @param array $options Associative array of option value => label pairs
         * @param int $user_membership_id User membership ID
         */
        $status_options = apply_filters('wc_memberships_edit_user_membership_screen_status_options', $status_options, $post->ID);
        // prepare membership plan options
        $membership_plan_options = array();
        $membership_plans = wc_memberships_get_membership_plans(array('post_status' => array('publish', 'private', 'future', 'draft', 'pending', 'trash')));
        if (!empty($membership_plans)) {
            foreach ($membership_plans as $membership_plan) {
                $exists = false;
                // Each user can only have 1 membership per plan.
                // Check if user already has a membership for this plan.
                if (!empty($user_memberships)) {
                    foreach ($user_memberships as $membership) {
                        if ($membership->get_plan_id() == $membership_plan->get_id()) {
                            $exists = true;
                            break;
                        }
                    }
                }
                // Only add plan to options if user is not a member of this plan or
                // if the current membership has this plan.
                // Todo: instead of removing, disable the option once
                // https://github.com/woothemes/woocommerce/pull/8024 lands in stable
                if (!$exists || $user_membership->get_plan_id() == $membership_plan->get_id()) {
                    $membership_plan_options[$membership_plan->get_id()] = $membership_plan->get_name();
                }
            }
        }
        $current_membership = null;
        $order = $user_membership->get_order();
        $product = $user_membership->get_product();
        ?>

		<h3 class="membership-plans">
			<ul class="sections">
			<?php 
        if (!empty($user_memberships)) {
            foreach ($user_memberships as $membership) {
                ?>
				<li <?php 
                if ($membership->get_id() == $post->ID) {
                    $current_membership = $membership->get_id();
                    ?>
class="active"<?php 
                }
                ?>
><a href="<?php 
                echo esc_url(get_edit_post_link($membership->get_id()));
                ?>
"><?php 
                echo wp_kses_post($membership->get_plan()->get_name());
                ?>
</a></li>
			<?php 
            }
        }
        ?>
			<?php 
        if (count($user_memberships) != count($membership_plans)) {
            ?>
				<li <?php 
            if (!$current_membership) {
                ?>
class="active"<?php 
            }
            ?>
><a href="<?php 
            echo admin_url('post-new.php?post_type=wc_user_membership&user='******'Add a plan...', WC_Memberships::TEXT_DOMAIN);
            ?>
</a></li>
			<?php 
        }
        ?>
			</ul>
		</h3>

		<div class="plan-details">
			<h4><?php 
        esc_html_e('Membership Details', WC_Memberships::TEXT_DOMAIN);
        ?>
</h4>

			<div class="woocommerce_options_panel">

				<?php 
        /**
         * Fires before the membership details in edit user membership screen
         *
         * @since 1.0.0
         * @param WC_Memberships_User_Membership
         */
        do_action('wc_memberships_before_user_membership_details', $user_membership);
        ?>

				<?php 
        woocommerce_wp_select(array('id' => 'post_parent', 'label' => __('Plan:', WC_Memberships::TEXT_DOMAIN), 'options' => $membership_plan_options, 'value' => $user_membership->get_plan_id(), 'class' => 'wide', 'wrapper_class' => 'js-membership-plan'));
        ?>

				<?php 
        woocommerce_wp_select(array('id' => 'post_status', 'label' => __('Status:', WC_Memberships::TEXT_DOMAIN), 'options' => $status_options, 'value' => 'wcm-' . $user_membership->get_status(), 'class' => 'wide'));
        ?>

				<?php 
        woocommerce_wp_text_input(array('id' => '_start_date', 'label' => __('Member since:', WC_Memberships::TEXT_DOMAIN), 'class' => 'js-user-membership-date', 'description' => __('YYYY-MM-DD', WC_Memberships::TEXT_DOMAIN), 'value' => 'post.php' == $pagenow ? $user_membership->get_start_date('Y-m-d') : date('Y-m-d')));
        ?>

				<?php 
        woocommerce_wp_text_input(array('id' => '_end_date', 'label' => __('Expires:', WC_Memberships::TEXT_DOMAIN), 'class' => 'js-user-membership-date', 'description' => __('YYYY-MM-DD', WC_Memberships::TEXT_DOMAIN), 'value' => $user_membership->get_end_date('Y-m-d', false)));
        ?>

				<?php 
        if ($user_membership->get_paused_date()) {
            ?>
					<p class="form-field"><span class="description"><?php 
            printf(esc_html__('Paused since %s', WC_Memberships::TEXT_DOMAIN), date_i18n(get_option('date_format'), $user_membership->get_paused_date('timestamp')));
            ?>
</span></p>
				<?php 
        }
        ?>

				<?php 
        /**
         * Fires after the membership details in edit user membership screen
         *
         * @since 1.0.0
         * @param WC_Memberships_User_Membership
         */
        do_action('wc_memberships_after_user_membership_details', $user_membership);
        ?>

			</div>

		</div>

		<div class="billing-details">
			<h4><?php 
        esc_html_e('Billing Details', WC_Memberships::TEXT_DOMAIN);
        ?>
</h4>

			<?php 
        /**
         * Fires before the billing details in edit user membership screen
         *
         * @since 1.0.0
         * @param WC_Memberships_User_Membership
         */
        do_action('wc_memberships_before_user_membership_billing_details', $user_membership);
        ?>

			<?php 
        if ($order) {
            ?>
				<table>
					<tr>
						<td><?php 
            esc_html_e('Purchased in:', WC_Memberships::TEXT_DOMAIN);
            ?>
</td>
						<td><a href="<?php 
            echo esc_url(get_edit_post_link($order->id));
            ?>
"><?php 
            printf(esc_html__('Order %s', WC_Memberships::TEXT_DOMAIN), $order->get_order_number());
            ?>
</a></td>
					</tr>
					<tr>
						<td><?php 
            esc_html_e('Order Date:', WC_Memberships::TEXT_DOMAIN);
            ?>
</td>
						<td><?php 
            echo date_i18n(get_option('date_format'), strtotime($order->order_date));
            ?>
</td>
					</tr>
					<tr>
						<td><?php 
            esc_html_e('Order Total:', WC_Memberships::TEXT_DOMAIN);
            ?>
</td>
						<td><?php 
            echo $order->get_formatted_order_total();
            ?>
</td>
					</tr>
				</table>
			<?php 
        } else {
            ?>
				<p><?php 
            esc_html_e('No billing details - this membership was created manually.', WC_Memberships::TEXT_DOMAIN);
            ?>
</p>
			<?php 
        }
        ?>

			<?php 
        /**
         * Fires after the billing details in edit user membership screen
         *
         * @since 1.0.0
         * @param WC_Memberships_User_Membership
         */
        do_action('wc_memberships_after_user_membership_billing_details', $user_membership);
        ?>

		</div>

		<div class="clear"></div>

		<ul class="user_membership_actions submitbox">

			<?php 
        /**
         * Fires at the start of the user membership actions meta box
         *
         * @since 1.0.0
         * @param int $post_id The post id of the wc_user_membership post
         */
        do_action('wc_memberships_user_membership_actions_start', $post->ID);
        ?>

			<li class="wide">
				<div id="delete-action">
					<?php 
        if (current_user_can("delete_post", $post->ID)) {
            ?>
<a class="submitdelete deletion" href="<?php 
            echo esc_url(get_delete_post_link($post->ID, '', true));
            ?>
"><?php 
            esc_html_e('Delete User Membership', WC_Memberships::TEXT_DOMAIN);
            ?>
</a><?php 
        }
        ?>
				</div>

				<input type="submit" class="button save_user_membership save_action button-primary tips" value="<?php 
        esc_attr_e('Save Membership', WC_Memberships::TEXT_DOMAIN);
        ?>
" data-tip="<?php 
        esc_attr_e('Save/update the membership', WC_Memberships::TEXT_DOMAIN);
        ?>
" />
			</li>

			<?php 
        /**
         * Fires at the end of the user membership actions meta box
         *
         * @since 1.0.0
         * @param int $post_id The post id of the wc_user_membership post
         */
        do_action('wc_memberships_user_membership_actions_end', $post->ID);
        ?>

		</ul>

		<?php 
        // Render JS to have the admin confirm they really do indeed want to permanently
        // delete a member
        wc_enqueue_js("\n\t\t\tjQuery( '.user_membership_actions .submitdelete' ).click( function( e ) {\n\t\t\t\treturn confirm( '" . esc_html__('Are you sure you want to permanently delete this membership?', WC_Memberships::TEXT_DOMAIN) . "' );\n\t\t\t} );\n\t\t");
    }