<?php
/**
 * Certificate functions
 *
 * @since 2.1.0
 *
 * @package LearnDash\Certificates
 */

use StellarWP\Learndash\StellarWP\DB\DB;
use LearnDash\Core\Utilities\Cast;
use StellarWP\Learndash\StellarWP\Arrays\Arr;
use LearnDash\Core\Models\Quiz;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Gets certificate details for a quiz post.
 *
 * Return a link to the certificate and certificate threshold.
 *
 * @since 2.1.0
 *
 * @param int      $post_id      Post ID.
 * @param int|null $cert_user_id Optional. ID of the user to get certificate details for. Default null.
 *
 * @return array Returns certificate details.
 */
function learndash_certificate_details( $post_id, $cert_user_id = null ) {
	$cert_details = array();

	$cert_user_id = ! empty( $cert_user_id ) ? intval( $cert_user_id ) : get_current_user_id();

	if ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) {
		$view_user_id = get_current_user_id();
	} else {
		$view_user_id = $cert_user_id;
	}

	$certificate_link = '';
	$post             = get_post( $post_id );

	if ( ( $post instanceof WP_Post ) && ( 'sfwd-quiz' === $post->post_type ) ) {
		$meta = get_post_meta( $post_id, '_sfwd-quiz', true );
		if ( is_array( $meta ) && ! empty( $meta ) ) {
			if ( ( isset( $meta['sfwd-quiz_threshold'] ) ) && ( '' !== $meta['sfwd-quiz_threshold'] ) ) {
				$certificate_threshold = $meta['sfwd-quiz_threshold'];
			} else {
				$certificate_threshold = '0.8';
			}

			if ( ( isset( $meta['sfwd-quiz_certificate'] ) ) && ( ! empty( $meta['sfwd-quiz_certificate'] ) ) ) {
				$certificate_post = intval( $meta['sfwd-quiz_certificate'] );
				$certificate_link = get_permalink( $certificate_post );

				if ( ! empty( $certificate_link ) ) {
					$cert_query_args = array(
						'quiz' => $post->ID,
					);

					// We add the user query string key/value if the viewing user is an admin. This
					// allows the admin to view other user's certificated.
					if ( ( $cert_user_id != $view_user_id ) && ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) ) {
						$cert_query_args['user'] = $cert_user_id;
					}
					$cert_query_args['cert-nonce'] = wp_create_nonce( $post->ID . $cert_user_id . $view_user_id );

					$certificate_link = add_query_arg( $cert_query_args, $certificate_link );
				}

				/**
				 * Filters certificate details link.
				 *
				 * @param string $certificate_link Certificate Link.
				 * @param int    $certificate_post Certificate Post.
				 * @param int    $post_id         Post ID.
				 * @param int    $user_id         User ID.
				 */
				$certificate_link = apply_filters( 'learndash_certificate_details_link', $certificate_link, $certificate_post, $post->ID, $cert_user_id );

				$cert_details = array(
					'certificateLink'       => $certificate_link,
					'certificate_threshold' => $certificate_threshold,
				);
			}
		}
	}

	return $cert_details;
}

/**
 * Gets the course certificate link for the user.
 *
 * @since 2.1.0
 *
 * @param int      $course_id    Course ID.
 * @param int|null $cert_user_id Optional. ID of the user to get certificate link for. Default null.
 *
 * @return string Course certificate link.
 */
