<?php 

class OsNotificationsHelper {

	public static function get_selected_processor_code_by_type( string $type ): string {
		return OsSettingsHelper::get_settings_value( 'notifications_' . $type . '_processor', '' );
	}
	public static function get_available_notification_processors_for_type( string $type ): array {
		$notification_types = self::get_available_notification_types();
		return $notification_types[ $type ]['processors'] ?? [];
	}

	public static function is_notification_type_enabled( string $type ) {
		return ! empty( self::get_selected_processor_code_by_type( $type ) );
	}

	public static function is_notification_processor_enabled( string $type, string $processor_code ) {
		return ( self::get_selected_processor_code_by_type( $type ) == $processor_code );
	}

	public static function get_email_headers_from() {
		$from_name  = OsSettingsHelper::get_settings_value( 'notification_email_setting_from_name', get_bloginfo( 'name' ) );
		$from_email = OsSettingsHelper::get_settings_value( 'notification_email_setting_from_email', get_bloginfo( 'admin_email' ) );
		return ( ! empty( $from_email ) && ! empty( $from_name ) ) ? ( $from_name . ' <' . $from_email . '>' ) : ( get_bloginfo( 'name' ) . ' <' . get_bloginfo( 'admin_email' ) . '>' );
	}

	public static function get_available_notification_types() {
		$notification_types             = [];
		$notification_types['email']    = [
			'code'       => 'email',
			'label'      => __( 'Email', 'latepoint' ),
			'processors' => [
				[
					'label'     => __( 'Default WordPress Mailer', 'latepoint' ),
					'code'      => 'wp_mail',
					'image_url' => '',
				],
			],
		];
		$notification_types['sms']      = [
			'code'       => 'sms',
			'label'      => __( 'SMS', 'latepoint' ),
			'processors' => OsSmsHelper::get_sms_processors(),
		];
		$notification_types['whatsapp'] = [
			'code'       => 'whatsapp',
			'label'      => __( 'WhatsApp', 'latepoint' ),
			'processors' => OsWhatsappHelper::get_whatsapp_processors(),
		];
		/**
		 *
		 * Returns notification types with processors
		 *
		 * @since 4.7.0
		 * @hook latepoint_available_notification_types
		 *
		 * @param {array} notification types with processors
		 * @returns {array} list of notification types with processors
		 */
		return apply_filters( 'latepoint_available_notification_types', $notification_types );
	}

	/**
	 *
	 * Sends notification based on a type
	 *
	 * @param string $type
	 * @param array $notification_settings
	 *
	 * @return array
	 */
	public static function send( string $type, array $notification_settings = [] ): array {
		$result = [
			'status'  => LATEPOINT_STATUS_ERROR,
			'message' => __( 'Nothing to run', 'latepoint' ),
		];
		if ( ! OsNotificationsHelper::is_notification_type_enabled( $type ) ) {
			$type_label = self::get_available_notification_types()[ $type ]['label'] ?? $type;
			// translators: %s is the type of notification
			$result['message'] = sprintf( __( '%s notifications are disabled', 'latepoint' ), $type_label );
			return $result;
		}
		switch ( $type ) {
			case 'email':
				$to            = $notification_settings['to'] ?? '';
				$subject       = $notification_settings['subject'] ?? '';
				$content       = $notification_settings['content'] ?? '';
				$activity_data = $notification_settings['activity_data'] ?? [];
				$attachments   = $notification_settings['attachments'] ?? [];

				$mailer = new OsMailer();
				$result = OsEmailHelper::send_email( $to, $subject, $content, $mailer->get_headers(), $activity_data, $attachments );
				break;
			case 'sms':
				$to      = $notification_settings['to'] ?? '';
				$content = $notification_settings['content'] ?? '';
				$result  = OsSmsHelper::send_sms( $to, $content, ( $notification_settings['activity_data'] ?? [] ) );
				break;
			case 'whatsapp':
				$to     = $notification_settings['to'] ?? '';
				$result = OsWhatsappHelper::send_whatsapp( $to, $notification_settings['data'], ( $notification_settings['activity_data'] ?? [] ) );
				break;
		}

		 /**
		 * Send a notification based on type
		 *
		 * @since 4.7.0
		 * @hook latepoint_notifications_send
		 *
		 * @param {array} $result The array of data describing the send operation
		 * @param {string} $type Type of notificaiton to send
		 * @param {array} $notification_settings Settings for notification
		 *
		 * @returns {array} The array of descriptive data, possibly transformed by hooks
		 */
		 return apply_filters( 'latepoint_notifications_send', $result, $type, $notification_settings );
	}


	public static function load_templates_for_action_type( string $action_type ): array {
		$templates = [];

		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 $templates;
		}
		global $wp_filesystem;

