<?php
/*
 * Jetpack CRM
 * https://jetpackcrm.com
 *
 * WooSync: Admin: Connections page
 *
 */
namespace Automattic\JetpackCRM;

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

/**
 * Page: WooSync Connections
 */
function jpcrm_settings_page_html_woosync_connections() {

	global $zbs;

	$show_disconnect_prompt = false;

	$settings = $zbs->modules->woosync->settings->getAll();

	// retrieve connected store(s)
	$sync_sites = $zbs->modules->woosync->get_active_sync_sites( 'default', true );

	// did we just authenticate?
	if ( isset( $_GET['success'] ) ) {

		$success_value = (int) $_GET['success'];

		if ( $success_value == 1 ) {

			echo zeroBSCRM_UI2_messageHTML( 'success', '', __( 'Successfully authenticated remote store.', 'zero-bs-crm' ), 'info' );

		} else {

			echo zeroBSCRM_UI2_messageHTML( 'warning', '', __( 'Attempt to authenticate remote store failed.', 'zero-bs-crm' ), 'info' );

		}
	}

	$nonce_str = ( isset( $_GET['_wpnonce'] ) ? $_GET['_wpnonce'] : '' );

	// catch disconnect requests
	if ( isset( $_GET['disconnect'] ) && zeroBSCRM_isZBSAdminOrAdmin() ) {

		$site_key_to_disconnect = sanitize_text_field( $_GET['disconnect'] );

		if ( ! empty( $site_key_to_disconnect ) && isset( $sync_sites[ $site_key_to_disconnect ] ) ) {

			// show warning or act
			if ( ! isset( $_GET['definitely_disconnect'] ) ) {

				// warning prompt
				$show_disconnect_prompt = true;

			} else {

				// act

				$nonceVerified = wp_verify_nonce( $nonce_str, 'disconnect_woosync_site_connection_' . $site_key_to_disconnect );

				if ( $nonceVerified ) {

					// disconnect/delete site
					if ( $zbs->modules->woosync->remove_sync_site( $site_key_to_disconnect ) ) {

						// success message
						zeroBSCRM_html_msg( 0, __( 'Successfully disconnected connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_disconnect ]['domain'] );

						// re-retrieve connected store(s)
						$sync_sites = $zbs->modules->woosync->get_active_sync_sites( 'default', true );

					}
				} else {

					zeroBSCRM_html_msg( 1, __( 'Unable to disconnect connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_disconnect ]['domain'] );

				}
			}
		}
	}

	// catch pause request
	elseif ( isset( $_GET['pause'] ) && zeroBSCRM_isZBSAdminOrAdmin() ) {

		$did_resume        = false;
		$site_key_to_pause = sanitize_text_field( $_GET['pause'] );
		$nonceVerified     = wp_verify_nonce( $nonce_str, 'pause_woosync_site_connection_' . $site_key_to_pause );

		if ( $nonceVerified ) {

			$site_info = $zbs->modules->woosync->pause_sync_site( $site_key_to_pause );

			if ( ! empty( $site_info['paused'] ) ) {

				$did_resume = true;

				// re-retrieve connected store(s)
				$sync_sites = $zbs->modules->woosync->get_active_sync_sites( 'default', true );
			}
		}

		// output message
		if ( $did_resume ) {
			zeroBSCRM_html_msg( 0, __( 'Successfully paused sync for connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_pause ]['domain'] );
		} else {
			zeroBSCRM_html_msg( 1, __( 'Unable to pause sync for connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_pause ]['domain'] );
		}
	}

	// catch resume request
	elseif ( isset( $_GET['resume'] ) && zeroBSCRM_isZBSAdminOrAdmin() ) {

		$did_pause          = false;
		$site_key_to_resume = sanitize_text_field( $_GET['resume'] );
		$nonceVerified      = wp_verify_nonce( $nonce_str, 'resume_woosync_site_connection_' . $site_key_to_resume );

		if ( $nonceVerified ) {

			$site_info = $zbs->modules->woosync->resume_sync_site( $site_key_to_resume );

			if ( empty( $site_info['paused'] ) ) {

				$did_pause = true;

				// re-retrieve connected store(s)
				$sync_sites = $zbs->modules->woosync->get_active_sync_sites( 'default', true );
			}
		}

		// output message
		if ( $did_pause ) {
			zeroBSCRM_html_msg( 0, __( 'Successfully resumed sync for connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_resume ]['domain'] );
		} else {
			zeroBSCRM_html_msg( 1, __( 'Unable to resume sync for connection:', 'zero-bs-crm' ) . ' ' . $sync_sites[ $site_key_to_resume ]['domain'] );
		}
	}

	if ( $show_disconnect_prompt ) {

		?>
			<div class="ui icon big warning message">
				<i class="times circle outline icon"></i>
				<div class="content">
					<div class="header">
						<?php _e( 'Are you sure?', 'zero-bs-crm' ); ?>
					</div>
					<p><?php printf( __( 'Are you sure you want to disconnect the connection to the store at <br><code>%s</code>?', 'zero-bs-crm' ), $sync_sites[ $site_key_to_disconnect ]['domain'] ); ?></p>
					<p><?php esc_html_e( 'This will permanently remove this connection. No new data will be synchronised from this external store unless you add a new connection to it at a later date. This will not remove any existing data.', 'zero-bs-crm' ); ?></p>
					<p>
					<?php

									// actions
									echo '<a href="' . esc_url( wp_nonce_url( '?page=' . $zbs->slugs['settings'] . '&tab=' . $zbs->modules->woosync->slugs['settings'] . '&subtab=' . $zbs->modules->woosync->slugs['settings_connections'] . '&disconnect=' . $site_key_to_disconnect . '&definitely_disconnect=1', 'disconnect_woosync_site_connection_' . $site_key_to_disconnect ) ) . '" class="ui orange button right floated"><i class="trash alternate icon"></i> ' . esc_html__( 'Disconnect Store Connection', 'zero-bs-crm' ) . '</a>';
									echo '<a href="' . jpcrm_esc_link( $zbs->slugs['settings'] . '&tab=' . $zbs->modules->woosync->slugs['settings'] . '&subtab=' . $zbs->modules->woosync->slugs['settings_connections'] ) . '" class="ui green button right floated"><i class="angle double left icon"></i> ' . esc_html__( 'Back to Connections', 'zero-bs-crm' ) . '</a>';

					?>
					</p>
				</div>
			</div>
		<?php

	} else {

		// normal page load
		?>
		<p><?php echo wp_kses( sprintf( __( 'From this page you can manage connections between Jetpack CRM and one or more WooCommerce stores. <a href="%s" target="_blank">Read more about connecting Jetpack CRM to WooCommerce</a>.', 'zero-bs-crm' ), esc_url( $zbs->urls['connect-multi-woo'] ) ), $zbs->acceptable_restricted_html ); ?></p>

		<h3 style="text-align: center;" class="ui blue header"><?php esc_html_e( 'WooCommerce Connections', 'zero-bs-crm' ); ?></h3>
		<table class="table table-striped wtab">
			<tbody>
				<td>
					<?php

					// first up we want to pick any local connections out of the stack
					if ( isset( $sync_sites['local'] ) ) {

						// draw it
						jpcrm_woosync_connections_page_single_connection( 'local', $sync_sites['local'] );

					}

					foreach ( $sync_sites as $site_key => $site_info ) {

						// skip local as dealt with above
						if ( $site_key === 'local' ) {
							continue;
						}

						// draw it
						jpcrm_woosync_connections_page_single_connection( $site_key, $site_info );

					}

					// if no connections show message:
					if ( count( $sync_sites ) === 0 ) {

						echo zeroBSCRM_UI2_messageHTML( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
							'info',
							__( 'No WooCommerce connections', 'zero-bs-crm' ),
							__( 'Connect to an external WooCommerce store or install WooCommerce to get started.', 'zero-bs-crm' ),
							'',
							'jpcrm-no-woo-connections-notice'
						);

					}

					?>
				</td>
			</tbody>
			<tfoot>

				<tr>
					<td colspan="2" class="wmid" style="padding-top:1.5em">
						<button class="ui blue button" id="jpcrm-woosync-connect-to-store"><i class="plug icon"></i> 
						<?php
						if ( count( $sync_sites ) == 0 ) {

							esc_html_e( 'Connect a Store', 'zero-bs-crm' );

						} else {

							esc_html_e( 'Connect another Store', 'zero-bs-crm' );

						}
						?>
						</button>
						<?php
						printf(
							'<a href="%s" class="ui basic positive button" style="margin-top:1em"><i class="shopping cart icon"></i> %s</a>',
							jpcrm_esc_link( $zbs->slugs['woosync'] ),
							esc_html__( 'WooSync Hub', 'zero-bs-crm' )
						);
						?>
					</td>
				</tr>

			</tfoot>
		</table>

		<script type="text/javascript">

			jQuery(document).ready(function(){

			});


		</script>

		<?php

	} // / normal page load
}

/*
* Draws html for a WooCommerce connection
*/
function jpcrm_woosync_connections_page_single_connection( $site_key, $site_info ) {

	global $zbs;

	if ( ! is_array( $site_info ) ) {

		return '';

	}

	// connected?
	switch ( $site_info['mode'] ) {

		case JPCRM_WOO_SYNC_MODE_LOCAL:
			// always connected, as long as Woo is here
			if ( $zbs->woocommerce_is_active() ) {

				$connection_status        = true;
				$connection_explainer_str = '';

			} else {

				$connection_status        = false;
				$connection_explainer_str = __( 'Cannot find WooCommerce', 'zero-bs-crm' );

			}

			break;

		case JPCRM_WOO_SYNC_MODE_API:
			// verify creds:
			if ( $zbs->modules->woosync->verify_api_connection( $site_key ) ) {

				$connection_status        = true;
				$connection_explainer_str = '';

				// clear connection error count
				$zbs->modules->woosync->set_sync_site_attribute( $site_key, 'site_connection_errors', 0 );

			} else {

				$connection_status        = false;
				$connection_explainer_str = __( 'Could not connect to WooCommerce', 'zero-bs-crm' );

				// increment connection error count
				$zbs->modules->woosync->increment_sync_site_count( $site_key, 'site_connection_errors' );

			}

			break;

	}

	?>
	<div class="jpcrm-woocommerce-connection ui segment" id="jpcrm-woocommerce-connection-<?php echo esc_attr( $site_key ); ?>">

		<div class="ui grid">
			<div class="twelve wide column">
				<div class="jpcrm-woocommerce-site">
					<?php

						$additional_button_html = '';

					if ( $connection_status ) {

						$label_color = 'green';
						$label_str   = __( 'Connected', 'zero-bs-crm' );

						// pause/resume
						if ( ! isset( $site_info['paused'] ) || ! $site_info['paused'] ) {

							// pause
							$additional_button_html = sprintf(
								'<a href="%s&tab=%s&subtab=%s&pause=%s&_wpnonce=%s" class="ui small basic fluid button" style="margin-top:1em"><i class="pause icon"></i> %s</a>',
								jpcrm_esc_link( $zbs->slugs['settings'] ),
								$zbs->modules->woosync->slugs['settings'],
								$zbs->modules->woosync->slugs['settings_connections'],
								$site_key,
								wp_create_nonce( 'pause_woosync_site_connection_' . $site_key ),
								__( 'Pause Sync', 'zero-bs-crm' )
							);

						} else {

							// resume
							$additional_button_html = sprintf(
								'<a href="%s&tab=%s&subtab=%s&resume=%s&_wpnonce=%s" class="ui small basic orange fluid button" style="margin-top:1em"><i class="play icon"></i> %s</a>',
								jpcrm_esc_link( $zbs->slugs['settings'] ),
								$zbs->modules->woosync->slugs['settings'],
								$zbs->modules->woosync->slugs['settings_connections'],
								$site_key,
								wp_create_nonce( 'resume_woosync_site_connection_' . $site_key ),
								__( 'Resume Sync', 'zero-bs-crm' )
							);

						}
					} else {

						$label_color = 'grey';
						$label_str   = __( 'Not connected', 'zero-bs-crm' );

					}

						echo '<span class="ui right floated large label jpcrm-woocommerce-connection-state ' . esc_attr( $label_color ) . '">' . esc_html( $label_str ) . '</span>';

					switch ( $site_info['mode'] ) {

						case JPCRM_WOO_SYNC_MODE_LOCAL:
							echo '<span class="ui large label teal"><i class="home icon"></i> ' . esc_html__( 'Local', 'zero-bs-crm' ) . '</span>';

							break;

						case JPCRM_WOO_SYNC_MODE_API:
							echo '<span class="ui large label blue"><i class="plug icon"></i> ' . esc_html__( 'External', 'zero-bs-crm' ) . '</span>';

							break;

					}

						echo '<span class="jpcrm-woocommerce-site-url">' . esc_html( $site_info['domain'] ) . '</span>';

					?>
				</div>

				<?php

				// extra detail?
				if ( $site_info['last_sync_fired'] != -1 || isset( $site_info['total_order_count'] ) ) {

					?>
					<div class="jpcrm-woocommerce-connection-details">
					<?php

						// last synced
					if ( $site_info['last_sync_fired'] != -1 ) {
						echo '<div class="jpcrm-woocommerce-last-synced jpcrm-woocommerce-connection-detail">' . esc_html( sprintf( __( 'Last Synced Data: %s', 'zero-bs-crm' ), zeroBSCRM_locale_utsToDatetime( $site_info['last_sync_fired'] ) ) ) . '</div>';
					}
					if ( isset( $site_info['total_order_count'] ) ) {
						echo '<div class="jpcrm-woocommerce-total-order-count jpcrm-woocommerce-connection-detail">' . esc_html( sprintf( __( 'Total Orders Imported: %s', 'zero-bs-crm' ), zeroBSCRM_prettifyLongInts( $site_info['total_order_count'] ) ) ) . '</div>';
					}

					?>
					</div>
					<?php
				}

				?>

			</div>
			<div class="four wide column jpcrm-woocommerce-connection-column">

				<?php

				// edit
				$edit_button = sprintf(
					'<a href="%s&tab=%s&subtab=%s&site_key=%s" class="ui small basic fluid button" style="margin-top:1em"><i class="pencil alternate icon"></i> %s</a>',
					jpcrm_esc_link( $zbs->slugs['settings'] ),
					esc_attr( $zbs->modules->woosync->slugs['settings'] ),
					esc_attr( $zbs->modules->woosync->slugs['settings_connection_edit'] ),
					esc_attr( $site_key ),
					esc_html__( 'Edit', 'zero-bs-crm' )
				);

				// actions
				switch ( $site_info['mode'] ) {

					case JPCRM_WOO_SYNC_MODE_LOCAL:
						if ( $connection_status ) {

							// All Okay

							// visit store
							echo '<a href="' . esc_url( $zbs->modules->woosync->get_local_woo_admin_url() ) . '" target="_blank" class="ui small blue fluid button"><i class="building alternate icon"></i> ' . esc_html__( 'WooCommerce Admin', 'zero-bs-crm' ) . '</a>';

							// edit
							echo $edit_button;

							// any extras? (pause)
							echo $additional_button_html;

						} else {

							// Some issue with connection, could be lack of WooCommerce (was active, isn't now)
							esc_html_e( 'There was an error connecting to your local WooCommerce store. Please make sure WooCommerce is active, after which if this error message persists, please contact support.', 'zero-bs-crm' );

						}

						break;

					case JPCRM_WOO_SYNC_MODE_API:
						if ( $connection_status ) {

							// already connected, nothing to do

							// visit store
							echo '<a href="' . esc_url( $zbs->modules->woosync->get_external_woo_admin_url( $site_info['domain'] ) ) . '" target="_blank" class="ui small blue fluid button"><i class="external square alternate icon"></i> ' . esc_html__( 'WooCommerce Admin', 'zero-bs-crm' ) . '</a>';

							// edit
							echo $edit_button;

							// any extras? (pause)
							echo $additional_button_html;

							// delete
							printf(
								'<a href="%s&tab=%s&subtab=%s&disconnect=%s" class="ui small basic negative fluid button" style="margin-top:1em"><i class="times circle outline icon"></i> %s</a>',
								jpcrm_esc_link( $zbs->slugs['settings'] ),
								esc_attr( $zbs->modules->woosync->slugs['settings'] ),
								esc_attr( $zbs->modules->woosync->slugs['settings_connections'] ),
								esc_attr( $site_key ),
								esc_html__( 'Delete Connection', 'zero-bs-crm' )
							);

						} else {

							// edit
							echo $edit_button;

							// delete
							printf(
								'<a href="%s&tab=%s&subtab=%s&disconnect=%s" class="ui small basic negative fluid button" style="margin-top:1em"><i class="times circle outline icon"></i> %s</a>',
								jpcrm_esc_link( $zbs->slugs['settings'] ),
								esc_attr( $zbs->modules->woosync->slugs['settings'] ),
								esc_attr( $zbs->modules->woosync->slugs['settings_connections'] ),
								esc_attr( $site_key ),
								esc_html__( 'Delete Connection', 'zero-bs-crm' )
							);
						}

						break;

				}

					// explainer?
				if ( ! empty( $connection_explainer_str ) ) {
					echo '<br>' . esc_html( $connection_explainer_str );
				}

				?>
			</div>
		</div>
	</div>
	<?php
}

/**
 * Styles and scripts for connections
 */
function jpcrm_woosync_connections_styles_scripts() {

	global $zbs;
	wp_enqueue_script( 'jpcrm-woo-sync-connections-page', plugins_url( '/js/jpcrm-woo-sync-settings-connections' . wp_scripts_get_suffix() . '.js', JPCRM_WOO_SYNC_ROOT_FILE ), array( 'jquery' ), $zbs->modules->woosync->version );
	wp_enqueue_style( 'jpcrm-woo-sync-connections-page', plugins_url( '/css/jpcrm-woo-sync-settings-connections' . wp_scripts_get_suffix() . '.css', JPCRM_WOO_SYNC_ROOT_FILE ) );
}
