<?php
/*
 * Admin Page: Settings: Field sorts
 */

// stop direct access
if ( ! defined( 'ZEROBSCRM_PATH' ) ) {
	exit( 0 );
}

global $wpdb, $zbs;  // } Req

// $settings = $zbs->settings->getAll();

$fieldTypes = array(

	'address'  => array(
		'name' => 'Address Fields',
		'obj'  => 'zbsAddressFields',
	),
	'customer' => array(
		'name' => 'Contact Fields',
		'obj'  => 'zbsCustomerFields',
	),
	'company'  => array(
		'name' => jpcrm_label_company() . ' Fields',
		'obj'  => 'zbsCompanyFields',
	),
	// following make no sense as we have custom editors for them :) v3.0 removed QUOTES, other 2 were'nt even in there yet
	// 'quote' => array('name'=>'Quote Fields','obj'=>'zbsCustomerQuoteFields'),
	// 'invoice' => array('name'=>'Invoice Fields','obj'=>'zbsInvoiceFields'),
	// 'transaction' => array('name'=>'Transaction Fields','obj'=>'zbsTransactionFields'),

);

$sbupdated = false;

// } Act on any edits!
if ( isset( $_POST['editwplfsort'] ) && zeroBSCRM_isZBSAdminOrAdmin() ) {

	// check nonce
	check_admin_referer( 'zbs-update-settings-fieldsorts' );

	// } localise
	global $zbsFieldSorts;

	// } Retrieve existing
	$newFieldOrderList = array();// $zbsFieldSorts;
	$newFieldHideList  = array();

	// } Cycle through + Save custom field order
	foreach ( $fieldTypes as $key => $fieldType ) {

		// } Retrieve from post
		$potentialCSV = '';
		if ( isset( $_POST[ 'zbscrm-' . $key . '-sortorder' ] ) && ! empty( $_POST[ 'zbscrm-' . $key . '-sortorder' ] ) ) {
			$potentialCSV = sanitize_text_field( $_POST[ 'zbscrm-' . $key . '-sortorder' ] );
		}

		// } TODO Compare with defaults (don't overridewise?)
		// use $zbsFieldSorts

		// } If not empty, break into array
		if ( ! empty( $potentialCSV ) ) {

			// $newArr = array();
			// brutal, lol
			$newArr = explode( ',', $potentialCSV );

			// } add if any
			// } This adds to rolling arr
			// if (count($newArr) > 0) $newFieldOrderList[$key]['overrides'] = $newArr;
			// } ... but better to just add to save obj :)
			$newFieldOrderList[ $key ] = $newArr;

		}

		// for each fieldtype, also check for hidden fields (hacky temp workaround)

		// } Retrieve from post
		$potentialCSV = '';
		if ( isset( $_POST[ 'zbscrm-' . $key . '-hidelist' ] ) && ! empty( $_POST[ 'zbscrm-' . $key . '-hidelist' ] ) ) {
			$potentialCSV = sanitize_text_field( $_POST[ 'zbscrm-' . $key . '-hidelist' ] );
		}

		// } TODO Compare with defaults (don't overridewise?)
		// use $zbsFieldSorts

		// } If not empty, break into array
		if ( ! empty( $potentialCSV ) ) {

			// $newArr = array();
			// brutal, lol
			$newArr = explode( ',', $potentialCSV );

			// } add if any
			// } This adds to rolling arr
			// if (count($newArr) > 0) $newFieldOrderList[$key]['overrides'] = $newArr;
			// } ... but better to just add to save obj :)
			$newFieldHideList[ $key ] = $newArr;

		}

		// / hidden fields

	}

	// debug echo 'UPDATING: <PRE>'; print_r($_POST); echo '</PRE>';

	// } This brutally overrides existing!
	$zbs->settings->update( 'fieldsorts', $newFieldOrderList );
	$zbs->settings->update( 'fieldhides', $newFieldHideList );
	$sbupdated = true;

	// $x = $zbs->settings->get('fieldsorts');
	// debug echo 'UPDATED: <PRE>'; print_r($x); echo '</PRE>';

	// } Then needs to "reget" fields :)
	zeroBSCRM_applyFieldSorts();

}

