/**
 * AJAX Validate Discount
 *
 * Validates the supplied discount.
 *
 * @access      private
 * @since       1.0
 * @return      string
*/
function edd_ajax_validate_discount()
{
    if (isset($_POST['code']) && check_ajax_referer('edd_ajax_nonce', 'nonce')) {
        $user = isset($_POST['user']) ? $_POST['user'] : $_POST['email'];
        $return = array('msg' => '', 'code' => $_POST['code']);
        if (edd_is_discount_used($_POST['code'], $user)) {
            // Called twice if discount is not used (again by edd_is_discount_valid) but allows for beter usr msg and less execution if discount is used.
            $return['msg'] = __('This discount code has been used already', 'edd');
        } else {
            if (edd_is_discount_valid($_POST['code'], $user)) {
                $price = edd_get_cart_amount();
                $discounted_price = edd_get_discounted_amount($_POST['code'], $price);
                $return = array('msg' => 'valid', 'amount' => edd_currency_filter(edd_format_amount($discounted_price)), 'code' => $_POST['code']);
            } else {
                $return['msg'] = __('The discount you entered is invalid', 'edd');
            }
        }
        echo json_encode($return);
    }
    die;
}
/**
 * Check whether a discount code is valid (when purchasing).
 *
 * @since 1.0
 * @param string $code Discount Code
 * @param string $user User info
 * @return bool
 */
function edd_is_discount_valid($code = '', $user = '', $set_error = true)
{
    $return = false;
    $discount_id = edd_get_discount_id_by_code($code);
    $user = trim($user);
    if (edd_get_cart_contents()) {
        if ($discount_id) {
            if (edd_is_discount_active($discount_id) && edd_is_discount_started($discount_id) && !edd_is_discount_maxed_out($discount_id) && !edd_is_discount_used($code, $user, $discount_id) && edd_discount_is_min_met($discount_id) && edd_discount_product_reqs_met($discount_id)) {
                $return = true;
            }
        } elseif ($set_error) {
            edd_set_error('edd-discount-error', __('This discount is invalid.', 'edd'));
        }
    }
    return apply_filters('edd_is_discount_valid', $return, $discount_id, $code, $user);
}
/**
 * Is Discount Valid
 *
 * Check whether a discount code is valid (when purchasing).
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function edd_is_discount_valid($code = '', $email = '')
{
    $return = false;
    $discount_id = edd_get_discount_id_by_code($code);
    $email = trim($email);
    if ($discount_id !== false && $email !== "") {
        if (edd_is_discount_active($discount_id) && edd_is_discount_started($discount_id) && !edd_is_discount_maxed_out($discount_id) && !edd_is_discount_used($code, $email) && edd_discount_is_min_met($discount_id)) {
            $return = true;
        }
    }
    return apply_filters('edd_is_discount_valid', $return, $discount_id, $code, $email);
}
/**
 * Validates the supplied discount sent via AJAX.
 *
 * @since 1.0
 * @return void
 */
function edd_ajax_apply_discount()
{
    if (isset($_POST['code']) && check_ajax_referer('edd_checkout_nonce', 'nonce')) {
        $user = isset($_POST['user']) ? $_POST['user'] : $_POST['email'];
        $return = array('msg' => '', 'code' => $_POST['code']);
        if (edd_is_discount_used($_POST['code'], $user)) {
            // Called twice if discount is not used (again by edd_is_discount_valid) but allows for beter usr msg and less execution if discount is used.
            $return['msg'] = __('This discount code has been used already', 'edd');
        } else {
            if (edd_is_discount_valid($_POST['code'], $user)) {
                $discount = edd_get_discount_by_code($_POST['code']);
                $amount = edd_format_discount_rate(edd_get_discount_type($discount->ID), edd_get_discount_amount($discount->ID));
                $discounts = edd_set_cart_discount($_POST['code']);
                $total = edd_get_cart_total($discounts);
                $return = array('msg' => 'valid', 'amount' => $amount, 'total' => html_entity_decode(edd_currency_filter(edd_format_amount($total)), ENT_COMPAT, 'UTF-8'), 'code' => $_POST['code'], 'html' => edd_get_cart_discounts_html($discounts));
            } else {
                $return['msg'] = __('The discount you entered is invalid', 'edd');
            }
        }
        echo json_encode($return);
    }
    edd_die();
}
/**
 * Check whether a discount code is valid (when purchasing).
 *
 * @since 1.0
 * @param string $code Discount Code
 * @param string $user User info
 * @return bool
 */
function edd_is_discount_valid($code = '', $user = '')
{
    $return = false;
    $discount_id = edd_get_discount_id_by_code($code);
    $user = trim($user);
    if ($discount_id !== false) {
        if (edd_is_discount_active($discount_id) && edd_is_discount_started($discount_id) && !edd_is_discount_maxed_out($discount_id) && !edd_is_discount_used($code, $user, $discount_id) && edd_discount_is_min_met($discount_id) && edd_discount_product_reqs_met($discount_id)) {
            $return = true;
        }
    }
    return apply_filters('edd_is_discount_valid', $return, $discount_id, $code, $user);
}