<?php
/*
 * Jetpack CRM
 * https://jetpackcrm.com
 * V3.0
 *
 * Copyright 2020 Automattic
 *
 * Date: 20/02/2019
 */

defined( 'ZEROBSCRM_PATH' ) || exit( 0 );

/*
======================================================
	Init Func
	====================================================== */

function zeroBSCRM_QuotesTemplatesMetaboxSetup() {

	// main detail
	$zeroBS__Metabox_QuoteTemplate = new zeroBS__Metabox_QuoteTemplate( __FILE__ );

	// save
	$zeroBS__Metabox_QuoteTemplateActions = new zeroBS__Metabox_QuoteTemplateActions( __FILE__ );
}

	add_action( 'admin_init', 'zeroBSCRM_QuotesTemplatesMetaboxSetup' );

/*
======================================================
	/ Init Func
	====================================================== */

/*
======================================================
	Quote Template Metabox
	====================================================== */

class zeroBS__Metabox_QuoteTemplate extends zeroBS__Metabox {

	// this is for catching 'new' quote templates
	private $newRecordNeedsRedir = false;

	public function __construct( $plugin_file ) {

		// set these
		$this->objType         = 'quotetemplate';
		$this->metaboxID       = 'zerobs-quote-template-edit';
		$this->metaboxTitle    = __( 'Quote Template', 'zero-bs-crm' ); // will be headless anyhow
		$this->metaboxScreen   = 'zbs-add-edit-quotetemplate-edit';
		$this->metaboxArea     = 'normal';
		$this->metaboxLocation = 'high';
		$this->saveOrder       = 1;
		$this->capabilities    = array(

			'can_hide'        => false, // can be hidden
			'areas'           => array( 'normal' ), // areas can be dragged to - normal side = only areas currently
			'can_accept_tabs' => true,  // can/can't accept tabs onto it
			'can_become_tab'  => false, // can be added as tab
			'can_minimise'    => true, // can be minimised
			'can_move'        => true, // can be moved

		);

		// call this
		$this->initMetabox();
	}

