<?php
/**
 * Instant Indexing callbacks
 *
 * @package SEOPress
 * @subpackage Callbacks
 */

defined( 'ABSPATH' ) || exit( 'Please don&rsquo;t call the plugin directly. Thanks :)' );

/**
 * Print the instant indexing google engine callback.
 */
function seopress_instant_indexing_google_engine_callback() {
	$options = get_option( 'seopress_instant_indexing_option_name' );

	$search_engines = array(
		'google' => 'Google',
		'bing'   => 'Bing / Yandex',
	);

	if ( ! empty( $search_engines ) ) {
		foreach ( $search_engines as $key => $value ) {
			$check = isset( $options['engines'][ $key ] ) ? $options['engines'][ $key ] : null;
			?>
			<div class="seopress_wrap_single_cpt">
				<label
					for="seopress_instant_indexing_engines_<?php echo esc_attr( $key ); ?>">
					<input
						id="seopress_instant_indexing_engines_<?php echo esc_attr( $key ); ?>"
						name="seopress_instant_indexing_option_name[engines][<?php echo esc_attr( $key ); ?>]"
						type="checkbox" <?php if ( '1' === $check ) { ?>
					checked="yes"
					<?php } ?>
					value="1"/>
					<?php echo esc_html( $value ); ?>
				</label>
			</div>
			<?php
			if ( isset( $options['engines'][ $key ] ) ) {
				esc_attr( $options['engines'][ $key ] );
			}
		}
	}
}

/**
 * Print the instant indexing google action callback.
 */
function seopress_instant_indexing_google_action_callback() {
	$options = get_option( 'seopress_instant_indexing_option_name' );

	$actions = [
		'URL_UPDATED' => esc_attr__( 'Update URLs', 'wp-seopress' ),
		'URL_DELETED' => esc_attr__( 'Remove URLs (URL must return a 404 or 410 status code or the page contains <meta name="robots" content="noindex" /> meta tag)', 'wp-seopress' ),
	];

	foreach ( $actions as $key => $value ) {
		?>
<div class="seopress_wrap_single_cpt">

		<?php
		if ( isset( $options['seopress_instant_indexing_google_action'] ) ) {
			$check = $options['seopress_instant_indexing_google_action'];
		} else {
			$check = 'URL_UPDATED';
		}
		?>

	<label
		for="seopress_instant_indexing_google_action_include_<?php echo esc_attr( $key ); ?>">
		<input
			id="seopress_instant_indexing_google_action_include_<?php echo esc_attr( $key ); ?>"
			name="seopress_instant_indexing_option_name[seopress_instant_indexing_google_action]" type="radio" <?php if ( $key === $check ) { ?>
		checked="yes"
		<?php } ?>
		value="<?php echo esc_attr( $key ); ?>"/>

		<?php echo esc_html( $value ); ?>
	</label>

		<?php
		if ( isset( $options['seopress_instant_indexing_google_action'] ) ) {
			esc_attr( $options['seopress_instant_indexing_google_action'] );
		}
		?>
</div>
		<?php
	}
}

/**
 * Print the instant indexing manual batch callback.
 */