function learndash_get_course_certificate_link( $course_id, $cert_user_id = null ) {
	$cert_user_id = ! empty( $cert_user_id ) ? intval( $cert_user_id ) : get_current_user_id();

	if ( ( empty( $course_id ) ) || ( empty( $cert_user_id ) ) ) {
		return '';
	}

	$certificate_id = learndash_get_setting( $course_id, 'certificate' );
	if ( empty( $certificate_id ) ) {
		return '';
	}

	if ( ( learndash_get_post_type_slug( 'certificate' ) !== get_post_type( $certificate_id ) ) ) {
		return '';
	}

	if ( ( learndash_get_post_type_slug( 'course' ) !== get_post_type( $course_id ) ) ) {
		return '';
	}

	$course_status = learndash_course_status( $course_id, $cert_user_id, true );
	if ( 'completed' !== $course_status ) {
		return '';
	}

	if ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) {
		$view_user_id = get_current_user_id();
	} else {
		$view_user_id = $cert_user_id;
	}

	$cert_query_args = array(
		'course_id' => $course_id,
	);

	// We add the user query string key/value if the viewing user is an admin. This
	// allows the admin to view other user's certificated.
	if ( ( $cert_user_id != $view_user_id ) && ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) ) {
		$cert_query_args['user'] = $cert_user_id;
	}
	$cert_query_args['cert-nonce'] = wp_create_nonce( $course_id . $cert_user_id . $view_user_id );

	$url = add_query_arg( $cert_query_args, get_permalink( $certificate_id ) );

	/**
	 * Filters course certificate link.
	 *
	 * Used in `learndash_get_course_certificate_link` function to filter value of certificate link.
	 *
	 * @param string $url       The course certificate link.
	 * @param int    $course_id Course ID.
	 * @param int    $user_id   The user ID for which the certificate link is generated.
	 */
	return apply_filters( 'learndash_course_certificate_link', $url, $course_id, $cert_user_id );
}



/**
 * Gets the certificate link if the certificate exists and quizzes are completed.
 *
 * @since 2.1.0
 * @since 5.0.0 Add $url_only parameter to return only the URL.
 *
 * @param int      $quiz_id Quiz ID.
 * @param int|null $user_id Optional. User ID. Default null.
 * @param bool     $url_only Optional. Whether to return only the URL or the HTML output. Default false.
 *
 * @return string Certificate link HTML output or empty string.
 */
function learndash_get_certificate_link( $quiz_id, $user_id = null, $url_only = false ) {
	if ( empty( $user_id ) ) {
		$user_id = get_current_user_id();
	}

	if ( empty( $user_id ) || empty( $quiz_id ) ) {
		return '';
	}

	$c = learndash_certificate_details( $quiz_id, $user_id );

	if ( empty( $c['certificateLink'] ) ) {
		return '';
	}

	$usermeta = get_user_meta( $user_id, '_sfwd-quizzes', true );
	$usermeta = maybe_unserialize( $usermeta );

	if ( ! is_array( $usermeta ) ) {
		$usermeta = array();
	}

	foreach ( $usermeta as $quizdata ) {
		if ( ! empty( $quizdata['quiz'] ) && $quizdata['quiz'] == $quiz_id ) {
			if ( $c['certificate_threshold'] <= $quizdata['percentage'] / 100 ) {
				if ( $url_only ) {
					return $c['certificateLink'];
				}

				/**
				 * Filters label for certificate link.
				 *
				 * @param string $label Label for certificate link.
				 * @param int    $user_id         User ID.
				 * @param int    $quiz_id         Quiz ID.
				 */
				return '<a target="_blank" href="' . $c['certificateLink'] . '">' . apply_filters( 'ld_certificate_link_label', esc_html__( 'PRINT YOUR CERTIFICATE', 'learndash' ), $user_id, $quiz_id ) . '</a>';
			}
		}
	}

	return '';
}



/**
 * Disables the visual editor for the certificate post type edit screen.
 *
 * User should not be able to use the visual editor tab.
 * Fires on `wp_default_editor` hook.
 *
 * @global WP_Post $post Global post object.
 *
 * @since 2.1.0
 *
 * @param array $return An array of editors. Accepts 'tinymce', 'html', 'test'.
 *
 * @return array|string $return The type of the editor.
 */
function learndash_disable_editor_on_certificate( $return ) {
	global $post;

	if ( is_admin() && ! empty( $post->post_type ) && 'sfwd-certificates' === $post->post_type ) {
		return 'html';
	}

	return $return;
}

add_filter( 'wp_default_editor', 'learndash_disable_editor_on_certificate', 1, 1 );



