<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly!
}

if ( ! class_exists( 'WPSC_Text_Editor' ) ) :

	final class WPSC_Text_Editor {

		/**
		 * Tabs for this section
		 *
		 * @var array
		 */
		private static $tabs;

		/**
		 * Current tab
		 *
		 * @var string
		 */
		public static $current_tab;

		/**
		 * Rich text editor toolbar
		 *
		 * @var array
		 */
		public static $toolbar = array();

		/**
		 * Initialize this class
		 *
		 * @return void
		 */
		public static function init() {

			// Load settings.
			add_action( 'init', array( __CLASS__, 'toolbar_options' ) );

			// Load tabs for this section.
			add_action( 'admin_init', array( __CLASS__, 'load_tabs' ) );

			// Add current tab to admin localization data.
			add_filter( 'wpsc_admin_localizations', array( __CLASS__, 'localizations' ) );

			// Load section tab layout.
			add_action( 'wp_ajax_wpsc_get_rich_text_editor', array( __CLASS__, 'get_rich_text_editor' ) );
		}

		/**
		 * Load toolbar settings for global use
		 *
		 * @return void
		 */
		public static function toolbar_options() {

			$toolbar = array(
				array(
					'name'  => esc_attr__( 'Bold', 'supportcandy' ),
					'value' => 'bold',
				),
				array(
					'name'  => esc_attr__( 'Italic', 'supportcandy' ),
					'value' => 'italic',
				),
				array(
					'name'  => esc_attr__( 'Underline', 'supportcandy' ),
					'value' => 'underline',
				),
				array(
					'name'  => esc_attr__( 'Blockquote', 'supportcandy' ),
					'value' => 'blockquote',
				),
				array(
					'name'  => esc_attr__( 'Align', 'supportcandy' ),
					'value' => 'alignleft aligncenter alignright',
				),
				array(
					'name'  => esc_attr__( 'Bulleted list', 'supportcandy' ),
					'value' => 'bullist',
				),
				array(
					'name'  => esc_attr__( 'Numbered list', 'supportcandy' ),
					'value' => 'numlist',
				),
				array(
					'name'  => esc_attr__( 'Right to left', 'supportcandy' ),
					'value' => 'rtl',
				),
				array(
					'name'  => esc_attr__( 'Link', 'supportcandy' ),
					'value' => 'link',
				),
				array(
					'name'  => esc_attr__( 'Image', 'supportcandy' ),
					'value' => 'wpsc_insert_editor_img',
				),
				array(
					'name'  => esc_attr__( 'Text Color', 'supportcandy' ),
					'value' => 'forecolor',
				),
				array(
					'name'  => esc_attr__( 'Text Background Color', 'supportcandy' ),
					'value' => 'backcolor',
				),
				array(
					'name'  => esc_attr__( 'Strikethrough', 'supportcandy' ),
					'value' => 'strikethrough',
				),
			);
			self::$toolbar = $toolbar;
		}

		/**
		 * Load tabs for this section
		 */
		public static function load_tabs() {

			self::$tabs        = apply_filters(
				'wpsc_te_tabs',
				array(
					'agent'           => array(
						'slug'     => 'agent',
						'label'    => esc_attr__( 'Agent', 'supportcandy' ),
						'callback' => 'wpsc_get_te_agent',
					),
					'registered-user' => array(
						'slug'     => 'registered_user',
						'label'    => esc_attr__( 'Registered User', 'supportcandy' ),
						'callback' => 'wpsc_get_te_registered_user',
					),
					'guest-user'      => array(
						'slug'     => 'guest_user',
						'label'    => esc_attr__( 'Guest User', 'supportcandy' ),
						'callback' => 'wpsc_get_te_guest_user',
					),
					'advanced'        => array(
						'slug'     => 'advanced',
						'label'    => esc_attr__( 'Advanced', 'supportcandy' ),
						'callback' => 'wpsc_get_te_advanced',
					),
				)
			);
			self::$current_tab = isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'agent'; //phpcs:ignore
		}


		/**
		 * Add localizations to local JS
		 *
		 * @param array $localizations - localization list.
		 * @return array
		 */
		public static function localizations( $localizations ) {

			if ( ! ( WPSC_Settings::$is_current_page && WPSC_Settings::$current_section === 'rich-text-editor' ) ) {
				return $localizations;
			}

			// Current section.
			$localizations['current_tab'] = self::$current_tab;

			return $localizations;
		}

		/**
		 * General setion body layout
		 *
		 * @return void
		 */
		public static function get_rich_text_editor() {

			if ( ! WPSC_Functions::is_site_admin() ) {
				wp_send_json_error( __( 'Unauthorized access!', 'supportcandy' ), 401 );
			}?>

			<div class="wpsc-setting-tab-container">
				<?php
				foreach ( self::$tabs as $key => $tab ) :
					$active = self::$current_tab === $key ? 'active' : ''
					?>
						<button 
							class="<?php echo esc_attr( $key ) . ' ' . esc_attr( $active ); ?>"
							onclick="<?php echo esc_attr( $tab['callback'] ) . '();'; ?>">
							<?php echo esc_attr( $tab['label'] ); ?>
							</button>
							<?php
					endforeach;
				?>
			</div>
			<div class="wpsc-setting-section-body"></div>
			<?php
			wp_die();
		}

		/**
		 * Print editor (TinyMCE) init scripts
		 *
		 * @param string $id - textarea id.
		 * @param string $body_id - body id.
		 * @return void
		 */
		public static function print_editor_init_scripts( $id, $body_id ) {

			$toolbox      = array();
			$is_editor    = false;
			$current_user = WPSC_Current_User::$current_user;
			$advanced     = get_option( 'wpsc-te-advanced' );
			$rich_editing = get_user_meta( $current_user->user->ID, 'rich_editing', true );
			$rich_editing = filter_var( $rich_editing, FILTER_VALIDATE_BOOLEAN );

			if ( $current_user->is_agent ) {

				$agent = get_option( 'wpsc-te-agent' );
				if ( $agent['enable'] ) {
					$is_editor = true;
					foreach ( $agent['toolbar'] as $key => $value ) {
						$toolbox[] = $value;
						if ( in_array( $value, array( 'blockquote', 'alignright', 'numlist', 'rtl', 'wpsc_insert_editor_img' ) ) ) {
							$toolbox[] = '|';
						}
					}
				}
			} elseif ( $current_user->is_customer && $current_user->user->ID ) {

				$reg_user = get_option( 'wpsc-te-registered-user' );
				if ( $reg_user['enable'] ) {
					$is_editor = true;
					foreach ( $reg_user['toolbar'] as $key => $value ) {
						$toolbox[] = $value;
						if ( in_array( $value, array( 'blockquote', 'alignright', 'numlist', 'rtl', 'wpsc_insert_editor_img' ) ) ) {
							$toolbox[] = '|';
						}
					}
				}
			} else {

				$guest = get_option( 'wpsc-te-guest-user' );
				if ( $guest['enable'] ) {
					$is_editor = true;
					foreach ( $guest['toolbar'] as $key => $value ) {
						$toolbox[] = $value;
						if ( in_array( $value, array( 'blockquote', 'alignright', 'numlist', 'rtl', 'wpsc_insert_editor_img' ) ) ) {
							$toolbox[] = '|';
						}
					}
				}
				$rich_editing = true;
			}

			$allow_paste_img = false;
			if ( in_array( 'wpsc_insert_editor_img', $toolbox ) ) {
				$allow_paste_img = true;
			}
			$toolbox = implode( ' ', $toolbox );
			?>

			var isWPSCEditor = <?php echo esc_attr( $is_editor ) && esc_attr( $rich_editing ) ? '1' : '0'; ?>;
			<?php
			if ( $is_editor && $rich_editing ) :
				?>
				tinymce.remove('#<?php echo esc_attr( $id ); ?>');
				tinymce.init({ 
					selector:'#<?php echo esc_attr( $id ); ?>',
					body_id: '<?php echo esc_attr( $body_id ); ?>',
					menubar: false,
					statusbar: false,
					autoresize_min_height: 150,
					wp_autoresize_on: true,
					plugins: [
					'lists link directionality wpautoresize textcolor paste'
					],
					<?php echo $advanced['html-pasting'] == 0 ? 'paste_as_text: true,' : ''; ?>
					image_advtab: true,
					toolbar: '<?php echo esc_attr( $toolbox ); ?>',
					directionality: '<?php echo is_rtl() ? 'rtl' : 'ltr'; ?>',
					branding: false,
					autoresize_bottom_margin: 20,
					browser_spellcheck : true,
					relative_urls : false,
					remove_script_host : false,
					convert_urls : true,
					<?php
					if ( $allow_paste_img ) {
						?>
						paste_data_images: true,
						images_upload_handler: function (blobInfo, success, failure) {

							form_data = new FormData();
							form_data.append('file', blobInfo.blob(), blobInfo.filename());
							form_data.append('action','wpsc_tinymce_upload_file');
							form_data.append('_ajax_nonce', '<?php echo esc_attr( wp_create_nonce( 'wpsc_tinymce_upload_file' ) ); ?>');

							jQuery.ajax({
								type : 'post',
								url : supportcandy.ajax_url,
								cache: false,
								contentType: false,
								processData: false,
								data: form_data,
								success: function(res){
									success(res.imgURL);
								}
							});
						},
						<?php
					}
					?>
					setup: function (editor) {
						editor.on('blur', function(e) {
							jQuery( '#<?php echo esc_attr( $id ); ?>' ).text( editor.getContent() );
							wpsc_check_tff_visibility();
						});
						// Add a custom button
						editor.addButton('wpsc_insert_editor_img', {
							title : 'Insert/edit image',
							onclick : function() {
								// Add you own code to execute something on click
								wpsc_add_custom_image_tinymce(editor, '<?php echo esc_attr( wp_create_nonce( 'wpsc_add_custom_image_tinymce' ) ); ?>');
							}
						});
						editor.on('click', function (e) {
							if(e.target.nodeName === "IMG"){
								wpsc_edit_custom_image_tinymce(editor, e.target, '<?php echo esc_attr( wp_create_nonce( 'wpsc_edit_custom_image_tinymce' ) ); ?>');
							}
						});
						editor.on('KeyUp', function (e) {
							if( tinyMCE.activeEditor.getContent() == '' ) {
								ticket_id = jQuery('#wpsc-current-ticket').val();
								wpsc_clear_saved_draft_reply( ticket_id );
							}
						});
					}
				});
				<?php
			endif;
		}

		/**
		 * Check attachment are allowed to user
		 *
		 * @return boolean
		 */
		public static function is_allow_attachments() {

			$current_user = WPSC_Current_User::$current_user;
			$flag         = false;

			if ( $current_user->is_agent ) {

				$agent = get_option( 'wpsc-te-agent' );
				if ( $agent['allow-attachments'] ) {
					$flag = true;
				}
			} elseif ( $current_user->is_customer && $current_user->user->ID ) {

				$reg_user = get_option( 'wpsc-te-registered-user' );
				if ( $reg_user['allow-attachments'] ) {
					$flag = true;
				}
			} else {

				$guest = get_option( 'wpsc-te-guest-user' );
				if ( $guest['allow-attachments'] ) {
					$flag = true;
				}
			}

			return $flag;
		}

		/**
		 * Check attachment notice are allowed to user
		 *
		 * @return boolean
		 */
		public static function is_attachment_notice() {

			$current_user = WPSC_Current_User::$current_user;
			$flag         = false;

			if ( $current_user->is_agent ) {

				$agent = get_option( 'wpsc-te-agent' );
				if ( $agent['file-attachment-notice'] ) {
					$flag = true;
				}
			} elseif ( $current_user->is_customer && $current_user->user->ID ) {

				$reg_user = get_option( 'wpsc-te-registered-user' );
				if ( $reg_user['file-attachment-notice'] ) {
					$flag = true;
				}
			} else {

				$guest = get_option( 'wpsc-te-guest-user' );
				if ( $guest['file-attachment-notice'] ) {
					$flag = true;
				}
			}
			return $flag;
		}

		/**
		 * File attachment notice text
		 *
		 * @return string
		 */
		public static function file_attachment_notice_text() {

			$current_user = WPSC_Current_User::$current_user;
			$notice_text  = '';

			if ( $current_user->is_agent ) {

				$agent       = get_option( 'wpsc-te-agent' );
				$notice_text = $agent['file-attachment-notice-text'];

			} elseif ( $current_user->is_customer && $current_user->user->ID ) {

				$reg_user    = get_option( 'wpsc-te-registered-user' );
				$notice_text = $reg_user['file-attachment-notice-text'];

			} else {

				$guest       = get_option( 'wpsc-te-guest-user' );
				$notice_text = $guest['file-attachment-notice-text'];

			}
			return $notice_text;
		}
	}
endif;

WPSC_Text_Editor::init();
