<?php
/**
 * Revue Block.
 *
 * @since 8.3.0
 *
 * @package automattic/jetpack
 */

namespace Automattic\Jetpack\Extensions\Revue;

use Automattic\Jetpack\Blocks;
use Jetpack_Gutenberg;

const FEATURE_NAME = 'revue';
const BLOCK_NAME   = 'jetpack/' . FEATURE_NAME;

/**
 * Registers the block for use in Gutenberg
 * This is done via an action so that we can disable
 * registration if we need to.
 */
function register_block() {
	Blocks::jetpack_register_block(
		BLOCK_NAME,
		array( 'render_callback' => __NAMESPACE__ . '\render_block' )
	);
}
add_action( 'init', __NAMESPACE__ . '\register_block' );

/**
 * Revue block render callback.
 *
 * @param array  $attributes Array containing the Revue block attributes.
 * @param string $content    The Revue block content.
 *
 * @return string
 */
function render_block( $attributes, $content ) {
	if ( ! array_key_exists( 'revueUsername', $attributes ) ) {
		return '';
	}

	$email_label            = get_revue_attribute( 'emailLabel', $attributes );
	$email_placeholder      = get_revue_attribute( 'emailPlaceholder', $attributes );
	$first_name_label       = get_revue_attribute( 'firstNameLabel', $attributes );
	$first_name_placeholder = get_revue_attribute( 'firstNamePlaceholder', $attributes );
	$first_name_show        = get_revue_attribute( 'firstNameShow', $attributes );
	$last_name_label        = get_revue_attribute( 'lastNameLabel', $attributes );
	$last_name_placeholder  = get_revue_attribute( 'lastNamePlaceholder', $attributes );
	$last_name_show         = get_revue_attribute( 'lastNameShow', $attributes );
	$url                    = sprintf( 'https://www.getrevue.co/profile/%s/add_subscriber', $attributes['revueUsername'] );
	$base_class             = Blocks::classes( FEATURE_NAME, array() ) . '__';
	$classes                = Blocks::classes( FEATURE_NAME, $attributes );

	Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );

	ob_start();
	?>

<div class="<?php echo esc_attr( $classes ); ?>">
	<form
		action="<?php echo esc_url( $url ); ?>"
		class="<?php echo esc_attr( $base_class . 'form is-visible' ); ?>"
		method="post"
		name="revue-form"
		target="_blank"
	>
		<div>
			<label>
				<?php echo esc_html( $email_label ); ?>
				<span class="required"><?php esc_html_e( '(required)', 'jetpack' ); ?></span>
				<input
					class="<?php echo esc_attr( $base_class . 'email' ); ?>"
					name="member[email]"
					placeholder="<?php echo esc_attr( $email_placeholder ); ?>"
					required
					type="email"
				/>
			</label>
		</div>
		<?php if ( $first_name_show ) : ?>
			<div>
				<label>
					<?php echo esc_html( $first_name_label ); ?>
					<input
						class="<?php echo esc_attr( $base_class . 'first-name' ); ?>"
						name="member[first_name]"
						placeholder="<?php echo esc_attr( $first_name_placeholder ); ?>"
						type="text"
					/>
				</label>
			</div>
			<?php
			endif;
		if ( $last_name_show ) :
			?>
			<div>
				<label>
					<?php echo esc_html( $last_name_label ); ?>
					<input
						class="<?php echo esc_attr( $base_class . 'last-name' ); ?>"
						name="member[last_name]"
						placeholder="<?php echo esc_attr( $last_name_placeholder ); ?>"
						type="text"
					/>
				</label>
			</div>
			<?php
		endif;

		// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
		if ( false !== strpos( $content, 'wp-block-jetpack-revue__fallback' ) ) {
			echo $content;
		} else {
			echo get_deprecated_v1_revue_button( $attributes );
		}
		// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
		?>
	</form>
	<div class="<?php echo esc_attr( $base_class . 'message' ); ?>">
		<p>
			<strong><?php esc_html_e( 'Subscription received!', 'jetpack' ); ?></strong>
		</p>
		<p>
			<?php esc_html_e( 'Please check your email to confirm your newsletter subscription.', 'jetpack' ); ?>
		</p>
	</div>
