/**
 * Register all of our BadgeOS CPTs
 *
 * @since  1.0.0
 * @return void
 */
function badgeos_register_post_types()
{
    global $badgeos;
    // Register our Achivement Types CPT
    register_post_type('achievement-type', array('labels' => array('name' => __('Achievement Types', 'badgeos'), 'singular_name' => __('Achievement Type', 'badgeos'), 'add_new' => __('Add New', 'badgeos'), 'add_new_item' => __('Add New Achievement Type', 'badgeos'), 'edit_item' => __('Edit Achievement Type', 'badgeos'), 'new_item' => __('New Achievement Type', 'badgeos'), 'all_items' => __('Achievement Types', 'badgeos'), 'view_item' => __('View Achievement Type', 'badgeos'), 'search_items' => __('Search Achievement Types', 'badgeos'), 'not_found' => __('No achievement types found', 'badgeos'), 'not_found_in_trash' => __('No achievement types found in Trash', 'badgeos'), 'parent_item_colon' => '', 'menu_name' => __('Achievement Types', 'badgeos')), 'public' => false, 'publicly_queryable' => false, 'show_ui' => current_user_can(badgeos_get_manager_capability()), 'show_in_menu' => 'badgeos_badgeos', 'query_var' => false, 'rewrite' => false, 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'thumbnail', 'page-attributes')));
    // Register our Step
    register_post_type('step', array('labels' => array('name' => __('Steps', 'badgeos'), 'singular_name' => __('Step', 'badgeos'), 'add_new' => __('Add New', 'badgeos'), 'add_new_item' => __('Add New Step', 'badgeos'), 'edit_item' => __('Edit Step', 'badgeos'), 'new_item' => __('New Step', 'badgeos'), 'all_items' => __('Steps', 'badgeos'), 'view_item' => __('View Step', 'badgeos'), 'search_items' => __('Search Steps', 'badgeos'), 'not_found' => __('No steps found', 'badgeos'), 'not_found_in_trash' => __('No steps found in Trash', 'badgeos'), 'parent_item_colon' => '', 'menu_name' => __('Steps', 'badgeos')), 'public' => apply_filters('badgeos_public_steps', false), 'publicly_queryable' => apply_filters('badgeos_public_steps', false), 'show_ui' => current_user_can(badgeos_get_manager_capability()), 'show_in_menu' => apply_filters('badgeos_public_steps', false), 'query_var' => false, 'rewrite' => false, 'capability_type' => 'post', 'has_archive' => apply_filters('badgeos_public_steps', false), 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title')));
    badgeos_register_achievement_type('step', 'steps');
    // Register Submissions CPT
    register_post_type('submission', array('labels' => array('name' => __('Submissions', 'badgeos'), 'singular_name' => __('Submission', 'badgeos'), 'add_new' => __('Add New', 'badgeos'), 'add_new_item' => __('Add New Submission', 'badgeos'), 'edit_item' => __('Edit Submission', 'badgeos'), 'new_item' => __('New Submission', 'badgeos'), 'all_items' => __('Submissions', 'badgeos'), 'view_item' => __('View Submission', 'badgeos'), 'search_items' => __('Search Submissions', 'badgeos'), 'not_found' => __('No submissions found', 'badgeos'), 'not_found_in_trash' => __('No submissions found in Trash', 'badgeos'), 'parent_item_colon' => '', 'menu_name' => __('Submissions', 'badgeos')), 'public' => apply_filters('badgeos_public_submissions', false), 'publicly_queryable' => apply_filters('badgeos_public_submissions', false), 'show_ui' => badgeos_user_can_manage_submissions(), 'show_in_menu' => 'badgeos_badgeos', 'show_in_nav_menus' => apply_filters('badgeos_public_submissions', false), 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => apply_filters('badgeos_public_submissions', false), 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'editor', 'author', 'comments')));
    // Register Nominations CPT
    register_post_type('nomination', array('labels' => array('name' => __('Nominations', 'badgeos'), 'singular_name' => __('Nomination', 'badgeos'), 'add_new' => __('Add New', 'badgeos'), 'add_new_item' => __('Add New Nomination', 'badgeos'), 'edit_item' => __('Edit Nomination', 'badgeos'), 'new_item' => __('New Nomination', 'badgeos'), 'all_items' => __('Nominations', 'badgeos'), 'view_item' => __('View Nomination', 'badgeos'), 'search_items' => __('Search Nominations', 'badgeos'), 'not_found' => __('No nominations found', 'badgeos'), 'not_found_in_trash' => __('No nominations found in Trash', 'badgeos'), 'parent_item_colon' => '', 'menu_name' => __('Nominations', 'badgeos')), 'public' => apply_filters('badgeos_public_nominations', false), 'publicly_queryable' => apply_filters('badgeos_public_nominations', false), 'show_ui' => badgeos_user_can_manage_submissions(), 'show_in_menu' => 'badgeos_badgeos', 'show_in_nav_menus' => apply_filters('badgeos_public_nominations', false), 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => apply_filters('badgeos_public_nominations', false), 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'editor', 'author', 'comments')));
    // Register Log Entries CPT
    register_post_type('badgeos-log-entry', array('labels' => array('name' => __('Log Entries', 'badgeos'), 'singular_name' => __('Log Entry', 'badgeos'), 'add_new' => __('Add New', 'badgeos'), 'add_new_item' => __('Add New Log Entry', 'badgeos'), 'edit_item' => __('Edit Log Entry', 'badgeos'), 'new_item' => __('New Log Entry', 'badgeos'), 'all_items' => __('Log Entries', 'badgeos'), 'view_item' => __('View Log Entries', 'badgeos'), 'search_items' => __('Search Log Entries', 'badgeos'), 'not_found' => __('No Log Entries found', 'badgeos'), 'not_found_in_trash' => __('No Log Entries found in Trash', 'badgeos'), 'parent_item_colon' => '', 'menu_name' => __('Log Entries', 'badgeos')), 'public' => false, 'publicly_queryable' => false, 'show_ui' => current_user_can(badgeos_get_manager_capability()), 'show_in_menu' => 'badgeos_badgeos', 'show_in_nav_menus' => false, 'query_var' => true, 'rewrite' => array('slug' => 'log'), 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title', 'editor', 'author', 'comments')));
}
/**
 * Render a given submission
 *
 * @since  1.1.0
 * @param  object $submission A submission post object
 * @param  array  $args       Additional args for content options
 * @return string             Concatenated output
 */
function badgeos_render_submission($submission = null, $args = array())
{
    global $post;
    // If we weren't given a submission, use the current post
    if (empty($submission)) {
        $submission = $post;
    }
    // Get the connected achievement ID
    $achievement_id = get_post_meta($submission->ID, '_badgeos_submission_achievement_id', true);
    $status = get_post_meta($submission->ID, '_badgeos_submission_status', true);
    $submission_author = get_userdata($submission->post_author);
    $display_name = is_object($submission_author) ? $submission_author->display_name : '';
    // Concatenate our output
    $output = '<div class="badgeos-submission badgeos-feedback badgeos-feedback-' . $submission->ID . '">';
    // Submission Title
    $output .= '<h2>' . sprintf(__('Submission: "%1$s" (#%2$d)', 'badgeos'), get_the_title($achievement_id), $submission->ID) . '</h2>';
    // Submission Meta
    $output .= '<p class="badgeos-submission-meta">';
    $output .= sprintf('<strong class="label">%1$s</strong> <span class="badgeos-feedback-author">%2$s</span><br/>', __('Author:', 'badgeos'), $display_name);
    $output .= sprintf('<strong class="label">%1$s</strong> <span class="badgeos-feedback-date">%2$s</span><br/>', __('Date:', 'badgeos'), get_the_time('F j, Y h:i a', $submission));
    if ($achievement_id != $submission->ID) {
        $output .= sprintf('<strong class="label">%1$s</strong> <span class="badgeos-feedback-link">%2$s</span><br/>', __('Achievement:', 'badgeos'), '<a href="' . get_permalink($achievement_id) . '">' . get_the_title($achievement_id) . '</a>');
    }
    $output .= sprintf('<strong class="label">%1$s</strong> <span class="badgeos-feedback-status">%2$s</span><br/>', __('Status:', 'badgeos'), ucfirst($status));
    $output .= '</p>';
    // Submission Content
    $output .= '<div class="badgeos-submission-content">';
    $output .= wpautop($submission->post_content);
    $output .= '</div>';
    // Include any attachments
    if (isset($args['show_attachments']) && 'false' !== $args['show_attachments']) {
        $output .= badgeos_get_submission_attachments($submission->ID);
    }
    // Approve/Deny Buttons for admins only
    if (badgeos_user_can_manage_submissions()) {
        $output .= badgeos_render_feedback_buttons($submission->ID);
    }
    // Include comments and comment form
    if (isset($args['show_comments']) && 'false' !== $args['show_comments']) {
        $output .= badgeos_get_comments_for_submission($submission->ID);
        $output .= badgeos_get_comment_form($submission->ID);
    }
    $output .= '</div><!-- .badgeos-submission -->';
    // Return our filterable output
    return apply_filters('badgeos_render_submission', $output, $submission);
}
/**
 * Get nominations attached to a specific achievement by a specific user
 *
 * @since  1.0.0
 * @param  integer $achievement_id The achievement's post ID
 * @param  integer $user_id        The user's ID
 * @return string                  Conatenated output for submission, attachments and comments
 */
function badgeos_get_user_nominations($user_id = 0, $achievement_id = 0)
{
    global $post;
    // Setup our empty args array
    $args = array('post_type' => 'nomination', 'show_attachments' => 'false', 'show_comments' => 'false');
    // Setup our author limit
    if (!empty($user_id)) {
        // Use the provided user ID
        $args['meta_query'][] = array('key' => '_badgeos_nominating_user_id', 'value' => absint($user_id));
    } else {
        // If user doesn't have access to settings,
        // restrict posts to ones they've authored
        if (!badgeos_user_can_manage_submissions()) {
            $args['meta_query'][] = array('key' => '_badgeos_nominating_user_id', 'value' => get_current_user_id());
        }
    }
    // If we were not given an achievement ID,
    // use the current post's ID
    $args['achievement_id'] = absint($achievement_id) ? absint($achievement_id) : $post->ID;
    // Grab our submissions for the current user
    $submissions = badgeos_get_feedback($args);
    // Return filterable output
    return apply_filters('badgeos_get_user_submissions', $submissions, $achievement_id, $user_id);
}