function seopress_instant_indexing_manual_batch_callback() {
	require_once WP_PLUGIN_DIR . '/wp-seopress/vendor/autoload.php';
	$options = get_option( 'seopress_instant_indexing_option_name' );
	$log     = get_option( 'seopress_instant_indexing_log_option_name' );
	$check   = isset( $options['seopress_instant_indexing_manual_batch'] ) ? esc_attr( $options['seopress_instant_indexing_manual_batch'] ) : null;

	// URLs.
	$urls = isset( $log['log']['urls'] ) ? $log['log']['urls'] : null;
	$date = isset( $log['log']['date'] ) ? $log['log']['date'] : null;

	// General errors.
	$error = isset( $log['error'] ) ? $log['error'] : null;

	// Bing.
	$bing_response = isset( $log['bing']['response'] ) && is_array( $log['bing']['response'] ) ? $log['bing']['response'] : null;

	// Google.
	$google_response = isset( $log['google']['response'] ) && is_array( $log['google']['response'] ) ? $log['google']['response'] : null;

	printf(
		'<textarea id="seopress_instant_indexing_manual_batch" name="seopress_instant_indexing_option_name[seopress_instant_indexing_manual_batch]" rows="35" placeholder="' . esc_html__( 'Enter one URL per line to submit them to search engines (max 100 URLs)', 'wp-seopress' ) . '" aria-label="' . esc_attr__( 'Enter one URL per line to submit them to search engines (max 100 URLs)', 'wp-seopress' ) . '">%s</textarea>',
		esc_html( $check )
	);
	?>

<div class="wrap-sp-progress">
	<div class="sp-progress" style="margin:0">
		<div id="seopress_instant_indexing_url_progress" class="sp-progress-bar" role="progressbar" style="width: 1%;" aria-valuenow="1" aria-valuemin="0" aria-valuemax="100">1%</div>
	</div>
	<div class="wrap-seopress-counters">
		<div id="seopress_instant_indexing_url_count"></div>
		<strong><?php esc_attr_e( ' / 100 URLs', 'wp-seopress' ); ?></strong>
	</div>
</div>

<div class="seopress-notice is-warning">
	<p>
		<?php
			echo wp_kses_post( __( 'The Google Indexing API should only be used to crawl pages that contain structured data of type <code>JobPosting</code> or <code>BroadcastEvent</code> in a <code>VideoObject</code> element.', 'wp-seopress' ) );
		?>
	</p>
</div>

<p>
	<button type="button" class="seopress-instant-indexing-batch btn btnPrimary">
		<?php esc_attr_e( 'Submit URLs to Google & Bing', 'wp-seopress' ); ?>
	</button>

	<span class="spinner"></span>
</p>

<h3><?php esc_attr_e( 'Latest indexing request', 'wp-seopress' ); ?></h3>
<p><em><?php echo esc_html( $date ); ?></em></p>

	<?php
	if ( isset( $error ) && ! empty( $error ) ) {
		?>
	<code><?php echo esc_html( $error ); ?></code>
		<?php
	}
	if ( isset( $bing_response ) && is_array( $bing_response ) && ! empty( $bing_response ) ) {
		echo '<div class="wrap-bing-response">';
		echo '<h4>' . esc_html__( 'Bing Response', 'wp-seopress' ) . '</h4>';
		if ( ! empty( $bing_response['error'] ) ) {
			// Error case.
			echo '<span class="indexing-log indexing-failed"></span>';
			echo '<code>' . esc_html( $bing_response['error']['code'] ) . ' - ' . esc_html( $bing_response['error']['message'] ) . '</code>';
		} else {
			// Success or info case.
			$code = isset( $bing_response['code'] ) ? $bing_response['code'] : null;
			switch ( $code ) {
				case 200:
					$msg = esc_attr__( 'URLs submitted successfully', 'wp-seopress' );
					break;
				case 202:
					$msg = esc_attr__( 'URL received. IndexNow key validation pending.', 'wp-seopress' );
					break;
				case 400:
					$msg = esc_attr__( 'Bad request: Invalid format', 'wp-seopress' );
					break;
				case 401:
					$msg = esc_attr__( 'Bing API key is missing', 'wp-seopress' );
					break;
				case 403:
					$msg = esc_attr__( 'Forbidden: In case of key not valid (e.g. key not found, file found but key not in the file)', 'wp-seopress' );
					break;
				case 422:
					$msg = esc_attr__( 'Unprocessable Entity: In case of URLs don’t belong to the host or the key is not matching the schema in the protocol', 'wp-seopress' );
					break;
				case 429:
					$msg = esc_attr__( 'Too Many Requests (potential Spam)', 'wp-seopress' );
					break;
				default:
					$msg = esc_attr__( 'Something went wrong', 'wp-seopress' );
			}
			if ( 200 === $code || 202 === $code ) {
				echo '<span class="indexing-log indexing-done"></span>';
			} else {
				echo '<span class="indexing-log indexing-failed"></span>';
			}
			echo '<code>' . esc_html( $msg ) . '</code>';
		}
		echo '</div>';
	}

	if ( isset( $google_response ) && is_array( $google_response ) && ! empty( $google_response ) ) {
		?>
		<div class="wrap-google-response">
			<h4><?php esc_attr_e( 'Google Response', 'wp-seopress' ); ?></h4>

			<?php
			$google_exception = $google_response[ array_key_first( $google_response ) ];
			if ( is_a( $google_exception, 'Google\Service\Exception' ) ) {
				$error = json_decode( $google_exception->getMessage(), true );
				echo '<span class="indexing-log indexing-failed"></span><code>' . esc_html( $error['error']['code'] ) . ' - ' . esc_html( $error['error']['message'] ) . '</code>';
			} elseif ( ! empty( $google_response['error'] ) ) {
				echo '<span class="indexing-log indexing-failed"></span><code>' . esc_html( $google_response['error']['code'] ) . ' - ' . esc_html( $google_response['error']['message'] ) . '</code>';
			} else {
				?>
				<p><span class="indexing-log indexing-done"></span><code><?php esc_attr_e( 'URLs submitted successfully', 'wp-seopress' ); ?></code></p>
				<ul>
					<?php
					foreach ( $google_response as $result ) {
						if ( $result ) {
							if ( ! empty( $result->urlNotificationMetadata->latestUpdate['url'] ) || ! empty( $result->urlNotificationMetadata->latestUpdate['type'] ) ) {
								echo '<li>';
							}
							if ( ! empty( $result->urlNotificationMetadata->latestUpdate['url'] ) ) {
								echo esc_url( $result->urlNotificationMetadata->latestUpdate['url'] );
							}
							if ( ! empty( $result->urlNotificationMetadata->latestUpdate['type'] ) ) {
								echo ' - ';
								echo '<code>' . esc_html( $result->urlNotificationMetadata->latestUpdate['type'] ) . '</code>';
							}
							if ( ! empty( $result->urlNotificationMetadata->latestUpdate['url'] ) || ! empty( $result->urlNotificationMetadata->latestUpdate['type'] ) ) {
								echo '</li>';
							}
							if ( ! empty( $result->urlNotificationMetadata->latestRemove['url'] ) || ! empty( $result->urlNotificationMetadata->latestRemove['type'] ) ) {
								echo '<li>';
							}
							if ( ! empty( $result->urlNotificationMetadata->latestRemove['url'] ) ) {
								echo esc_url( $result->urlNotificationMetadata->latestRemove['url'] );
							}
							if ( ! empty( $result->urlNotificationMetadata->latestRemove['type'] ) ) {
								echo ' - ';
								echo '<code>' . esc_html( $result->urlNotificationMetadata->latestRemove['type'] ) . '</code>';
							}
							if ( ! empty( $result->urlNotificationMetadata->latestRemove['url'] ) || ! empty( $result->urlNotificationMetadata->latestRemove['type'] ) ) {
								echo '</li>';
							}
						}
					}
					?>
				</ul>
			<?php } ?>
		</div>
		<?php
	}
	?>

	<h4><?php esc_attr_e( 'Latest URLs submitted', 'wp-seopress' ); ?></h4>
	<?php if ( ! empty( $urls[0] ) ) { ?>
		<ul>
		<?php foreach ( $urls as $url ) { ?>
			<li>
				<?php echo esc_url( $url ); ?>
			</li>
		<?php } ?>
		</ul>
		<?php
	} else {
		esc_attr_e( 'None', 'wp-seopress' );
	}
}

