<?php

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

/**
 * Email Response Notifications main class.
 *
 * @since 1.0.0
 */
class UserFeedback_Email_Response_Notification {

	/**
	 * Email template to use for this class.
	 *
	 * @since 1.0.0
	 *
	 * @var string
	 */
	private $email_template = 'response-notification';

	/**
	 * Test email template
	 *
	 * @since 1.0.0
	 *
	 * @var string
	 */
	private $test_email_template = 'response-notification';

	/**
	 * Email options
	 *
	 * @since 1.0.0
	 *
	 * @var string
	 */
	private $email_options = array();

	/**
	 * The survey this notification is for
	 *
	 * @since 1.0.0
	 *
	 * @var object
	 */
	private $survey;

	/**
	 * The response this notification is for
	 *
	 * @since 1.0.0
	 *
	 * @var object
	 */
	private $response;

	/**
	 * Notification logic config
	 *
	 * @since 1.0.0
	 *
	 * @var
	 */
	private $config;

	/**
	 * Constructor.
	 *
	 * @since 1.0.0
	 */
	public function __construct( $survey, $response ) {

		$this->survey   = $survey;
		$this->response = $response;
		$this->config   = $survey->notifications->email;
	}

	private function set_options() {
		$options                    = array();
		$options['email_addresses'] = $this->config->addresses;
		$options['html_template']   = userfeedback_get_option( 'summaries_html_template' );
		$options['header_image']    = userfeedback_get_option( 'notifications_header_image' );

		$this->email_options = $options;
	}

	/**
	 * Send email
	 *
	 * @return void
	 */
	private function send() {
		$email            = array();
		$email['subject'] = $this->get_email_subject();
		$email['address'] = $this->get_email_addresses();
		$email['address'] = array_map( 'sanitize_email', $email['address'] );

		// Create new email.
		$emails = new Userfeedback_WP_Emails( $this->email_template );
		$emails->set_initial_args( $this->get_template_args() );

		// check if html template option is enabled
		if ( ! $this->is_enabled_html_template() ) {
			$emails->__set( 'html', false );
		}

		// Go.
		foreach ( $email['address'] as $address ) {
			if ( ! $emails->send( trim( $address ), $email['subject'] ) ) {
				wp_send_json_error();
			}
		}
	}

	/**
	 * Check if email should be sent
	 *
	 * @return void
	 */
	public function maybe_send() {
		// if ( !$this->config->active || empty( $this->config->addresses ) ) {
		// If notifications aren't active, or no emails are set, bail...
		// return;
		// }

		$logic = $this->config->logic;

		if ( $logic->enable && sizeof( $logic->conditions ) > 0 ) {
			$send = true;

			foreach ( $logic->conditions as $condition ) {
				$question_id = $condition->question_id;

				$answer = $this->get_question_answer( $question_id );

				if ( empty( $answer ) ) {
					break;
				}

				$symbol          = $condition->compare;
				$submitted_value = $answer->value;
				$compare_to      = $condition->value;

				$send = $send && userfeedback_check_logic( $symbol, $submitted_value, $compare_to );
			}

			if ( ! $send ) {
				return;
			}
		}

		$this->set_options();
		$this->send();
	}

	/**
	 * Get the email header image.
	 *
	 * @since 1.0.0
	 *
	 * @return string The email from address.
	 */
	public function get_header_image() {
		// set default header image
		$img = array(
			'url' => plugins_url( 'assets/img/emails/userfeedback-logo.png', USERFEEDBACK_PLUGIN_FILE ),
			'2x'  => '', // plugins_url( "assets/img/emails/logo-MonsterInsights@2x.png", USERFEEDBACK_PLUGIN_FILE ),
		);

		if ( userfeedback_is_pro_version() && userfeedback_is_licensed() && ! empty( $this->email_options['header_image'] ) ) {
			$img['url'] = $this->email_options['header_image'];
			$img['2x']  = '';
		}

		return apply_filters( 'userfeedback_email_header_image', $img );
	}

	/**
	 * Get email subject
	 *
	 * @since 1.0.0
	 */
	public function get_email_subject() {

		$site_url        = get_site_url();
		$site_url_parsed = wp_parse_url( $site_url );

		// Translators: The domain of the site is appended to the subject.
		$subject = sprintf( __( 'New UserFeedback Response - %s', 'userfeedback-lite' ), $this->survey->title );

		return apply_filters( 'userfeedback_emails_new_response_subject', $subject, $this->survey, $this->response );
	}

