<?php 
/*!
 * Jetpack CRM
 * https://jetpackcrm.com
 *
 * WordPress User related integrations
 *
 */
namespace Automattic\JetpackCRM;

// block direct access
defined( 'ZEROBSCRM_PATH' ) || exit( 0 );

class Wordpress_User_Integration {

	/**
	 * Init
	 */
	public function __construct() {

		// register hooks
		$this->init_hooks();

	}

	/*
	 * Initialise hooks
	*/
	public function init_hooks(){

		add_action( 'profile_update', array( $this, 'wordpress_profile_update' ), 10, 3 );

	}

 
	/*
	 * Catches WordPress user profile updates and updates any related Contacts
	 * Works for all WP users and related systems (e.g. WooSync)
	 * https://developer.wordpress.org/reference/hooks/profile_update/
	 *
	 * @param int $user_id (WordPress User ID)
	 * @param WP_User Object $old_user_data
	 * @param array $new_user_data (This is a raw db insert array)
	 *
	*/
	public function wordpress_profile_update( $user_id, $old_user_data, $new_user_data ) {

		global $zbs,$wp_query;

		// detect whether these changes are coming from Profile page or Woo my account page:
		$change_via_woo_account = false;

		// here we use a relatively hacky approach to retrieve the posted page
		// ... though it seems the best approach
		if ( is_object( $wp_query ) && isset( $wp_query->queried_object ) && isset( $wp_query->queried_object->post_content ) ){

			if ( str_contains( $wp_query->queried_object->post_content, '[woocommerce_my_account]' ) ) {

				$change_via_woo_account = true;

			}

		}

		// This var will be defined as JPCRM_PROFILE_UPDATE_CHANGES, which will allow WooSync's save_my_account_crm_field_changes to sidestep repeating changes
		$profile_update_changes = array();

		// retrieve id's
		$old_user_contact_id = false;
		$new_user_contact_id = false;
		$email_conflict = false;
		if ( isset( $old_user_data->data->user_email ) ){

			// check if we have contacts with emails
			$old_user_contact_id = $zbs->DAL->contacts->getContact( -1, array(

				'email'        => $old_user_data->data->user_email,
				'onlyID'       => true,
				'ignoreowner'  => zeroBSCRM_DAL2_ignoreOwnership( ZBS_TYPE_CONTACT )

			));

		}

		if ( isset( $new_user_data['user_email'] ) ){

			$new_user_contact_id = $zbs->DAL->contacts->getContact( -1, array(

				'email'        => $new_user_data['user_email'],
				'onlyID'       => true,
				'ignoreowner'  => zeroBSCRM_DAL2_ignoreOwnership( ZBS_TYPE_CONTACT )

			));

		}

		// Email change (For Client Portal Users & WooSync originated contacts)
		if ( $old_user_data->data->user_email != $new_user_data['user_email'] ){

			// if we had a contact with this users email...
			if ( $old_user_contact_id > 0 ){

				// if we don't already have a contact with this new email (no collision)
				if ( !$new_user_contact_id ){

					// update contacts email address:
					$zbs->DAL->contacts->update_contact_email( $old_user_contact_id, $new_user_data['user_email'] );

					// flag so woosync doesn't also update
					$profile_update_changes[] = 'email';

					// Add log noting the email change
					$note_type = 'contact_changed_details_via_wpprofile';
					$short_description = __( 'Email changed', 'zero-bs-crm' );
					if ( $change_via_woo_account ){
						$note_type = 'contact_changed_details_via_woomyacc';
					}
					$zbs->DAL->logs->addUpdateLog( array(

					    'id'            => -1,
			            'owner'         => -1,
			            'data'          => array(

			                'objtype'   => ZBS_TYPE_CONTACT,
			                'objid'     => $old_user_contact_id,
			                'type'      => $note_type, // contact_changed_details_via_wpprofile or contact_changed_details_via_woomyacc
			                'shortdesc' => $short_description,
			                'longdesc'  => sprintf( __( 'Contact email changed from `%s` to `%s`', 'zero-bs-crm' ), $old_user_data->data->user_email, $new_user_data['user_email'] ),
			                
			            )

			        ));

					

				} else {

					// the email this contact has changed their email to is already in use
					// on another contact :o

					// flag so that we don't also update the new users details below
					$email_conflict = true;

					// Add a log to both contacts.					
					$short_description = __( 'Attempted email Change', 'zero-bs-crm' );
					$zbs->DAL->logs->addUpdateLog( array(

					    'id'            => -1,
			            'owner'         => -1,
			            'data'          => array(

			                'objtype'   => ZBS_TYPE_CONTACT,
			                'objid'     => $old_user_contact_id,
			                'type'      => 'contact_change_details_attempt',
			                'shortdesc' => $short_description,
			                'longdesc'  => sprintf( __( 'There was an attempt to change this contacts email from `%s` to `%s`, unfortunately this was not possible because another contact (#%d) already uses that email address.', 'zero-bs-crm' ), $old_user_data->data->user_email, $new_user_data['user_email'], $new_user_contact_id ),
			                
			            )

			        ));
					$zbs->DAL->logs->addUpdateLog( array(

					    'id'            => -1,
			            'owner'         => -1,
			            'data'          => array(

			                'objtype'   => ZBS_TYPE_CONTACT,
			                'objid'     => $new_user_contact_id,
			                'type'      => 'contact_change_details_attempt',
			                'shortdesc' => $short_description,
			                'longdesc'  => sprintf( __( 'There was an attempt to change another contact\'s (#%d) email from `%s` to `%s`, this was not possible because this contact already uses that email address.', 'zero-bs-crm' ), $old_user_contact_id, $old_user_data->data->user_email, $new_user_data['user_email'] ),
			                
			            )

			        ));

				}

			}


		}


		// First and last names are available in $new_user_data but not in old.
		// Here we brutally updated these, which in some cases may be further updated by `save_my_account_crm_field_changes()` in WooSync
		// ... if changes posted through Woo My Account, and fname/lname specified as editable fields.

		// if we have a contact to op, and this isn't a conflicting situation:
		if ( isset( $old_user_contact_id ) && $old_user_contact_id > 0 && !$email_conflict ){

			// discern if changes
			$changes = array();
			$detail_change_description = '';

			// retrieve existing
			$contact = $zbs->DAL->contacts->getContact( $old_user_contact_id, array( 'withCustomFields' => false, 'fields'=>array( 'zbsc_fname', 'zbsc_lname' ), 'ignoreowner' => true ) );

			// first name
			if ( isset( $new_user_data['first_name'] ) ){
				
				$new_first_name = $new_user_data['first_name'];
				if ( $contact['fname'] != $new_first_name ){
					
					// add limitedFields change
					$changes[] = array( 
                        'key'  => 'zbsc_fname',
                        'val'  => $new_first_name,
                        'type' => '%s'
                    );

                    // add to log
                    $detail_change_description .= '<br>' . sprintf( __( 'First name changed from `%s` to `%s`', 'zero-bs-crm' ), $contact['fname'], $new_first_name );

					// flag so woosync doesn't also update
					$profile_update_changes[] = 'fname';

				}

			}

			// last name
			if ( isset( $new_user_data['last_name'] ) ){
				
				$new_last_name = $new_user_data['last_name'];
				if ( $contact['lname'] != $new_last_name ){

					// add limitedFields change
					$changes[] = array( 
                        'key'  => 'zbsc_lname',
                        'val'  => $new_last_name,
                        'type' => '%s'
                    );

                    // add to log
                    $detail_change_description .= '<br>' . sprintf( __( 'Last name changed from `%s` to `%s`', 'zero-bs-crm' ), $contact['lname'], $new_last_name );

					// flag so woosync doesn't also update
					$profile_update_changes[] = 'lname';

				}

			}

			// any changes?
			if ( count( $changes ) > 0 ){

				// update contact
				$zbs->DAL->contacts->addUpdateContact( array(
	                'id'             => $old_user_contact_id,
	                'limitedFields'  => $changes
	             ));

				// Add log noting the email change
				$note_type = 'contact_changed_details_via_wpprofile';
				$short_description = __( 'Contact name change', 'zero-bs-crm' );
				if ( $change_via_woo_account ){
					$note_type = 'contact_changed_details_via_woomyacc';
				}
				$zbs->DAL->logs->addUpdateLog( array(

				    'id'            => -1,
		            'owner'         => -1,
		            'data'          => array(

		                'objtype'   => ZBS_TYPE_CONTACT,
		                'objid'     => $old_user_contact_id,
		                'type'      => $note_type,
		                'shortdesc' => $short_description,
		                'longdesc'  => __( 'Contact details changed:', 'zero-bs-crm' ) . $detail_change_description,
		                
		            )

		        ));
			}

		}

		// if posted from woo my account, define any changes so that woosync doesn't repeat them
		if ( !defined( 'JPCRM_PROFILE_UPDATE_CHANGES' ) && $change_via_woo_account && count( $profile_update_changes ) > 0 ){
			define( 'JPCRM_PROFILE_UPDATE_CHANGES', $profile_update_changes );
		}

	}
}