/**
 * Print the instant indexing google api key callback.
 */
function seopress_instant_indexing_google_api_key_callback() {
	$docs    = function_exists( 'seopress_get_docs_links' ) ? seopress_get_docs_links() : '';
	$options = get_option( 'seopress_instant_indexing_option_name' );
	$check   = isset( $options['seopress_instant_indexing_google_api_key'] ) ? esc_attr( $options['seopress_instant_indexing_google_api_key'] ) : null;

	printf(
		'<textarea id="seopress_instant_indexing_google_api_key" name="seopress_instant_indexing_option_name[seopress_instant_indexing_google_api_key]" rows="12" placeholder="' . esc_html__( 'Paste your Google JSON key file here', 'wp-seopress' ) . '" aria-label="' . esc_attr__( 'Paste your Google JSON key file here', 'wp-seopress' ) . '">%s</textarea>',
		esc_html( $check )
	);
	?>

<p class="seopress-help description"><?php /* translators: %1$s documentation URL, %2$s documentation URL */ printf( wp_kses_post( __( 'To use the <a href="%1$s" target="_blank">Google Indexing API</a><span class="dashicons dashicons-external"></span> and generate your JSON key file, please <a href="%2$s" target="_blank">follow our guide</a><span class="dashicons dashicons-external"></span>.', 'wp-seopress' ) ), esc_url( $docs['indexing_api']['api'] ), esc_url( $docs['indexing_api']['google'] ) ); ?></p>

	<?php
}