/**
 * Disables the visual editor for the certificate post type edit screen with javascript.
 *
 * @global WP_Post $post Global post object.
 *
 * User should not be able to use the visual editor tab.
 * Fires on `admin_footer` hook.
 *
 * @since 2.1.0
 */
function learndash_disable_editor_on_certificate_js() {
	global $post;
	if ( is_admin() && ! empty( $post->post_type ) && 'sfwd-certificates' === $post->post_type ) {
		?>
			<style type="text/css">
			a#content-tmce, a#content-tmce:hover, #qt_content_fullscreen, #insert-media-button{
				display:none;
			}
			</style>
			<script type="text/javascript">
			jQuery( function(){
				jQuery("#content-tmce").attr("onclick", null);
			});
			</script>
		<?php
	}
}

add_filter( 'admin_footer', 'learndash_disable_editor_on_certificate_js', 99 );

/**
 * Registers certificate options metabox.
 *
 * Fires on `add_meta_boxes` hook.
 *
 * @param WP_Post $post WP_Post object.
 */
function learndash_certificates_add_meta_box( $post ) {
	add_meta_box(
		'learndash_certificate_options',
		esc_html__( 'LearnDash Certificate Options', 'learndash' ),
		'learndash_certificate_options_metabox',
		'sfwd-certificates',
		'advanced',
		'high'
	);
}
add_action( 'add_meta_boxes', 'learndash_certificates_add_meta_box' );

/**
 * Displays certificate options metabox fields.
 *
 * @param WP_Post $certificate The current certificate WP_Post object being edited.
 */
function learndash_certificate_options_metabox( $certificate ) {
	$learndash_certificate_options_selected = get_post_meta( $certificate->ID, 'learndash_certificate_options', true );

	if ( ! is_array( $learndash_certificate_options_selected ) ) {
		if ( ! empty( $learndash_certificate_options_selected ) ) {
			$learndash_certificate_options_selected = array( $learndash_certificate_options_selected );
		} else {
			$learndash_certificate_options_selected = array();
		}
	}

	if ( ! isset( $learndash_certificate_options_selected['pdf_page_format'] ) ) {
		$learndash_certificate_options_selected['pdf_page_format'] = 'LETTER';
	}

	if ( ! isset( $learndash_certificate_options_selected['pdf_page_orientation'] ) ) {
		$learndash_certificate_options_selected['pdf_page_orientation'] = 'L';
	}

	wp_nonce_field( plugin_basename( __FILE__ ), 'learndash_certificates_nonce' );

	$learndash_certificate_options['pdf_page_format'] = array(
		'LETTER' => esc_html__( 'Letter / USLetter (default)', 'learndash' ),
		'A4'     => esc_html__( 'A4', 'learndash' ),
	);

	/**
	 * Filters certificate pdf page format.
	 *
	 * @param array $pdf_formats An array of pdf format details.
	 */
	$learndash_certificate_options['pdf_page_format'] = apply_filters( 'learndash_certificate_pdf_page_formats', $learndash_certificate_options['pdf_page_format'] );

	$learndash_certificate_options['pdf_page_orientation'] = array(
		'L' => esc_html__( 'Landscape (default)', 'learndash' ),
		'P' => esc_html__( 'Portrait', 'learndash' ),
	);

	/**
	 * Filters certificate pdf page orientations.
	 *
	 * @param array $pdf_orientations An array of pdf page orientations details.
	 */
	$learndash_certificate_options['pdf_page_orientation'] = apply_filters( 'learndash_certificate_pdf_page_orientations', $learndash_certificate_options['pdf_page_orientation'] );

	if ( ( is_array( $learndash_certificate_options['pdf_page_format'] ) ) && ( ! empty( $learndash_certificate_options['pdf_page_format'] ) ) ) {
		?>
		<p><label for="learndash_certificate_options_pdf_page_format"><?php esc_html_e( 'PDF Page Size', 'learndash' ); ?></label>
			<select id="learndash_certificate_options_pdf_page_format" name="learndash_certificate_options[pdf_page_format]">
			<?php
			foreach ( $learndash_certificate_options['pdf_page_format'] as $key => $label ) {
				?>
					<option <?php selected( $key, $learndash_certificate_options_selected['pdf_page_format'] ); ?> value="<?php echo esc_attr( $key ); ?>"><?php echo esc_attr( $label ); ?></option>
											<?php
			}
			?>
			</select>
		</p>
		<?php
	}

	if ( ( is_array( $learndash_certificate_options['pdf_page_orientation'] ) ) && ( ! empty( $learndash_certificate_options['pdf_page_orientation'] ) ) ) {
		?>
		<p><label for="learndash_certificate_options_pdf_page_orientation"><?php esc_html_e( 'PDF Page Orientation', 'learndash' ); ?></label>
			<select id="learndash_certificate_options_pdf_page_orientation" name="learndash_certificate_options[pdf_page_orientation]">
			<?php
			foreach ( $learndash_certificate_options['pdf_page_orientation'] as $key => $label ) {
				?>
					<option <?php selected( $key, $learndash_certificate_options_selected['pdf_page_orientation'] ); ?> value="<?php echo esc_attr( $key ); ?>"><?php echo esc_attr( $label ); ?></option>
											<?php
			}
			?>
			</select>
		</p>
		<?php
	}
}


