/**
 * Check if user has completed an achievement
 *
 * @since  1.0.0
 * @param  integer $achievement_id The given achievement ID to verify
 * @param  integer $user_id        The given user's ID
 * @param  string  $this_trigger   The trigger
 * @param  integer $site_id        The triggered site id
 * @param  array   $args           The triggered args
 * @return bool                    True if user has completed achievement, false otherwise
 */
function badgeos_check_achievement_completion_for_user($achievement_id = 0, $user_id = 0, $this_trigger = '', $site_id = 0, $args = array())
{
    // Assume the user has completed the achievement
    $return = true;
    // Set to current site id
    if (!$site_id) {
        $site_id = get_current_blog_id();
    }
    // If the user has not already earned the achievement...
    if (!badgeos_get_user_achievements(array('user_id' => absint($user_id), 'achievement_id' => absint($achievement_id), 'since' => 1 + badgeos_achievement_last_user_activity($achievement_id, $user_id)))) {
        // Grab our required achievements for this achievement
        $required_achievements = badgeos_get_required_achievements_for_achievement($achievement_id);
        // If we have requirements, loop through each and make sure they've been completed
        if (is_array($required_achievements) && !empty($required_achievements)) {
            foreach ($required_achievements as $requirement) {
                // Has the user already earned the requirement?
                if (!badgeos_get_user_achievements(array('user_id' => $user_id, 'achievement_id' => $requirement->ID, 'since' => badgeos_achievement_last_user_activity($achievement_id, $user_id)))) {
                    $return = false;
                    break;
                }
            }
        }
    }
    // Available filter to support custom earning rules
    return apply_filters('user_deserves_achievement', $return, $user_id, $achievement_id, $this_trigger, $site_id, $args);
}
/**
 * Render an achievement
 *
 * @since  1.0.0
 * @param  integer $achievement The achievement's post ID
 * @return string               Concatenated markup
 */
function badgeos_render_achievement($achievement = 0)
{
    global $user_ID;
    // If we were given an ID, get the post
    if (is_numeric($achievement)) {
        $achievement = get_post($achievement);
    }
    // make sure our JS and CSS is enqueued
    wp_enqueue_script('badgeos-achievements');
    wp_enqueue_style('badgeos-widget');
    // check if user has earned this Achievement, and add an 'earned' class
    $earned_status = badgeos_get_user_achievements(array('user_id' => $user_ID, 'achievement_id' => absint($achievement->ID))) ? 'user-has-earned' : 'user-has-not-earned';
    // Setup our credly classes
    $credly_class = '';
    $credly_ID = '';
    // If the achievement is earned and givable, override our credly classes
    if ('user-has-earned' == $earned_status && ($giveable = credly_is_achievement_giveable($achievement->ID, $user_ID))) {
        $credly_class = ' share-credly addCredly';
        $credly_ID = 'data-credlyid="' . absint($achievement->ID) . '"';
    }
    // Each Achievement
    $output = '';
    $output .= '<div id="badgeos-achievements-list-item-' . $achievement->ID . '" class="badgeos-achievements-list-item ' . $earned_status . $credly_class . '"' . $credly_ID . '>';
    // Achievement Image
    $output .= '<div class="badgeos-item-image">';
    $output .= '<a href="' . get_permalink($achievement->ID) . '">' . badgeos_get_achievement_post_thumbnail($achievement->ID) . '</a>';
    $output .= '</div><!-- .badgeos-item-image -->';
    // Achievement Content
    $output .= '<div class="badgeos-item-description">';
    // Achievement Title
    $output .= '<h2 class="badgeos-item-title"><a href="' . get_permalink($achievement->ID) . '">' . get_the_title($achievement->ID) . '</a></h2>';
    // Achievement Short Description
    $output .= '<div class="badgeos-item-excerpt">';
    $output .= badgeos_achievement_points_markup($achievement->ID);
    $excerpt = !empty($achievement->post_excerpt) ? $achievement->post_excerpt : $achievement->post_content;
    $output .= wpautop(apply_filters('get_the_excerpt', $excerpt));
    $output .= '</div><!-- .badgeos-item-excerpt -->';
    // Render our Steps
    if ($steps = badgeos_get_required_achievements_for_achievement($achievement->ID)) {
        $output .= '<div class="badgeos-item-attached">';
        $output .= '<div id="show-more-' . $achievement->ID . '" class="badgeos-open-close-switch"><a class="show-hide-open" data-badgeid="' . $achievement->ID . '" data-action="open" href="#">' . __('Show Details', 'badgeos') . '</a></div>';
        $output .= '<div id="badgeos_toggle_more_window_' . $achievement->ID . '" class="badgeos-extras-window">' . badgeos_get_required_achievements_for_achievement_list_markup($steps, $achievement->ID) . '</div><!-- .badgeos-extras-window -->';
        $output .= '</div><!-- .badgeos-item-attached -->';
    }
    $output .= '</div><!-- .badgeos-item-description -->';
    $output .= '</div><!-- .badgeos-achievements-list-item -->';
    // Return our filterable markup
    return apply_filters('badgeos_render_achievement', $output, $achievement->ID);
}