	/**
	 * Outputs the HTML for the Quote Template metabox.
	 *
	 * @param array $quote_template The quote template data.
	 * @param array $metabox Unused.
	 */
	public function html( $quote_template, $metabox ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable

		global $zbs;

		$quote_template_content = '';
		if ( is_array( $quote_template ) && isset( $quote_template['content'] ) ) {
			$quote_template_content = $quote_template['content'];
		}
		?>
		<script type="text/javascript">var zbscrmjs_secToken = <?php echo wp_json_encode( wp_create_nonce( 'zbscrmjs-ajax-nonce' ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ); ?>;</script>
		<?php

		// pass specific placeholder list for WYSIWYG inserter
		$placeholder_templating = $zbs->get_templating();
		$placeholder_list       = $placeholder_templating->get_placeholders_for_tooling( array( 'quote', 'contact', 'global' ), false, false );
		echo '<script>var jpcrm_placeholder_list = ' . wp_json_encode( $placeholder_templating->simplify_placeholders_for_wysiwyg( $placeholder_list ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';</script>';

		// for mvp v3.0 we now just hard-type these, as there a lesser obj rarely used.
		$fields = array(

			'title' => array(
				0           => 'text',
				1           => __( 'Template Title', 'zero-bs-crm' ),
				2           => '', // placeholder
				'essential' => 1,
			),

			'value' => array(
				0           => 'price',
				1           => __( 'Starting Value', 'zero-bs-crm' ),
				2           => '', // placeholder
				'essential' => 1,
			),

			'notes' => array(
				0           => 'textarea',
				1           => __( 'Notes', 'zero-bs-crm' ),
				2           => '', // placeholder
				'essential' => 1,
			),
		);

		?>
		<div>
			<div class="jpcrm-form-grid" id="wptbpMetaBoxMainItem">
				<?php
				// output fields
				$skip_fields = array( 'content' ); // dealt with below
				zeroBSCRM_html_editFields( $quote_template, $fields, 'zbsqt_', $skip_fields );
				##WLREMOVE
				// template placeholder helper
				echo '<div class="jpcrm-form-group jpcrm-form-group-span-2" style="text-align:end;"><span class="ui basic black label">' . esc_html__( 'Did you know: You can now use Quote Placeholders?', 'zero-bs-crm' ) . ' <a href="' . esc_url( $zbs->urls['kbquoteplaceholders'] ) . '" target="_blank">' . esc_html__( 'Read More', 'zero-bs-crm' ) . '</a></span></div>';
				##/WLREMOVE
				?>
			</div>
			<?php
				$content = wp_kses( $quote_template_content, $zbs->acceptable_html );

				echo '<div class="jpcrm-form-group jpcrm-form-group-span-2">';
				// remove "Add contact form" button from Jetpack
				remove_action( 'media_buttons', 'grunion_media_button', 999 );
				wp_editor(
					$content,
					'zbs_quotetemplate_content',
					array( 'editor_height' => 580 )
				);
				echo '</div>';
			?>
		</div>
		<?php
	}

	public function save_data( $quoteTemplateID, $quoteTemplate ) {

		if ( ! defined( 'ZBS_OBJ_SAVED' ) ) {

			define( 'ZBS_OBJ_SAVED', 1 );

			// DAL3.0+
			global $zbs;

			// check this
			if ( empty( $quoteTemplateID ) || $quoteTemplateID < 1 ) {
				$quoteTemplateID = -1;
			}

			/*
				old way:

				Was previously just a CPT

			*/
			$extraMeta = array();

			// retrieve _POST into arr
			$autoGenAutonumbers = true; // generate if not set
			$quoteTemplate      = zeroBS_buildObjArr( $_POST, array(), $fieldPrefix = 'zbsqt_', $outputPrefix = '', false, ZBS_TYPE_QUOTETEMPLATE, $autoGenAutonumbers );

			// content (from other metabox actually)
			if ( isset( $_POST['zbs_quotetemplate_content'] ) ) {

				#} Save content
				$quoteTemplate['content'] = wp_kses( $_POST['zbs_quotetemplate_content'], $zbs->acceptable_html ); //phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.MissingUnslash -- to follow up with.

				#} update templated vars
				// Think this was here in err... if (isset($_POST['zbs_quote_template_id_used'])) $quote['template'] = (int)sanitize_text_field($_POST['zbs_quote_template_id_used']);

			}

			// add/update
			$addUpdateReturn = $zbs->DAL->quotetemplates->addUpdateQuoteTemplate(
				array(

					'id'            => $quoteTemplateID,
					'data'          => $quoteTemplate,
					'extraMeta'     => $extraMeta,
					'limitedFields' => -1,

				)
			);

			// Note: For NEW objs, we make sure a global is set here, that other update funcs can catch
			// ... so it's essential this one runs first!
			// this is managed in the metabox Class :)
			if ( $quoteTemplateID == -1 && ! empty( $addUpdateReturn ) && $addUpdateReturn != -1 ) {

				$quoteTemplateID = $addUpdateReturn;
				global $zbsJustInsertedMetaboxID;
				$zbsJustInsertedMetaboxID = $quoteTemplateID;

				// set this so it redirs
				$this->newRecordNeedsRedir = true;
			}

			// success?
			if ( $addUpdateReturn != -1 && $addUpdateReturn > 0 ) {

				// Update Msg
				// this adds an update message which'll go out ahead of any content
				// This adds to metabox: $this->updateMessages['update'] = zeroBSCRM_UI2_messageHTML('info olive mini zbs-not-urgent',__('Contact Updated',"zero-bs-crm"),'','address book outline','contactUpdated');
				// This adds to edit page
				$this->updateMessage();

				// catch any non-critical messages
				$nonCriticalMessages = $zbs->DAL->getErrors( ZBS_TYPE_QUOTETEMPLATE );
				if ( is_array( $nonCriticalMessages ) && count( $nonCriticalMessages ) > 0 ) {
					$this->dalNoticeMessage( $nonCriticalMessages );
				}
			} else {

				// fail somehow
				$failMessages = $zbs->DAL->getErrors( ZBS_TYPE_QUOTETEMPLATE );

				// show msg (retrieved from DAL err stack)
				if ( is_array( $failMessages ) && count( $failMessages ) > 0 ) {
					$this->dalErrorMessage( $failMessages );
				} else {
					$this->dalErrorMessage( array( __( 'Insert/Update Failed with general error', 'zero-bs-crm' ) ) );
				}

				// pass the pre-fill:
				global $zbsObjDataPrefill;
				$zbsObjDataPrefill = $quoteTemplate;

			}
		}

		return $quoteTemplate;
	}

	// This catches 'new' contacts + redirs to right url
	public function post_save_data( $objID, $obj ) {

		if ( $this->newRecordNeedsRedir ) {

			global $zbsJustInsertedMetaboxID;
			if ( ! empty( $zbsJustInsertedMetaboxID ) && $zbsJustInsertedMetaboxID > 0 ) {

				// redir
				wp_redirect( jpcrm_esc_link( 'edit', $zbsJustInsertedMetaboxID, $this->objType ) );
				exit( 0 );

			}
		}
	}

	public function updateMessage() {

		global $zbs;

		// zbs-not-urgent means it'll auto hide after 1.5s
		// genericified from DAL3.0
		$msg = zeroBSCRM_UI2_messageHTML( 'info olive mini zbs-not-urgent', $zbs->DAL->typeStr( $zbs->DAL->objTypeKey( $this->objType ) ) . ' ' . __( 'Updated', 'zero-bs-crm' ), '', 'address book outline', 'contactUpdated' );

		$zbs->pageMessages[] = $msg;
	}
}

/*
======================================================
	/ Quote Template Metabox
	====================================================== */

/*
======================================================
	Quote Template Actions Metabox
	====================================================== */

class zeroBS__Metabox_QuoteTemplateActions extends zeroBS__Metabox {

	public function __construct( $plugin_file ) {

		// set these
		$this->objType         = 'quotetemplate';
		$this->metaboxID       = 'zerobs-quotetemplate-actions';
		$this->metaboxTitle    = __( 'Quote Template', 'zero-bs-crm' ) . ' ' . __( 'Actions', 'zero-bs-crm' ); // will be headless anyhow
		$this->headless        = true;
		$this->metaboxScreen   = 'zbs-add-edit-quotetemplate-edit';
		$this->metaboxArea     = 'side';
		$this->metaboxLocation = 'high';
		$this->saveOrder       = 1;
		$this->capabilities    = array(

			'can_hide'        => false, // can be hidden
			'areas'           => array( 'side' ), // areas can be dragged to - normal side = only areas currently
			'can_accept_tabs' => true,  // can/can't accept tabs onto it
			'can_become_tab'  => false, // can be added as tab
			'can_minimise'    => true, // can be minimised
			'can_move'        => true, // can be moved

		);

		// call this
		$this->initMetabox();
	}

	public function html( $quoteTemplate, $metabox ) {

		?>
			<div class="zbs-generic-save-wrap">

					<div class="ui medium dividing header"><i class="save icon"></i> <?php esc_html_e( 'Template', 'zero-bs-crm' ); ?> <?php esc_html_e( 'Actions', 'zero-bs-crm' ); ?></div>

			<?php

			// localise ID & content
			$quoteTemplateID = -1;
			if ( is_array( $quoteTemplate ) && isset( $quoteTemplate['id'] ) ) {
				$quoteTemplateID = (int) $quoteTemplate['id'];
			}

			#} if a saved obj...
			if ( $quoteTemplateID > 0 ) { // existing

				?>

					<div class="zbs-quotetemplate-actions-bottom zbs-objedit-actions-bottom">

							<button class="ui button black" type="button" id="zbs-edit-save"><?php esc_html_e( 'Update', 'zero-bs-crm' ); ?> <?php esc_html_e( 'Template', 'zero-bs-crm' ); ?></button>

					<?php

						// delete?

					// for now just check if can modify, later better, granular perms.
					if ( zeroBSCRM_permsQuotes() ) {
						?>
						<div id="zbs-quotetemplate-actions-delete" class="zbs-objedit-actions-delete">
							<a class="submitdelete deletion" href="<?php echo jpcrm_esc_link( 'delete', $quoteTemplateID, 'quotetemplate' ); ?>"><?php esc_html_e( 'Delete Permanently', 'zero-bs-crm' ); ?></a>
						</div>
						<?php } // can delete ?>
						
						<div class='clear'></div>

					</div>
				<?php

			} else {

				// NEW quote template
				?>

					<div class="zbs-quotetemplate-actions-bottom zbs-objedit-actions-bottom">
						
							<button class="ui button black" type="button" id="zbs-edit-save"><?php esc_html_e( 'Save', 'zero-bs-crm' ); ?> <?php esc_html_e( 'Template', 'zero-bs-crm' ); ?></button>

					</div>

				<?php

			}

			?>
			</div>
			<?php
			// / .zbs-generic-save-wrap
	} // html

	// saved via main metabox
}

/**
 * End of Quote Template Action Metabox
 */