/**
 * Saves certificate option metabox fields.
 *
 * Fires on `save_post` hook.
 *
 * @param int $post_id Current post ID being edited.
 */
function learndash_certificates_save_meta_box( $post_id ) {
	// verify if this is an auto save routine.
	// If it is our form has not been submitted, so we don't want to do anything.
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
		return;
	}

	// verify this came from the our screen and with proper authorization,
	// because save_post can be triggered at other times.
	if ( ! isset( $_POST['learndash_certificates_nonce'] ) || ! wp_verify_nonce( $_POST['learndash_certificates_nonce'], plugin_basename( __FILE__ ) ) ) {
		return;
	}

	if ( 'sfwd-certificates' != $_POST['post_type'] ) {
		return;
	}

	// Check permissions.
	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		return;
	}

	$learndash_certificate_options = array();

	if ( ( isset( $_POST['learndash_certificate_options']['pdf_page_format'] ) ) && ( ! empty( $_POST['learndash_certificate_options']['pdf_page_format'] ) ) ) {
		$learndash_certificate_options['pdf_page_format'] = esc_attr( $_POST['learndash_certificate_options']['pdf_page_format'] );
	} else {
		$learndash_certificate_options['pdf_page_format'] = 'LETTER';
	}

	if ( ( isset( $_POST['learndash_certificate_options']['pdf_page_orientation'] ) ) && ( ! empty( $_POST['learndash_certificate_options']['pdf_page_orientation'] ) ) ) {
		$learndash_certificate_options['pdf_page_orientation'] = esc_attr( $_POST['learndash_certificate_options']['pdf_page_orientation'] );
	} else {
		$learndash_certificate_options['pdf_page_orientation'] = PDF_PAGE_ORIENTATION;
	}

	update_post_meta( $post_id, 'learndash_certificate_options', $learndash_certificate_options );
}
add_action( 'save_post', 'learndash_certificates_save_meta_box' );


/**
 * Certificate published/updated notice to replace the default notice that contains a link to a non-existent resource.
 *
 * Fires on `post_updated_messages` hook.
 *
 * @since 3.0.0
 *
 * @param array $messages An array of post updated messages.
 *
 * @return array Array of published/updated notice messages.
 */