	/**
	 * Get email addresses to send
	 *
	 * @since 1.0.0
	 */
	public function get_email_addresses() {
		$emails          = array();
		$email_addresses = $this->config->active ? explode( ',', $this->config->addresses ) : array();

		if ( ! empty( $email_addresses ) ) {
			foreach ( $email_addresses as $email_address ) {
				if ( ! empty( $email_address ) && is_email( $email_address ) ) {
					$emails[] = $email_address;
				}
			}
		}

		return apply_filters( 'userfeedback_email_notification_addresses', $emails, $this->survey, $this->response );
	}

	/**
	 * Check if html template option is turned on
	 *
	 * @since 1.0.0
	 *
	 * @return bool
	 */
	public function is_enabled_html_template() {
		$value = true;
		if ( false === $this->email_options['html_template'] ) {
			$value = false;
		}
		return apply_filters( 'userfeedback_email_html_template', $value, $this );
	}

	/**
	 * Get email summaries template arguments
	 *
	 * @since 1.0.0
	 */
	private function get_template_args() {

		$args['preview_title'] = $this->get_email_subject();
		$args['header_image']  = $this->get_header_image();
		$args['survey_id']     = $this->survey->id;
		$args['survey_title']  = $this->survey->title;
		$args['title']         = sprintf(
			// translators: %s is the survey title.
			__( 'New Response to <b>%s</b>', 'userfeedback-lite' ),
			esc_html( $this->survey->title )
		);

		$survey_id               = $this->survey->id;
		$notification_config_url = userfeedback_get_screen_url( 'userfeedback_surveys', "edit/$survey_id/notifications" );

		$args['description'] =
			sprintf(
				// translators: %1$s is the site name, %2$s is the URL to notification settings.
				__( 'You are receiving this UserFeedback survey notification from <b>%1$s</b>. <a href="%2$s">Adjust your settings here</a>.', 'userfeedback-lite' ),
				esc_html( get_bloginfo( 'name' ) ),
				esc_url( $notification_config_url )
			);

		$args['answers']          = $this->get_answers();
		$args['settings_tab_url'] = $notification_config_url;

		return apply_filters( 'userfeedback_email_notification_template_args', $args );
	}

	/**
	 * Get response answers
	 *
	 * @return array|array[]
	 */
	private function get_answers() {
		$questions = $this->survey->questions;

		$answers = array_map(
			function( $question ) {
				return array(
					'question_id'    => $question->id,
					'question_title' => $question->title,
					'type'           => $question->type,
					'value'          => $this->get_question_answer_html( $question ),
				);
			},
			$questions
		);

		return $answers;
	}

	private function get_question_answer( $question_id ) {
		$answers = $this->response->answers;

		// Find answer...
		foreach ( $answers as $answer ) {
			if ( $answer->question_id === $question_id ) {
				return $answer;
			}
		}

		return null;
	}

	/**
	 * Get processed question answer
	 *
	 * @param $question
	 * @return string
	 */
	private function get_question_answer_html( $question ) {
		$answers = $this->response->answers;

		$found_answer = $this->get_question_answer( $question->id );

		$skipped_content = sprintf(
			// translators: %1$s is an opening HTML tag, %2$s is a closing HTML tag.
			__( '%1$sSkipped%2$s', 'userfeedback-lite' ),
			'<small><i>',
			'</i></small>'
		);

		if ( empty( $found_answer ) ) {
			return $skipped_content;
		}

		$raw_value = $found_answer->value;

		// If answer is null, the question was skipped...
		if ( empty( $raw_value ) ) {
			return $skipped_content;
		};
		$value = $raw_value;

		if ( $question->type === 'email' ) {
			$value = sprintf(
				'<a href="mailto:%1$s">%1$s</a>',
				$raw_value
			);
		} elseif ( $question->type === 'nps' ) {
			$value = $value . '<small>/10</small>';
		} elseif ( $question->type === 'checkbox' ) {
			$value = implode( ', ', $value );
		} elseif ( $question->type === 'star-rating' ) {
			// translators: %s is the number of stars.
			$value = sprintf( __( '%s stars', 'userfeedback-lite' ), $value );
		}

		if ( ! empty( $found_answer->extra ) ) {

			foreach ( $found_answer->extra as $attr => $extra_value ) {
				$value .= sprintf(
					'<br/><p>- %s: <i>%s</i></p>',
					$attr,
					$extra_value
				);
			}
		}

		return $value;
	}
}

// Hook onto response action
function userfeedback_send_response_email_notification( $survey_id, $response_id ) {
	$survey   = UserFeedback_Survey::find( $survey_id );
	$response = UserFeedback_Response::find( $response_id );

	$notification_email = new UserFeedback_Email_Response_Notification( $survey, $response );
	$notification_email->maybe_send();
}
add_action( 'userfeedback_survey_response', 'userfeedback_send_response_email_notification', 10, 2 );