		switch ( $action_type ) {
			case 'send_email':
				$templates[] = [
					'id'           => 'booking__created__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'New Appointment',
					'to_email'     => '{{agent_full_name}} <{{agent_email}}>',
					'subject'      => 'New Appointment Received',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/booking_created.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'New Appointment',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Appointment Confirmation',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/booking_created.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__updated__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'Appointment Updated',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Appointment Updated',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/booking_updated.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__updated__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'Appointment Updated',
					'to_email'     => '{{agent_full_name}} <{{agent_email}}>',
					'subject'      => 'Appointment Updated',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/booking_updated.html' ) ),
				];
				$templates[] = [
					'id'           => 'customer__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'Customer Created',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Your New Account',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/customer_created.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__start__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'Appointment Reminder',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Appointment Reminder',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/booking_start.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__start__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'Appointment Reminder',
					'to_email'     => '{{agent_full_name}} <{{agent_email}}>',
					'subject'      => 'Appointment Reminder',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/booking_start.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__end__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'After Appointment Feedback',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Appointment Feedback',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/booking_end.html' ) ),
				];
				$templates[] = [
					'id'           => 'booking__end__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'After Appointment Feedback',
					'to_email'     => '{{agent_full_name}} <{{agent_email}}>',
					'subject'      => 'Appointment Feedback',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/booking_end.html' ) ),
				];
				$templates[] = [
					'id'           => 'order__created__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'New Order',
					'to_email'     => '{{order_agents_emails}}',
					'subject'      => 'New Order Received',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/order_created.html' ) ),
				];
				$templates[] = [
					'id'           => 'order__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'New Order',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Order Confirmation',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/order_created.html' ) ),
				];
				$templates[] = [
					'id'           => 'payment_request__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'New Payment Request',
					'to_email'     => '{{customer_full_name}} <{{customer_email}}>',
					'subject'      => 'Payment Request for Order {{order_confirmation_code}}',
					'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/customer/payment_request_created.html' ) ),
				];
				if ( OsSettingsHelper::is_env_dev() ) {

					$templates[] = [
						'id'           => 'booking__test__to_agent',
						'to_user_type' => 'agent',
						'name'         => 'Test Booking variables',
						'to_email'     => '{{agent_full_name}} <{{agent_email}}>',
						'subject'      => 'Test Booking variables',
						'content'      => OsEmailHelper::get_email_layout( $wp_filesystem->get_contents( LATEPOINT_VIEWS_ABSPATH . 'mailers/agent/booking_test.html' ) ),
					];
				}
				break;
			case 'send_sms':
				$templates[] = [
					'id'           => 'booking__created__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'New Appointment',
					'to_phone'     => '{{agent_phone}}',
					'content'      => 'Hi {{agent_first_name}}, your {{service_name}} appointment with {{customer_full_name}} is coming on {{start_date}} at {{start_time}}',
				];
				$templates[] = [
					'id'           => 'booking__updated__to_agent',
					'to_user_type' => 'agent',
					'name'         => 'Appointment Updated',
					'to_phone'     => '{{agent_phone}}',
					'content'      => 'Hi {{agent_first_name}}, appointment with ID {{booking_id}} was updated. Date/Time: {{start_date}} at {{start_time}}',
				];
				$templates[] = [
					'id'           => 'booking__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'New Appointment',
					'to_phone'     => '{{customer_phone}}',
					'content'      => 'Hi {{customer_first_name}}, your {{service_name}} appointment is coming on {{start_date}} at {{start_time}}',
				];
				$templates[] = [
					'id'           => 'booking__updated__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'Appointment Updated',
					'to_phone'     => '{{customer_phone}}',
					'content'      => 'Hi {{customer_first_name}}, your {{service_name}} appointment was updated. Date/Time: {{start_date}} at {{start_time}}',
				];
				$templates[] = [
					'id'           => 'customer__created__to_customer',
					'to_user_type' => 'customer',
					'name'         => 'Customer Created',
					'to_phone'     => '{{customer_phone}}',
					'content'      => 'Thank you for creating an account. Visit {{customer_dashboard_url}} to manage your appointments.',
				];
				break;
		}

		/**
		 * Get list of templates for action type
		 *
		 * @since 5.1.0
		 * @hook latepoint_load_templates_for_action_type
		 *
		 * @param {array} $templates array of templates for action type
		 * @param {string} $action_type type of action
		 * @param {WpFilesystem} $action_type type of action
		 *
		 * @returns {array} The filtered array of templates
		 */
		$templates = apply_filters( 'latepoint_load_templates_for_action_type', $templates, $action_type, $wp_filesystem );
		return $templates;
	}


	// Password Reset Request
	public static function customer_password_reset_request_subject() {
		$customer_mailer = new OsCustomerMailer();
		return $customer_mailer->password_reset_request_subject();
	}

	public static function customer_password_reset_request_content() {
		$customer_mailer = new OsCustomerMailer();
		return $customer_mailer->password_reset_request_content();
	}
}