/**
 * Print the instant indexing bing api key callback.
 */
function seopress_instant_indexing_bing_api_key_callback() {
	$options = get_option( 'seopress_instant_indexing_option_name' );
	$check   = isset( $options['seopress_instant_indexing_bing_api_key'] ) ? esc_attr( $options['seopress_instant_indexing_bing_api_key'] ) : null;
	?>

	<input type="text" id="seopress_instant_indexing_bing_api_key" name="seopress_instant_indexing_option_name[seopress_instant_indexing_bing_api_key]"
	placeholder="<?php esc_html_e( 'Enter your Bing Instant Indexing API', 'wp-seopress' ); ?>"
	aria-label="<?php esc_attr_e( 'Enter your Bing Instant Indexing API', 'wp-seopress' ); ?>"
	value="<?php echo esc_attr( $check ); ?>" />

	<button type="button" class="seopress-instant-indexing-refresh-api-key btn btnSecondary"><?php esc_attr_e( 'Generate key', 'wp-seopress' ); ?></button>

	<p class="description"><?php esc_attr_e( 'The Bing Indexing API key is automatically generated. Click Generate key if you want to recreate it, or if it\'s missing.', 'wp-seopress' ); ?></p>
	<p class="description"><?php esc_attr_e( 'A key should look like this: ', 'wp-seopress' ); ?><code>ZjA2NWI3ZWM3MmNhNDRkODliYmY0YjljMzg5YTk2NGE=</code></p>
	<?php
}

/**
 * Print the instant indexing automate submission callback.
 */
function seopress_instant_indexing_automate_submission_callback() {
	$options = get_option( 'seopress_instant_indexing_option_name' );

	$check = isset( $options['seopress_instant_indexing_automate_submission'] ) ? $options['seopress_instant_indexing_automate_submission'] : null;
	?>

	<label for="seopress_instant_indexing_automate_submission">
		<input id="seopress_instant_indexing_automate_submission" name="seopress_instant_indexing_option_name[seopress_instant_indexing_automate_submission]" type="checkbox"
		<?php
		if ( '1' === $check ) {
			echo 'checked="yes"';
		}
		?>
		value="1"/>
		<?php esc_attr_e( 'Enable automatic URL submission for IndexNow API', 'wp-seopress' ); ?>
	</label>

	<p class="description">
		<?php esc_attr_e( 'Notify search engines using IndexNow protocol (currently Bing and Yandex) whenever a post is created, updated or deleted.', 'wp-seopress' ); ?>
	</p>

	<?php
	if ( isset( $options['seopress_instant_indexing_automate_submission'] ) ) {
		esc_attr( $options['seopress_instant_indexing_automate_submission'] );
	}
}
