<?php

class OsEmailHelper {

	public static function get_default_headers() {
		$headers   = [];
		$headers[] = 'Content-Type: text/html; charset=UTF-8';
		$headers[] = 'From: ' . get_bloginfo( 'name' ) . ' <' . get_bloginfo( 'admin_email' ) . '>';

		/**
	 * Default headers for sending email
		 *
	 * @since 4.7.0
	 * @hook latepoint_default_email_headers
	 *
	 * @param {array} $headers The array of headers for email
	 *
	 * @returns {array} The array of headers for email
	 */
		return apply_filters( 'latepoint_default_email_headers', $headers );
	}

	public static function get_email_layout( $insert_content = false ): string {

		require_once ABSPATH . 'wp-admin/includes/file.php';
		if ( ! WP_Filesystem() ) {
			OsDebugHelper::log( __( 'Failed to initialise WC_Filesystem API while trying to show notification templates.', 'latepoint' ) );
			return '';
		}
		global $wp_filesystem;

		$html = OsSettingsHelper::get_settings_value( 'email_layout_template', $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/layouts/default.html' ) );
		if ( $insert_content ) {
			$html = str_replace( '{{content}}', $insert_content, $html );
		}
		return $html;
	}

	/**
	 * @param array $result
	 *
	 * @return OsActivityModel
	 */
	public static function log_email( array $result ) {
		if ( empty( $result['processed_datetime'] ) ) {
			$result['processed_datetime'] = OsTimeHelper::now_datetime_in_db_format();
		}
		$data = [
			'code'        => 'email_sent',
			'description' => wp_json_encode( $result ),
		];
		if ( ! empty( $result['extra_data']['activity_data'] ) ) {
			$data = array_merge( $data, $result['extra_data']['activity_data'] );
		}
		$activity = OsActivitiesHelper::create_activity( $data );
		return $activity;
	}


	/**
	 *
	 * Sends email using WordPress wp_mail function
	 *
	 * @param string $to Email address(es) of the receiver
	 * @param string $subject Subject of the email
	 * @param string $content Contents of the email
	 * @param array $headers
	 * @return array
	 */
	public static function send_email( string $to, string $subject, string $content, array $headers = [], $activity_data = [], $attachments = [] ): array {
		$processor_code = 'wp_mail';
		$result         = [
			'status'             => LATEPOINT_STATUS_ERROR,
			'message'            => __( 'No email processor is selected.', 'latepoint' ),
			'to'                 => $to,
			'content'            => $content,
			'processor_code'     => $processor_code,
			'processor_name'     => 'WordPress Mailer',
			'processed_datetime' => '',
			'extra_data'         => [
				'activity_data' => $activity_data,
			],
			'errors'             => [],
		];

		if ( empty( $to ) ) {
			$errors[] = __( 'Email address of the recipient can not be blank', 'latepoint' );
		}
		if ( empty( $subject ) ) {
			$errors[] = __( 'Subject of the email can not be blank', 'latepoint' );
		}
		if ( empty( $content ) ) {
			$errors[] = __( 'Content of the email can not be blank', 'latepoint' );
		}

		if ( ! empty( $errors ) ) {
			$result['status']  = LATEPOINT_STATUS_ERROR;
			$result['message'] = implode( ', ', $errors );
			$result['errors']  = $errors;
			return $result;
		}

		if ( OsSettingsHelper::is_email_allowed() && OsNotificationsHelper::is_notification_type_enabled( 'email' ) ) {

			if ( OsNotificationsHelper::get_selected_processor_code_by_type( 'email' ) == $processor_code ) {
				if ( wp_mail( $to, $subject, $content, $headers, $attachments ) ) {
					$result['status']                = LATEPOINT_STATUS_SUCCESS;
					$result['message']               = __( 'Email was sent successfully', 'latepoint' );
					$result['processed_datetime']    = OsTimeHelper::now_datetime_in_db_format();
					$result['extra_data']['subject'] = $subject;
				} else {
					$result['status']  = LATEPOINT_STATUS_ERROR;
					$result['errors']  = __( 'Error sending email', 'latepoint' );
					$result['message'] = __( 'Error sending email, email address invalid or email processor not setup', 'latepoint' );
				}
			}

			/**
		 * Result of sending an email
			 *
		 * @since 4.7.0
		 * @hook latepoint_notifications_send_email
		 *
		 * @param {array} $result The array of data describing the result of operation
		 * @param {string} $to
		 * @param {string} $subject
		 * @param {string} $content
		 * @param {array} $headers
		 *
		 * @returns {array} The array of data describing the result of operation
		 */
			$result = apply_filters( 'latepoint_notifications_send_email', $result, $to, $subject, $content, $headers );

		} else {
			$result['message']  = __( 'Email notifications are disabled. Enable email processor in Settings - Notifications.', 'latepoint' );
			$result['errors'][] = __( 'Email notifications are disabled. Enable email processor in Settings - Notifications.', 'latepoint' );
		}
		OsEmailHelper::log_email( $result );
		return $result;
	}
}
