<?php
/**
 * LearnDash `[quizinfo]` shortcode processing.
 *
 * @since 2.1.0
 *
 * @package LearnDash\Shortcodes
 */

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

use LearnDash\Core\Utilities\Cast;

/**
 * Builds the `[quizinfo]` shortcode output.
 *
 * Shortcode that displays the requested quiz information.
 *
 * @global boolean $learndash_shortcode_used
 *
 * @since 2.1.0
 *
 * @param array  $attr {
 *    An array of shortcode attributes.
 *
 *    @type string     $show     The quiz info field to display. Default empty.
 *    @type int|string $user_id  User ID. Default empty.
 *    @type int|string $quiz     Quiz ID. Default empty.
 *    @type int|string $time     Timestamp. Default empty.
 *    @type string     $field_id ID of the field. Default empty.
 *    @type string     $format   Date display format. Default 'F j, Y, g:i a'.
 * }
 * @param string $content The shortcode content. Default empty.
 * @param string $shortcode_slug The shortcode slug. Default 'quizinfo'.
 *
 * @return string The `ld_quiz_complete` shortcode output.
 */
function learndash_quizinfo( $attr = array(), $content = '', $shortcode_slug = 'quizinfo' ) {
	global $learndash_shortcode_used;
	$learndash_shortcode_used = true;

	$shortcode_atts = shortcode_atts(
		array(
			/** [score], [count], [pass], [rank], [timestamp], [pro_quizid], [points], [total_points], [percentage], [timespent]. */
			'show'     => 'quiz_title',
			'user_id'  => '',
			'quiz'     => '',
			'time'     => '',
			'field_id' => '',
			'format'   => 'F j, Y, g:i a',
		),
		$attr
	);

	/** This filter is documented in includes/shortcodes/ld_course_resume.php */
	$shortcode_atts = apply_filters( 'learndash_shortcode_atts', $shortcode_atts, $shortcode_slug );

	$time_range_start = 0;
	$time_range_end   = 0;

	if ( ( isset( $shortcode_atts['time'] ) ) && ( '' !== $shortcode_atts['time'] ) ) {
		$shortcode_atts['time'] = absint( $shortcode_atts['time'] );
	}

	extract( $shortcode_atts ); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract

	$time      = ( empty( $time ) && isset( $_REQUEST['time'] ) ) ? absint( $_REQUEST['time'] ) : $time; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$show      = ( empty( $show ) && isset( $_REQUEST['show'] ) ) ? esc_attr( $_REQUEST['show'] ) : $show; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
	$quiz      = ( empty( $quiz ) && isset( $_REQUEST['quiz'] ) ) ? absint( $_REQUEST['quiz'] ) : $quiz; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$user_id   = ( empty( $user_id ) && isset( $_REQUEST['user_id'] ) ) ? absint( $_REQUEST['user_id'] ) : $user_id; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$course_id = ( empty( $course_id ) && isset( $_REQUEST['course_id'] ) ) ? absint( $_REQUEST['course_id'] ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$field_id  = ( empty( $field_id ) && isset( $_REQUEST['field_id'] ) ) ? absint( $_REQUEST['field_id'] ) : $field_id; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

	if ( empty( $user_id ) ) {
		$user_id = get_current_user_id();

		/**
		 * Added logic to allow admin and group_leader to view certificate from other users.
		 *
		 * @since 2.3.0
		 */
		$post_type = '';
		if ( get_query_var( 'post_type' ) ) {
			$post_type = get_query_var( 'post_type' );
		}

		if ( 'sfwd-certificates' === $post_type ) {
			if ( ( ( learndash_is_admin_user() ) || ( learndash_is_group_leader_user() ) ) && ( ( isset( $_GET['user'] ) ) && ( ! empty( $_GET['user'] ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$user_id = intval( $_GET['user'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}
		}
	}

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

	// Override the user ID if the current user can't access the passed user ID's data.
	$user_id = learndash_shortcode_protect_user( Cast::to_int( $user_id ) );

	if (
		$user_id <= 0
		|| ! learndash_shortcode_can_current_user_access_post( Cast::to_int( $course_id ) )
		|| ! learndash_shortcode_can_current_user_access_post( Cast::to_int( $quiz ) )
	) {
		return '';
	}

	$shortcode_atts['time']      = $time;
	$shortcode_atts['show']      = $show;
	$shortcode_atts['quiz']      = $quiz;
	$shortcode_atts['user_id']   = $user_id;
	$shortcode_atts['course_id'] = $course_id;
	$shortcode_atts['field_id']  = $field_id;

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

	$selected_quizinfo  = '';
	$selected_quizinfo2 = '';

	foreach ( $quizinfo as $quiz_i ) {

		if ( ( isset( $quiz_i['time'] ) ) && ( ! empty( $time ) ) && ( absint( $quiz_i['time'] ) == $time ) && ( absint( $quiz_i['quiz'] ) == absint( $quiz ) ) ) {
			$selected_quizinfo = $quiz_i;
			break;
		}

		if ( ( ! empty( $time_range_start ) ) && ! ( empty( $time_range_end ) ) ) {
			if ( ( isset( $quiz_i['time'] ) ) && ( $quiz_i['time'] >= $time_range_start ) && ( $quiz_i['time'] <= $time_range_end ) && ( $quiz_i['quiz'] == $quiz ) ) {
				$selected_quizinfo2 = $quiz_i;
				break;
			}
		}

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

	$selected_quizinfo = empty( $selected_quizinfo ) ? $selected_quizinfo2 : $selected_quizinfo;

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

	switch ( $show ) {
		case 'timestamp':
			if ( ( isset( $selected_quizinfo['time'] ) ) && ( ! empty( $selected_quizinfo['time'] ) ) ) {
				$selected_quizinfo['timestamp'] = learndash_adjust_date_time_display( $selected_quizinfo['time'], $format );
			} else {
				$selected_quizinfo['timestamp'] = '';
			}
			break;

		case 'percentage':
			if ( empty( $selected_quizinfo['percentage'] ) ) {
				$selected_quizinfo['percentage'] = empty( $selected_quizinfo['count'] ) ? 0 : $selected_quizinfo['score'] * 100 / $selected_quizinfo['count'];
			}
			break;

		case 'pass':
			if ( ( isset( $selected_quizinfo['pass'] ) ) && ( ! empty( $selected_quizinfo['pass'] ) ) ) {
				$selected_quizinfo['pass'] = esc_html__( 'Yes', 'learndash' );
			} else {
				$selected_quizinfo['pass'] = esc_html__( 'No', 'learndash' );
			}
			break;

		case 'quiz_title':
			if ( ( ! empty( $quiz ) ) && ( get_post_type( $quiz ) == learndash_get_post_type_slug( 'quiz' ) ) ) {
				$selected_quizinfo['quiz_title'] = get_the_title( $quiz );
			} else {
				$selected_quizinfo['quiz_title'] = '';
			}
			break;

		case 'course_title':
			if ( ( isset( $selected_quizinfo['course'] ) ) && ( ! empty( $selected_quizinfo['course'] ) ) ) {
				$course_id = intval( $selected_quizinfo['course'] );
			} else {
				$course_id = learndash_get_setting( $quiz, 'course' );
			}
			if ( ( ! empty( $course_id ) ) && ( get_post_type( $course_id ) == learndash_get_post_type_slug( 'course' ) ) ) {
				$selected_quizinfo['course_title'] = get_the_title( $course_id );
			} else {
				$selected_quizinfo['course_title'] = '';
			}
			break;

		case 'timespent':
			if ( ( isset( $selected_quizinfo['timespent'] ) ) && ( ! empty( $selected_quizinfo['timespent'] ) ) ) {
				$selected_quizinfo['timespent'] = learndash_seconds_to_time( $selected_quizinfo['timespent'] );
			}
			break;

		case 'field':
			if ( ! empty( $field_id ) ) {
				if ( ( isset( $selected_quizinfo['pro_quizid'] ) ) && ( ! empty( $selected_quizinfo['pro_quizid'] ) ) ) {
					$form_mapper        = new WpProQuiz_Model_FormMapper();
					$quiz_form_elements = $form_mapper->fetch( $selected_quizinfo['pro_quizid'] );
					if ( ! empty( $quiz_form_elements ) ) {
						foreach ( $quiz_form_elements as $quiz_form_element ) {
							if ( absint( $field_id ) == absint( $quiz_form_element->getFormId() ) ) {
								$selected_quizinfo[ $show ] = '';

								if ( ( isset( $selected_quizinfo['statistic_ref_id'] ) ) && ( ! empty( $selected_quizinfo['statistic_ref_id'] ) ) ) {
									$statistic_ref_mapper = new WpProQuiz_Model_StatisticRefMapper();
									$statistic_ref_data   = $statistic_ref_mapper->fetchAllByRef( $selected_quizinfo['statistic_ref_id'] );
									if ( ( $statistic_ref_data ) && ( is_a( $statistic_ref_data, 'WpProQuiz_Model_StatisticRefModel' ) ) ) {
										$form_data = $statistic_ref_data->getFormData();
										if ( isset( $form_data[ $field_id ] ) ) {
											$selected_quizinfo[ $show ] = $quiz_form_element->getValue( $form_data[ $field_id ] );
											if ( WpProQuiz_Model_Form::FORM_TYPE_DATE === $quiz_form_element->getType() ) {
												$selected_quizinfo[ $show ] = learndash_adjust_date_time_display(
													strtotime( $selected_quizinfo[ $show ] ),
													$format
												);
											}
										}
									}
								}
								break;
							}
						}
					}
				}
			}
			break;

	}

	if ( isset( $selected_quizinfo[ $show ] ) ) {
		/**
		 * Filters quizinfo shortcode output.
		 *
		 * @since 2.1.0
		 * @since 3.1.4 Added $selected_quizinfo param.
		 *
		 * @param string $shortcode_output     The output of quizinfo shortcode.
		 * @param array  $shortcode_attributes An array of shortcode attributes.
		 * @param array  $selected_quizinfo    Quiz item array used for processing.
		 */
		return apply_filters( 'learndash_quizinfo', $selected_quizinfo[ $show ], $shortcode_atts, $selected_quizinfo );
	} else {
		/** This filter is documented in includes/quiz/ld-quiz-info-shortcode.php */
		return apply_filters( 'learndash_quizinfo', '', $shortcode_atts, $selected_quizinfo );
	}
}
add_shortcode( 'quizinfo', 'learndash_quizinfo', 10, 3 );