</div>

	<?php
	return ob_get_clean();
}

/**
 * Get Revue block attribute.
 *
 * @param string $attribute  String containing the attribute name to get.
 * @param array  $attributes Array containing the Revue block attributes.
 *
 * @return mixed
 */
function get_revue_attribute( $attribute, $attributes ) {
	if ( array_key_exists( $attribute, $attributes ) ) {
		return $attributes[ $attribute ];
	}

	$default_attributes = array(
		'text'                 => __( 'Subscribe', 'jetpack' ),
		'emailLabel'           => __( 'Email address', 'jetpack' ),
		'emailPlaceholder'     => __( 'Enter your email address', 'jetpack' ),
		'firstNameLabel'       => __( 'First name', 'jetpack' ),
		'firstNamePlaceholder' => __( 'Enter your first name', 'jetpack' ),
		'firstNameShow'        => true,
		'lastNameLabel'        => __( 'Last name', 'jetpack' ),
		'lastNamePlaceholder'  => __( 'Enter your last name', 'jetpack' ),
		'lastNameShow'         => true,
	);

	if ( array_key_exists( $attribute, $default_attributes ) ) {
		return $default_attributes[ $attribute ];
	}
}

/**
 * DEPRECATED V1
 */

/**
 * Create the Revue subscribe button.
 *
 * @param array $attributes Array containing the Revue block attributes.
 *
 * @return string
 */
function get_deprecated_v1_revue_button( $attributes ) {
	$classes = array( 'wp-block-button__link' );
	$styles  = array();

	$text                        = get_revue_attribute( 'text', $attributes );
	$has_class_name              = array_key_exists( 'className', $attributes );
	$has_named_text_color        = array_key_exists( 'textColor', $attributes );
	$has_custom_text_color       = array_key_exists( 'customTextColor', $attributes );
	$has_named_background_color  = array_key_exists( 'backgroundColor', $attributes );
	$has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
	$has_named_gradient          = array_key_exists( 'gradient', $attributes );
	$has_custom_gradient         = array_key_exists( 'customGradient', $attributes );
	$has_border_radius           = array_key_exists( 'borderRadius', $attributes );

	if ( $has_class_name ) {
		$classes[] = $attributes['className'];
	}

	if ( $has_named_text_color || $has_custom_text_color ) {
		$classes[] = 'has-text-color';
	}
	if ( $has_named_text_color ) {
		$classes[] = sprintf( 'has-%s-color', $attributes['textColor'] );
	} elseif ( $has_custom_text_color ) {
		$styles[] = sprintf( 'color: %s;', $attributes['customTextColor'] );
	}

	if (
		$has_named_background_color ||
		$has_custom_background_color ||
		$has_named_gradient ||
		$has_custom_gradient
	) {
		$classes[] = 'has-background';
	}
	if ( $has_named_background_color && ! $has_custom_gradient ) {
		$classes[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
	}
	if ( $has_named_gradient ) {
		$classes[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
	} elseif ( $has_custom_gradient ) {
		$styles[] = sprintf( 'background: %s;', $attributes['customGradient'] );
	}
	if (
		$has_custom_background_color &&
		! $has_named_background_color &&
		! $has_named_gradient &&
		! $has_custom_gradient
	) {
		$styles[] = sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
	}

	if ( $has_border_radius ) {
		// phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
		if ( 0 == $attributes['borderRadius'] ) {
			$classes[] = 'no-border-radius';
		} else {
			$styles[] = sprintf( 'border-radius: %spx;', $attributes['borderRadius'] );
		}
	}

	ob_start();
	?>

<div class="wp-block-button">
	<button
		class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>"
		name="member[subscribe]"
		style="<?php echo esc_attr( implode( ' ', $styles ) ); ?>"
		type="submit"
	>
		<?php echo wp_kses_post( $text ); ?>
	</button>
</div>

	<?php
	return ob_get_clean();
}