function learndash_certificates_post_updated_messages( $messages ) {
	$post = get_post();

	if ( ! $post instanceof WP_Post ) {
		return $messages;
	}

	$post_type        = get_post_type( $post );
	$post_type_object = get_post_type_object( $post_type );

	$published_message = wp_kses_post(
		sprintf(
		// translators: quiz, course.
			_x(
				'Certificate published. <br /><br />To view the certificate, you must assign it to a %1$s or %2$s. <br />Once you complete the assigned milestone, you can generate the certificate. <br /><br />Click here to read more about this topic: <a href="https://www.learndash.com/support/docs/core/certificates/create-certificate/#previewing_certificates" target="_blank">Previewing Certificates</a>.',
				'placeholder: quiz, course',
				'learndash'
			),
			esc_html( learndash_get_custom_label_lower( 'quiz' ) ),
			esc_html( learndash_get_custom_label_lower( 'course' ) )
		)
	);

	$updated_message = wp_kses_post(
		sprintf(
		// translators: quiz, course.
			_x(
				'Certificate updated. <br /><br />To view the certificate, you must assign it to a %1$s or %2$s. <br />Once you complete the assigned milestone, you can generate the certificate. <br /><br />Click here to read more about this topic: <a href="https://www.learndash.com/support/docs/core/certificates/create-certificate/#previewing_certificates" target="_blank">Previewing Certificates</a>.',
				'placeholder: quiz, course',
				'learndash'
			),
			esc_html( learndash_get_custom_label_lower( 'quiz' ) ),
			esc_html( learndash_get_custom_label_lower( 'course' ) )
		)
	);

	$messages['sfwd-certificates'] = array(
		0  => '', // Unused. Messages start at index 1.
		1  => $updated_message,
		2  => esc_html__( 'Custom field updated.', 'learndash' ),
		3  => esc_html__( 'Custom field deleted.', 'learndash' ),
		4  => $updated_message,
		/* translators: %s: date and time of the revision */
		5  => isset( $_GET['revision'] ) ? sprintf( esc_html__( 'Certificate restored to revision from %s', 'learndash' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
		6  => $published_message,
		7  => esc_html__( 'Certificate saved.', 'learndash' ),
		8  => esc_html__( 'Certificate submitted.', 'learndash' ),
		9  => sprintf(
			// translators: placeholder: Post Date.
			esc_html_x( 'Certificate scheduled for: <strong>%s</strong>.', 'placeholder: Post Date', 'learndash' ),
			// translators: Publish box date format, see https://secure.php.net/date.
			learndash_adjust_date_time_display( (int) strtotime( $post->post_date_gmt ), __( 'M j, Y @ H:i', 'learndash' ) )
		),
		10 => esc_html__( 'Certificate draft updated.', 'learndash' ),
	);

	return $messages;
}
add_filter( 'post_updated_messages', 'learndash_certificates_post_updated_messages' );

/**
 * Get Group certificate link for user
 *
 * @since 3.2.0
 *
 * @param int $group_id     Group ID.
 * @param int $cert_user_id User ID.
 *
 * @return string
 */
function learndash_get_group_certificate_link( $group_id, $cert_user_id = null ) {
	$cert_user_id = ! empty( $cert_user_id ) ? intval( $cert_user_id ) : get_current_user_id();

	if ( ( empty( $group_id ) ) || ( empty( $cert_user_id ) ) ) {
		return '';
	}

	$certificate_id = learndash_get_setting( $group_id, 'certificate' );
	if ( empty( $certificate_id ) ) {
		return '';
	}

	if ( ( learndash_get_post_type_slug( 'certificate' ) !== get_post_type( $certificate_id ) ) ) {
		return '';
	}

	if ( ( learndash_get_post_type_slug( 'group' ) !== get_post_type( $group_id ) ) ) {
		return '';
	}

	$group_status = learndash_get_user_group_status( $group_id, $cert_user_id, true );
	if ( 'completed' !== $group_status ) {
		return '';
	}

	if ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) {
		$view_user_id = get_current_user_id();
	} else {
		$view_user_id = $cert_user_id;
	}

	$cert_query_args = array(
		'group_id' => $group_id,
	);

	// We add the user query string key/value if the viewing user is an admin. This
	// allows the admin to view other user's certificated.
	if ( ( $cert_user_id != $view_user_id ) && ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) ) {
		$cert_query_args['user'] = $cert_user_id;
	}
	$cert_query_args['cert-nonce'] = wp_create_nonce( $group_id . $cert_user_id . $view_user_id );

	$url = add_query_arg( $cert_query_args, get_permalink( $certificate_id ) );

	/**
	 * Filter Group Certificate URL.
	 *
	 * @since 3.2.0
	 *
	 * @param string $url          Group Certificate URL.
	 * @param int    $group_id     Group ID.
	 * @param int    $cert_user_id User ID.
	 */
	return apply_filters( 'learndash_group_certificate_link', $url, $group_id, $cert_user_id );
}

