<?php
/**
 * The Forminator_QForm_Result class.
 *
 * @package Forminator
 */

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

/**
 * Front render class for custom forms
 */
class Forminator_QForm_Result extends Forminator_Result {

	/**
	 * Post type
	 *
	 * @var string
	 */
	protected $post_type = 'quizzes';

	/**
	 * Get og description
	 *
	 * @param Forminator_Form_Entry_Model $entry Form entry model.
	 *
	 * @return string
	 */
	public function get_og_description( $entry ) {
		$description = '';
		$quiz        = Forminator_Base_Form_Model::get_model( $entry->form_id );
		if ( $quiz instanceof Forminator_Quiz_Model ) {
			if ( 'knowledge' === $quiz->quiz_type ) {
				$description = $this->get_og_description_knowledge( $quiz, $entry );
			} else {
				$description = $this->get_og_description_nowrong( $quiz, $entry );
			}
		}

		return $description;
	}

	/**
	 * Get og title
	 *
	 * @param Forminator_Form_Entry_Model $entry Form entry model.
	 *
	 * @since 1.7
	 *
	 * @return string
	 */
	public function get_og_title( $entry ) {
		$quiz     = Forminator_Base_Form_Model::get_model( $entry->form_id );
		$entry_id = $entry->entry_id;

		/**
		 * Priority
		 * 1. Quiz name
		 * 2. Post/Page Title
		 * 3. Website name
		 */
		$title = isset( $quiz->settings['quiz_name'] ) ? $quiz->settings['quiz_name'] : '';
		if ( empty( $title ) ) {
			$title = single_post_title( '', false );
		}

		if ( empty( $title ) ) {
			$title = get_bloginfo( 'name' );
		}

		/**
		 * Filter Meta og:title for Quiz Result Page
		 *
		 * @since 1.7
		 *
		 * @param string                     $title
		 * @param Forminator_Quiz_Model $quiz
		 * @param int                        $entry_id
		 *
		 * @return string
		 */
		$title = apply_filters( 'forminator_quiz_result_page_meta_title', $title, $quiz, $entry_id );

		return $title;
	}

	/**
	 * Get og URL
	 *
	 * @since 1.7
	 *
	 * @return string
	 */
	public function get_og_url() {
		global $wp;

		$post_data  = $this->post_data;
		$query_args = array();
		$query      = wp_parse_url( $post_data );
		$permalink  = get_option( 'permalink_structure' );

		if ( empty( $permalink ) && isset( $query['query'] ) ) {
			$query_args = $query['query'];
		}

		$url = home_url( add_query_arg( $query_args, $wp->request ) );

		$url = trailingslashit( $url );

		/**
		 * Filter Meta og:url for Quiz Result Page
		 *
		 * @since 1.7
		 *
		 * @param string                      $url
		 * @param array                       $post_data
		 * @param Forminator_Form_Entry_Model $entry
		 *
		 * @return string
		 */
		$title = apply_filters( 'forminator_quiz_result_page_meta_url', $url, $post_data );

		return $title;
	}

	/**
	 * Get og image
	 *
	 * @param Forminator_Form_Entry_Model $entry Form entry model.
	 *
	 * @since 1.7
	 *
	 * @return string
	 */
	public function get_og_image( $entry ) {
		$quiz     = Forminator_Base_Form_Model::get_model( $entry->form_id );
		$entry_id = $entry->entry_id;

		/**
		 * Priority
		 * 1. Quiz Featured image
		 * 2. Post/page Featured image
		 * 3. Blog header image
		 */
		$image = isset( $quiz->settings['quiz_feat_image'] ) ? $quiz->settings['quiz_feat_image'] : '';
		if ( empty( $image ) ) {
			$image = get_the_post_thumbnail_url( get_the_ID(), 'full' );
		}

		if ( empty( $image ) ) {
			$image = get_header_image();
		}

		/**
		 * Filter Meta og:image for Quiz Result Page
		 *
		 * @since 1.7
		 *
		 * @param string                     $image
		 * @param Forminator_Quiz_Model $quiz
		 * @param int                        $entry_id
		 *
		 * @return string
		 */
		$image = apply_filters( 'forminator_quiz_result_page_meta_image', $image, $quiz, $entry_id );

		return $image;
	}

	/**
	 * Get og description
	 *
	 * @param Forminator_Quiz_Model       $quiz Quiz model.
	 * @param Forminator_Form_Entry_Model $entry Form entry model.
	 *
	 * @return string
	 */
	private function get_og_description_knowledge( $quiz, $entry ) {
		$total       = 0;
		$right       = 0;
		$description = '';
		$data        = $entry;
		$entry_id    = $entry->entry_id;
		$quiz_title  = '';

		if ( isset( $quiz->settings['quiz_name'] ) ) {
			$quiz_title = esc_html( $quiz->settings['quiz_name'] );
		}

		if ( isset( $data->meta_data['entry'] ) ) {
			$answers = $data->meta_data['entry']['value'];
			if ( is_array( $answers ) ) {
				$total = count( $answers );
				foreach ( $answers as $key => $answer ) {
					if ( true === $answer['isCorrect'] ) {
						++$right;
					}
				}
			}
		}
		if ( $total > 0 ) {
			$result = esc_html( $right ) . '/' . esc_html( $total );

			$description = forminator_get_social_message( $quiz, $quiz_title, $result );
		}

		/**
		 * Filter Meta og:description for Knowledge Quiz Result Page
		 *
		 * @since 1.5.2
		 *
		 * @param string                     $description
		 * @param Forminator_Quiz_Model $quiz
		 * @param int                        $entry_id
		 * @param int                        $right      right answer.
		 * @param int                        $total      total answer.
		 * @param string                     $quiz_title Quiz name.
		 */
		$description = apply_filters( 'forminator_quiz_knowledge_result_page_meta_description', $description, $quiz, $entry_id, $right, $total, $quiz_title );

		return $description;
	}