// Get field Hides...
$fieldHideOverrides = $zbs->settings->get( 'fieldhides' );

?>

<p id="sbDesc"><?php esc_html_e( 'Using this page you can modify the order of the fields associated with Contacts, Companies, Quotes', 'zero-bs-crm' ); ?></p>

<?php
if ( $sbupdated ) {
	echo '<div style="width:500px; margin-left:20px;" class="wmsgfullwidth">';
	zeroBSCRM_html_msg( 0, __( 'Field Orders Updated', 'zero-bs-crm' ) );
	echo '</div>';
}
?>

<div id="sbA">
	<form method="post" action="?page=<?php echo esc_attr( $zbs->slugs['settings'] ); ?>&tab=fieldsorts" id="zbsfieldsortform">
		<input type="hidden" name="editwplfsort" id="editwplfsort" value="1" />
		<?php
		// add nonce
		wp_nonce_field( 'zbs-update-settings-fieldsorts' );
		?>
		<?php foreach ( $fieldTypes as $key => $fieldType ) { ?>



			<table class="table table-bordered table-striped wtab">

				<thead>

				<tr>
					<th class="wmid"><?php esc_html_e( $fieldType['name'], 'zero-bs-crm' ); ?>:</th>
				</tr>

				</thead>

				<tbody id="zbscrm-<?php echo esc_attr( $key ); ?>-fieldsorts">

				<tr>
					<td style="text-align:right">

						<div class="zbsSortableFieldList">

							<ul id="zbscrm-<?php echo esc_attr( $key ); ?>-sort">

								<?php
								// } output fields

								$fieldTypesArray = isset( $GLOBALS[ $fieldType['obj'] ] ) ? $GLOBALS[ $fieldType['obj'] ] : null;

								// } This holds running list of migrated fields so only shows once
								$migratedFieldsOut = array();

								// } This holds a csv sort order output in input below
								$csvSortOrder = '';
								$csvHideList  = '';

								if ( count( $fieldTypesArray ) > 0 ) {
									foreach ( $fieldTypesArray as $subkey => $field ) {

										// if the field doesn't exist anymore, skip it
										if ( ! isset( $field[0] ) || ! isset( $field[1] ) ) {
											continue;
										}

										// remove address custom fields
										if ( $key !== 'address' && ( str_starts_with( $subkey, 'addr_cf' ) || str_starts_with( $subkey, 'secaddr_cf' ) ) ) {

											continue;

										} else {

											// normal

											// } Those with a "migrate" attribute need to be switched for what they represent here
											// } (Addresses currently @ 1.1.19)

											if ( isset( $field['migrate'] ) && ! empty( $field['migrate'] ) ) {

												if ( ! in_array( $field['migrate'], $migratedFieldsOut ) ) {

													switch ( $field['migrate'] ) {

														// } Address Fields which were separate fields under an obj are now managed as groups
														case 'addresses':
															// } Grouped "Address" field out
															?>
														<li data-key="addresses">Addresses</li>
															<?php

															break;

													}

													// } add to csv
													if ( ! empty( $csvSortOrder ) ) {
														$csvSortOrder .= ',';
													}
													$csvSortOrder .= $field['migrate'];

													// } And mark output
													$migratedFieldsOut[] = $field['migrate'];

												} // else just skip

											} else {

												// } Normal field out
												?>
											<li data-key="<?php echo esc_attr( $subkey ); ?>">
																	<?php
																		echo esc_html( $field[1] );

																	if ( str_starts_with( $subkey, 'cf' ) ) {
																		echo ' (' . esc_html__( 'Custom Field', 'zero-bs-crm' ) . ')';
																	}

																		// only bother with this if in these types:
																	if ( in_array( $key, array( 'customer', 'company' ) ) ) {

																											// } Show hide?
																		if ( isset( $field['essential'] ) && ! empty( $field['essential'] ) ) {

																			// these fields are always shown

																		} else {

																			// can be hidden

																			// is hidden?
																			$hidden = false;
																			if ( isset( $fieldHideOverrides[ $key ] ) && is_array( $fieldHideOverrides[ $key ] ) ) {
																				if ( in_array( $subkey, $fieldHideOverrides[ $key ] ) ) {
																					$hidden = true;

																					// } add to csv
																					if ( ! empty( $csvHideList ) ) {
																						$csvHideList .= ',';
																					}
																					$csvHideList .= $subkey;
																				}
																			}
																			?>
													<div class="zbs-showhide-field"><label for="zbsshowhide<?php echo esc_attr( $key . '-' . $subkey ); ?>"><?php esc_html_e( 'Hide', 'zero-bs-crm' ); ?>:</label><input id="zbsshowhide<?php echo esc_attr( $key . '-' . $subkey ); ?>" type="checkbox" value="1"
																				<?php
																				if ( $hidden ) {
																					echo ' checked="checked"';
																				}
																				?>
													/></div>
																				<?php

																		}
																	} // if hide/show option

																	?>
											</li>
												<?php
											}

											// } add to csv
											if ( ! empty( $csvSortOrder ) ) {
												$csvSortOrder .= ',';
											}
											$csvSortOrder .= $subkey;

										} // if not addr custom field

									}
								}

								?>

							</ul>

						</div>

					</td>
				</tr>

				</tbody>

			</table>
			<input type="hidden" name="zbscrm-<?php echo esc_attr( $key ); ?>-sortorder" id="zbscrm-<?php echo esc_attr( $key ); ?>-sortorder" value="<?php echo esc_attr( $csvSortOrder ); ?>" />
			<input type="hidden" name="zbscrm-<?php echo esc_attr( $key ); ?>-hidelist" id="zbscrm-<?php echo esc_attr( $key ); ?>-hidelist" value="<?php echo esc_attr( $csvHideList ); ?>" />

		<?php } ?>

		<table class="table table-bordered table-striped wtab">
			<tbody>

			<tr>
				<td class="wmid">
					<button type="button" class="ui button primary" id="zbsSaveFieldSorts"><?php esc_html_e( 'Save Field Sorts', 'zero-bs-crm' ); ?></button>
				</td>
			</tr>

			</tbody>
		</table>

	</form>

	<script type="text/javascript">
		var zbsSortableFieldTypes = <?php echo wp_json_encode( array_keys( $fieldTypes ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ); ?>;

		jQuery(function(){


			jQuery( ".zbsSortableFieldList ul" ).sortable();
			jQuery( ".zbsSortableFieldList ul" ).disableSelection();

			// bind go button
			jQuery('#zbsSaveFieldSorts').on( 'click', function(){

				// compile csv's
				jQuery.each(window.zbsSortableFieldTypes,function(ind,ele){

					var csvList = '';
					var csvHideList = '';

					// list into csv
					jQuery('#zbscrm-' + ele + '-sort li').each(function(ind,ele){

						if (csvList.length > 0) csvList += ',';

						csvList += jQuery(ele).attr('data-key');

						//DEBUG  console.log(ind + " " + jQuery(ele).attr('data-key'));


						// show hides:

						// if is present
						if (jQuery('.zbs-showhide-field input[type="checkbox"]',jQuery(ele))){

							// if is checked
							if (jQuery('.zbs-showhide-field input[type="checkbox"]',jQuery(ele)).prop('checked')){

								// log hide
								if (csvHideList.length > 0) csvHideList += ',';

								csvHideList += jQuery(ele).attr('data-key');

							}
						}

					});

					// add to hidden input
					jQuery('#zbscrm-' + ele + '-sortorder').val(csvList);
					jQuery('#zbscrm-' + ele + '-hidelist').val(csvHideList);
					//DEBUG  console.log("set " + '#zbscrm-' + ele + '-sortorder',csvList);


				});


				setTimeout(function(){

					// submit form
					jQuery('#zbsfieldsortform').submit();

				},0);

			})

		});

	</script>

</div>