/**
 * Display the PDF Certificate.
 *
 * This function was moved from template_redirect_access() in
 * includes/class-ld-cpt-instance.php
 *
 * @since 3.2.3
 */
function learndash_certificate_display() {
	if ( is_singular( learndash_get_post_type_slug( 'certificate' ) ) ) {
		if ( ( isset( $_GET['cert-nonce'] ) ) && ( ! empty( $_GET['cert-nonce'] ) ) ) {
			$certificate_post = get_post( get_the_ID() );

			// The viewing user ID.
			$view_user_id = get_current_user_id();

			/**
			 * Then determined for whom the certificate if for. A
			 * Group Leader or admin user can view other users.
			 */
			if ( ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) && ( ( isset( $_GET['user'] ) ) && ( ! empty( $_GET['user'] ) ) ) ) {
				$cert_user_id = absint( $_GET['user'] );
			} else {
				$cert_user_id = get_current_user_id();
			}

			if ( ( isset( $_GET['group_id'] ) ) && ( ! empty( $_GET['group_id'] ) ) ) {
				$group_id = absint( $_GET['group_id'] );
				if ( wp_verify_nonce( esc_attr( $_GET['cert-nonce'] ), $group_id . $cert_user_id . $view_user_id ) ) {
					$group_post = get_post( $group_id );
					if ( ( $group_post ) && ( is_a( $group_post, 'WP_Post' ) ) && ( learndash_get_post_type_slug( 'group' ) === $group_post->post_type ) ) {
						$group_certificate_post_id = learndash_get_setting( $group_post->ID, 'certificate' );
						if ( absint( $group_certificate_post_id ) === absint( $certificate_post->ID ) ) {
							$group_status = learndash_get_user_group_status( $group_id, $cert_user_id, true );
							if ( 'completed' === $group_status ) {
								if ( ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) && ( intval( $cert_user_id ) !== intval( $view_user_id ) ) ) {
									wp_set_current_user( $cert_user_id );
								}

								if ( has_action( 'learndash_tcpdf_init' ) ) {
									/**
									 * Fires on tcpdf initialization.
									 *
									 * @since 3.2.0
									 *
									 * @param array $args {
									 *     @type int $cert_id      Certificate Post ID.
									 *     @type int $cert_user_id User ID.
									 *     @type int $post_id      Related Course, Quiz post ID.
									 * } Args.
									 */
									do_action(
										'learndash_tcpdf_init',
										array(
											'cert_id' => $certificate_post->ID,
											'user_id' => $cert_user_id,
											'post_id' => $group_id,
										)
									);
								} else {
									require_once __DIR__ . '/ld-convert-post-pdf.php';
									learndash_certificate_post_shortcode(
										array(
											'cert_id' => $certificate_post->ID,
											'user_id' => $cert_user_id,
											'post_id' => $group_id,
										)
									);
								}
							}
						}
					}
				}
			} elseif ( ( isset( $_GET['course_id'] ) ) && ( ! empty( $_GET['course_id'] ) ) ) {
				$course_id = absint( $_GET['course_id'] );

				if ( wp_verify_nonce( esc_attr( $_GET['cert-nonce'] ), $course_id . $cert_user_id . $view_user_id ) ) {
					$course_post = get_post( $course_id );
					if ( ( $course_post ) && ( is_a( $course_post, 'WP_Post' ) ) && ( learndash_get_post_type_slug( 'course' ) === $course_post->post_type ) ) {
						$course_certificate_post_id = learndash_get_setting( $course_post->ID, 'certificate' );
						if ( absint( $course_certificate_post_id ) === absint( $certificate_post->ID ) ) {
							$course_status = learndash_course_status( $course_id, $cert_user_id, true );
							if ( 'completed' === $course_status ) {
								if ( ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) && ( intval( $cert_user_id ) !== intval( $view_user_id ) ) ) {
									wp_set_current_user( $cert_user_id );
								}

								/** This filter is documented in includes/class-ld-cpt-instance.php */
								if ( has_action( 'learndash_tcpdf_init' ) ) {
									do_action(
										'learndash_tcpdf_init',
										array(
											'cert_id' => $certificate_post->ID,
											'user_id' => $cert_user_id,
											'post_id' => $course_id,
										)
									);
								} else {
									require_once __DIR__ . '/ld-convert-post-pdf.php';
									learndash_certificate_post_shortcode(
										array(
											'cert_id' => $certificate_post->ID,
											'user_id' => $cert_user_id,
											'post_id' => $course_id,
										)
									);
								}
								die();
							}
						}
					}
				}
			} elseif ( ( isset( $_GET['quiz'] ) ) && ( ! empty( $_GET['quiz'] ) ) ) {
				$quiz_id = intval( $_GET['quiz'] );
				if ( wp_verify_nonce( $_GET['cert-nonce'], $quiz_id . $cert_user_id . $view_user_id ) ) {
					$quiz_post = get_post( $quiz_id );
					if ( ( $quiz_post ) && ( is_a( $quiz_post, 'WP_Post' ) ) && ( learndash_get_post_type_slug( 'quiz' ) === $quiz_post->post_type ) ) {
						$quiz_certificate_post_id = learndash_get_setting( $quiz_post->ID, 'certificate' );
						if ( absint( $quiz_certificate_post_id ) === absint( $certificate_post->ID ) ) {
							$time               = isset( $_GET['time'] ) ? intval( $_GET['time'] ) : -1;
							$quizinfo           = get_user_meta( $cert_user_id, '_sfwd-quizzes', true );
							$selected_quizinfo  = null;
							$selected_quizinfo2 = null;

							if ( ! empty( $quizinfo ) ) {
								foreach ( $quizinfo as $quiz_i ) {
									if ( ( ( isset( $quiz_i['time'] ) ) && intval( $quiz_i['time'] ) == intval( $time ) ) && ( intval( $quiz_i['quiz'] ) === intval( $quiz_id ) ) ) {
										$selected_quizinfo = $quiz_i;
										break;
									}

									if ( intval( $quiz_i['quiz'] ) === intval( $quiz_id ) ) {
										$selected_quizinfo2 = $quiz_i;
									}
								}
							}

							$selected_quizinfo = empty( $selected_quizinfo ) ? $selected_quizinfo2 : $selected_quizinfo;
							if ( ! empty( $selected_quizinfo ) ) {
								$certificate_threshold = learndash_get_setting( $selected_quizinfo['quiz'], 'threshold' );

								if ( ( isset( $selected_quizinfo['percentage'] ) && $selected_quizinfo['percentage'] >= $certificate_threshold * 100 ) || ( isset( $selected_quizinfo['count'] ) && $selected_quizinfo['score'] / $selected_quizinfo['count'] >= $certificate_threshold ) ) {
									if ( ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) && ( $cert_user_id !== $view_user_id ) ) {
										wp_set_current_user( $cert_user_id );
									}

									if ( has_action( 'learndash_tcpdf_init' ) ) {
										/** This filter is documented in includes/class-ld-cpt-instance.php */
										do_action(
											'learndash_tcpdf_init',
											array(
												'cert_id' => $certificate_post->ID,
												'user_id' => $cert_user_id,
												'post_id' => $selected_quizinfo['quiz'],
											)
										);
									} else {
										/**
										 * Include library to generate PDF
										 */
										require_once __DIR__ . '/ld-convert-post-pdf.php';
										learndash_certificate_post_shortcode(
											array(
												'cert_id' => $certificate_post->ID,
												'user_id' => $cert_user_id,
												'post_id' => $selected_quizinfo['quiz'],
											)
										);
									}
									die();
								}
							}
						}
					}
				}
			}
		}

		/**
		 * Action to allow custom handling of when a user cannot view a certificate.
		 *
		 * @since 3.2.3
		 */
		do_action( 'learndash_certificate_disallowed' );

		// If here we display the error and exit.
		esc_html_e( 'Access to certificate page is disallowed.', 'learndash' );
		die();
	}
}
add_action( 'template_redirect', 'learndash_certificate_display', 5 );