	/**
	 * Get og description
	 *
	 * @param Forminator_Quiz_Model       $quiz Quiz model.
	 * @param Forminator_Form_Entry_Model $entry Form entry model.
	 *
	 * @return string
	 */
	private function get_og_description_nowrong( $quiz, $entry ) {
		$result_slug  = null;
		$result       = null;
		$description  = '';
		$quiz_title   = '';
		$result_title = '';
		$entry_id     = $entry->entry_id;
		if ( isset( $quiz->settings['quiz_name'] ) ) {
			$quiz_title = esc_html( $quiz->settings['quiz_name'] );
		}

		if ( isset( $entry->meta_data['entry'] ) ) {
			$entry_value = $entry->meta_data['entry']['value'];
			if ( is_array( $entry_value ) && isset( $entry_value[0] ) ) {
				$entry_value = $entry_value[0];

				// its disgusting because of the way we saved it.
				if ( isset( $entry_value['value'] ) ) {
					$result_value = $entry_value['value'];

					if ( isset( $result_value['result'] ) && isset( $result_value['result']['slug'] ) && ! empty( $result_value['result']['slug'] ) ) {
						$result_slug = $result_value['result']['slug'];
					}
				}
			}
		}

		if ( ! is_null( $result_slug ) ) {
			$result = $quiz->getResult( $result_slug );
		}

		if ( $result ) {
			if ( isset( $result['title'] ) ) {
				$result_title = esc_html( $result['title'] );
			}

			$description = forminator_get_social_message( $quiz, $quiz_title, $result_title );
		}

		/**
		 * Filter Meta og:description for no wrong Quiz Result Page
		 *
		 * @since 1.5.2
		 *
		 * @param string                     $description
		 * @param Forminator_Quiz_Model $quiz
		 * @param int                        $entry_id
		 * @param array                      $result     result detail.
		 * @param string                     $quiz_title Quiz name.
		 */
		$description = apply_filters( 'forminator_quiz_nowrong_result_page_meta_description', $description, $quiz, $entry_id, $result, $quiz_title );

		return $description;
	}

	/**
	 * Not printing any styles
	 * just filtering canonical URL
	 *
	 * @since 1.7
	 */
	public function print_styles() {
		parent::print_styles();
		$entry = new Forminator_Form_Entry_Model( $this->entry_id );
		if ( ! $this->is_public_allowed( $entry ) ) {
			return;
		}

		add_filter( 'get_canonical_url', array( $this, 'get_og_url' ) );
	}

	/**
	 * Print result header
	 *
	 * @return void
	 */
	public function print_result_header() {
		$entry_id = $this->entry_id;
		$entry    = new Forminator_Form_Entry_Model( $this->entry_id );
		if ( ! $this->is_public_allowed( $entry ) ) {
			return;
		}

		$url         = $this->get_og_url();
		$title       = $this->get_og_title( $entry );
		$description = $this->get_og_description( $entry );
		$image       = $this->get_og_image( $entry );

		// make description as title.
		// FB fix, og:description ignored if no og:image.
		if ( empty( $image ) ) {
			$title = $description;
		}

		ob_start();
		?>
		<meta property="og:url" content="<?php echo esc_attr( $url ); ?>"/>
		<meta property="og:title" content="<?php echo esc_textarea( $title ); ?>"/>
		<meta property="og:description" content="<?php echo esc_textarea( $description ); ?>"/>
		<meta property="og:type" content="article"/>
		<?php if ( ! empty( $image ) ) : ?>
			<meta property="og:image" content="<?php echo esc_attr( $image ); ?>"/>
		<?php endif; ?>
		<?php
		$header = ob_get_clean();

		/**
		 * Filter Header for Quiz Result Page
		 *
		 * @since 1.5.2
		 *
		 * @param string $header
		 * @param int    $entry_id
		 */
		$header = apply_filters( 'forminator_quiz_result_page_header', $header, $entry_id );

		echo wp_kses_post( $header );
	}

	/**
	 * Is public allowed
	 *
	 * @inheritdoc
	 * @param object $entry Entry model.
	 */
	public function is_public_allowed( $entry ) {
		if ( empty( $entry->entry_id ) ) {
			return false;
		}

		if ( $entry->entry_type !== $this->post_type ) {
			return false;
		}

		$quiz = Forminator_Base_Form_Model::get_model( $entry->form_id );

		if ( ! $quiz instanceof Forminator_Quiz_Model ) {
			return false;
		}

		if ( ! $quiz->is_entry_share_enabled() ) {
			return false;
		}

		return true;
	}
}