/**
 * Get where the Certificate post is used. Course/Quiz/Group.
 *
 * @since 3.4.1
 *
 * @param integer $post_id   Certificate Post ID.
 * @param string  $post_type Single post type slug to check.
 *
 * @return array Array of post IDs.
 */
function learndash_certificate_get_used_by( $post_id = 0, $post_type = '' ) {
	$post_ids = array();

	$post_id   = absint( $post_id );
	$post_type = esc_attr( $post_type );

	if ( ( ! empty( $post_id ) ) && ( ! empty( $post_type ) ) ) {
		$transient_key      = 'learndash_cert_used_' . $post_id . '_' . $post_type;
		$post_ids_transient = LDLMS_Transients::get( $transient_key );

		if ( false === $post_ids_transient ) {
			$query_args = array(
				'post_type'    => $post_type,
				'fields'       => 'ids',
				'nopaging'     => true,
				'meta_key'     => '_ld_certificate',
				'meta_value'   => $post_id,
				'meta_compare' => '=',
			);

			$query = new WP_Query( $query_args );
			if ( property_exists( $query, 'posts' ) ) {
				$post_ids = array_map( 'absint', $query->posts );
			}

			LDLMS_Transients::set( $transient_key, $post_ids, MINUTE_IN_SECONDS );
		} else {
			$post_ids = $post_ids_transient;
		}
	}

	return $post_ids;
}

/**
 * Gets the certificate count for a user.
 *
 * @since 3.0.0
 *
 * @param WP_User|int|null $user `WP_User` object or user ID. Defaults to current logged in user.
 *
 * @return int|false Returns users certificate count.
 */
function learndash_get_certificate_count( $user = null ) {
	if ( null === $user ) {
		$user = wp_get_current_user();
	}

	if ( is_int( $user ) ) {
		$user = get_user_by( 'id', $user );
	}

	if ( ! $user ) {
		return false;
	}

	$certificates = 0;

	$course_ids = learndash_user_get_enrolled_courses( $user->ID, [], true );

	if ( ! empty( $course_ids ) ) {
		// Filter out the courses that don't have a certificate.
		$course_ids = DB::get_col(
			DB::table( 'postmeta' )
				->select( 'post_id' )
				->whereIn( 'post_id', $course_ids )
				->where( 'meta_key', '_ld_certificate' )
				->where( 'meta_value', '0', '>' )
				->getSQL()
		);

		foreach ( $course_ids as $course_id ) {
			$link = learndash_get_course_certificate_link(
				Cast::to_int( $course_id ),
				$user->ID
			);

			if ( ! empty( $link ) ) {
				++$certificates;
			}
		}
	}

	$quizzes = get_user_meta( $user->ID, '_sfwd-quizzes', true );

	if (
		is_array( $quizzes )
		&& ! empty( $quizzes )
	) {
		// Get unique quiz IDs from user's quiz attempts.
		$quiz_ids = array_unique(
			array_map(
				function ( $quiz_attempt ) {
					return isset( $quiz_attempt['quiz'] ) ? (int) $quiz_attempt['quiz'] : 0;
				},
				$quizzes
			)
		);

		// Filter out invalid quiz IDs.
		$quiz_ids = array_filter( $quiz_ids );

		foreach ( $quiz_ids as $quiz_id ) {
			// Check if this quiz has a certificate and if the user passed it.
			$certificate_link = learndash_get_certificate_link( $quiz_id, $user->ID, true );

			if ( ! empty( $certificate_link ) ) {
				++$certificates;
			}
		}
	}

	return $certificates;
}


