<?php
add_action( 'rest_api_init', function () {
	register_rest_route( 'bw/v1', '/testimonials', array(
		'methods' => 'GET',
		'callback' => function ( $request ) {
			$params = $request->get_params();
			$posts_per_page = isset( $params['posts_per_page'] ) ? intval( $params['posts_per_page'] ) : -1;

			$query = new WP_Query( array(
				'post_type' => 'testimonial',
				'posts_per_page' => $posts_per_page
			) );

			$testimonials = array();
			if ( $query->have_posts() ) {
				while ( $query->have_posts() ) {
					$query->the_post();
					$testimonial = array();

					$testimonial['title'] = get_the_title();
					$testimonial['excerpt'] = get_the_excerpt();
					$testimonial['headline'] = get_post_meta( get_the_ID(), 'headline', true );
					$testimonial['summary'] = get_post_meta( get_the_ID(), 'summary', true );
					$testimonial['content'] = get_post_meta( get_the_ID(), 'content', true );
					$testimonial['author'] = get_post_meta( get_the_ID(), 'author', true );
					$testimonial['company'] = get_post_meta( get_the_ID(), 'company', true );
					$testimonial['image'] = get_the_post_thumbnail_url();

					$testimonials[] = $testimonial;
				}
				wp_reset_postdata();
			}
			return rest_ensure_response( $testimonials );
		},
	) );
} );

add_action( 'init', function () {

	// testimonail post type

	register_post_type('testimonial',
		array(
			'labels' => array(
				'name'          => __( 'Testimonials', 'bw' ),
				'singular_name' => __( 'Testimonial', 'bw' ),
			),
			'public'      => true,
			'has_archive' => true,
			'menu_icon'   => 'dashicons-format-quote'
		)
	);


	// meta

	register_post_meta( 'testimonial', 'headline', array(
		'show_in_rest' => true,
		'single' => true,
		'type' => 'string',
	) );

	register_post_meta( 'testimonial', 'summary', array(
		'show_in_rest' => true,
		'single' => true,
		'type' => 'string',
	) );

	register_post_meta( 'testimonial', 'content', array(
		'show_in_rest' => true,
		'single' => true,
		'type' => 'string',
	) );

	register_post_meta( 'testimonial', 'author', array(
		'show_in_rest' => true,
		'single' => true,
		'type' => 'string',
	) );

	register_post_meta( 'testimonial', 'company', array(
		'show_in_rest' => true,
		'single' => true,
		'type' => 'string',
	) );


	// testimonial block template

	$post_type_object = get_post_type_object( 'testimonial' );
	$post_type_object->template = array(
		array( 'bw/testimonials-meta-block' ),
	);


	// assets

	$view_asset_settings = include get_stylesheet_directory() . '/build/blocks/testimonials-slider/view/index.asset.php';
	wp_register_script(
		'bw-testimonials-slider',
		get_stylesheet_directory_uri() . '/build/blocks/testimonials-slider/view/index.js',
		$view_asset_settings['dependencies'],
		$view_asset_settings['version'],
		array(
			'in_footer' => true
		)
	);
	
	$asset_settings = include get_stylesheet_directory() . '/build/blocks/testimonials-slider/index.asset.php';
	wp_register_style(
		'bw-testimonials-slider',
		get_stylesheet_directory_uri() . '/build/blocks/testimonials-slider/view/index.css',
		array(),
		$asset_settings['version']
	);


	// blocks

	register_block_type( get_stylesheet_directory() . '/build/blocks/testimonial-meta' );

	register_block_type(
		get_stylesheet_directory() . '/build/blocks/testimonials-slider',
		array(
			'render_callback' => function ( $block_attributes, $content ) {
				if ( ! isset( $block_attributes['blockId'] ) ) return '';
				$id = str_replace( '-', '', $block_attributes['blockId'] );
				wp_enqueue_script( 'bw-testimonials-slider' );
				wp_enqueue_style( 'bw-testimonials-slider' );

				$query = new WP_Query( array(
					'post_type' => 'testimonial',
					'posts_per_page' => $block_attributes['numberSlides']
				) );

				$testimonials = array();
				if ( $query->have_posts() ) {
					while ( $query->have_posts() ) {
						$query->the_post();
						$testimonial = array();

						$testimonial['title'] = get_the_title();
						$testimonial['excerpt'] = get_the_excerpt();
						$testimonial['headline'] = get_post_meta( get_the_ID(), 'headline', true );
						$testimonial['summary'] = get_post_meta( get_the_ID(), 'summary', true );
						$testimonial['content'] = get_post_meta( get_the_ID(), 'content', true );
						$testimonial['author'] = get_post_meta( get_the_ID(), 'author', true );
						$testimonial['company'] = get_post_meta( get_the_ID(), 'company', true );
						$testimonial['image'] = get_the_post_thumbnail_url();

						$testimonials[] = $testimonial;
					}
					wp_reset_postdata();
				}

				$block_attributes['testimonials'] = $testimonials;

				wp_localize_script( 'bw-testimonials-slider', 'bw_block_' . $id, $block_attributes );
				return sprintf('<div id="%s" class="bw-testimonials-slider-block"></div>', $id );
			},
		)
	);
} );

add_action( 'load-post.php', 'bw_testimonial_meta_boxes_setup' );
add_action( 'load-post-new.php', 'bw_testimonial_meta_boxes_setup' );

function bw_testimonial_meta_boxes_setup () {
	add_action( 'add_meta_boxes', 'bw_add_testimonial_meta_boxes' );
	add_action( 'save_post', 'bw_save_testimonial_meta', 10, 2 );
}

function bw_add_testimonial_meta_boxes () {

	add_meta_box(
		'bw-testimonial-headline',
		esc_html__( 'Testimonial Headline', 'bw' ),
		'bw_testimonial_headline_meta_box',
		'testimonial',
		'advanced',
		'default'
	);

	add_meta_box(
		'bw-testimonial-summary',
		esc_html__( 'Testimonial Summary', 'bw' ),
		'bw_testimonial_summary_meta_box',
		'testimonial',
		'advanced',
		'default'
	);

	add_meta_box(
		'bw-testimonial-content',
		esc_html__( 'Testimonial Content', 'bw' ),
		'bw_testimonial_content_meta_box',
		'testimonial',
		'advanced',
		'default'
	);

	add_meta_box(
		'bw-testimonial-author',
		esc_html__( 'Testimonial Author', 'bw' ),
		'bw_testimonial_author_meta_box',
		'testimonial',
		'advanced',
		'default'
	);

	add_meta_box(
		'bw-testimonial-company',
		esc_html__( 'Testimonial Company', 'bw' ),
		'bw_testimonial_company_meta_box',
		'testimonial',
		'advanced',
		'default'
	);
}

function bw_testimonial_headline_meta_box ( $post ) {
	wp_nonce_field( basename( __FILE__ ), 'bw_testimonial_headline_nonce' );
	?>

	<p>
		<input
			class="widefat"
			type="text"
			name="bw-testimonial-headline"
			id="bw-testimonial-headline"
			value="<?php echo esc_attr( get_post_meta( $post->ID, 'headline', true ) ); ?>"
			size="30"
		/>
	</p>
	<?php
}

function bw_testimonial_summary_meta_box ( $post ) {
	wp_nonce_field( basename( __FILE__ ), 'bw_testimonial_summary_nonce' );
	?>

	<p>
		<textarea
			class="widefat"
			name="bw-testimonial-summary"
			id="bw-testimonial-summary"
			size="30"
			rows="8"
		><?php echo esc_attr( get_post_meta( $post->ID, 'summary', true ) ); ?></textarea>
	</p>
	<?php
}

function bw_testimonial_content_meta_box ( $post ) {
	wp_nonce_field( basename( __FILE__ ), 'bw_testimonial_content_nonce' );
	?>

	<p>
		<textarea
			class="widefat"
			name="bw-testimonial-content"
			id="bw-testimonial-content"
			size="30"
			rows="8"
		><?php echo esc_attr( get_post_meta( $post->ID, 'content', true ) ); ?></textarea>
	</p>
	<?php
}

function bw_testimonial_author_meta_box ( $post ) {
	wp_nonce_field( basename( __FILE__ ), 'bw_testimonial_author_nonce' );
	?>

	<p>
		<input
			class="widefat"
			type="text"
			name="bw-testimonial-author"
			id="bw-testimonial-author"
			value="<?php echo esc_attr( get_post_meta( $post->ID, 'author', true ) ); ?>"
			size="30"
		/>
	</p>
	<?php
}

function bw_testimonial_company_meta_box ( $post ) {
	wp_nonce_field( basename( __FILE__ ), 'bw_testimonial_company_nonce' );
	?>

	<p>
		<input
			class="widefat"
			type="text"
			name="bw-testimonial-company"
			id="bw-testimonial-company"
			value="<?php echo esc_attr( get_post_meta( $post->ID, 'company', true ) ); ?>"
			size="30"
		/>
	</p>
	<?php
}

function bw_save_testimonial_meta ( $post_id, $post ) {
	$post_type = get_post_type_object( $post->post_type );

	if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) {
		return $post_id;
	}

	
	if ( isset( $_POST['bw_testimonial_headline_nonce'] ) && wp_verify_nonce( $_POST['bw_testimonial_headline_nonce'], basename( __FILE__ ) ) ) {
		$new_meta_value = ( isset( $_POST['bw-testimonial-headline'] ) ? $_POST['bw-testimonial-headline'] : '' );
		$meta_key = 'headline';
		$meta_value = get_post_meta( $post_id, $meta_key, true );

		if ( $new_meta_value && '' == $meta_value ) {
			add_post_meta( $post_id, $meta_key, $new_meta_value, true );
		} elseif ( $new_meta_value && $new_meta_value != $meta_value ) {
			update_post_meta( $post_id, $meta_key, $new_meta_value );
		} elseif ( '' == $new_meta_value && $meta_value ) {
			delete_post_meta( $post_id, $meta_key, $meta_value );
		}
	}

	
	if ( isset( $_POST['bw_testimonial_summary_nonce'] ) && wp_verify_nonce( $_POST['bw_testimonial_summary_nonce'], basename( __FILE__ ) ) ) {
		$new_meta_value = ( isset( $_POST['bw-testimonial-summary'] ) ? $_POST['bw-testimonial-summary'] : '' );
		$meta_key = 'summary';
		$meta_value = get_post_meta( $post_id, $meta_key, true );

		if ( $new_meta_value && '' == $meta_value ) {
			add_post_meta( $post_id, $meta_key, $new_meta_value, true );
		} elseif ( $new_meta_value && $new_meta_value != $meta_value ) {
			update_post_meta( $post_id, $meta_key, $new_meta_value );
		} elseif ( '' == $new_meta_value && $meta_value ) {
			delete_post_meta( $post_id, $meta_key, $meta_value );
		}
	}

	
	if ( isset( $_POST['bw_testimonial_content_nonce'] ) && wp_verify_nonce( $_POST['bw_testimonial_content_nonce'], basename( __FILE__ ) ) ) {
		$new_meta_value = ( isset( $_POST['bw-testimonial-content'] ) ? $_POST['bw-testimonial-content'] : '' );
		$meta_key = 'content';
		$meta_value = get_post_meta( $post_id, $meta_key, true );

		if ( $new_meta_value && '' == $meta_value ) {
			add_post_meta( $post_id, $meta_key, $new_meta_value, true );
		} elseif ( $new_meta_value && $new_meta_value != $meta_value ) {
			update_post_meta( $post_id, $meta_key, $new_meta_value );
		} elseif ( '' == $new_meta_value && $meta_value ) {
			delete_post_meta( $post_id, $meta_key, $meta_value );
		}
	}

	
	if ( isset( $_POST['bw_testimonial_author_nonce'] ) && wp_verify_nonce( $_POST['bw_testimonial_author_nonce'], basename( __FILE__ ) ) ) {
		$new_meta_value = ( isset( $_POST['bw-testimonial-author'] ) ? $_POST['bw-testimonial-author'] : '' );
		$meta_key = 'author';
		$meta_value = get_post_meta( $post_id, $meta_key, true );

		if ( $new_meta_value && '' == $meta_value ) {
			add_post_meta( $post_id, $meta_key, $new_meta_value, true );
		} elseif ( $new_meta_value && $new_meta_value != $meta_value ) {
			update_post_meta( $post_id, $meta_key, $new_meta_value );
		} elseif ( '' == $new_meta_value && $meta_value ) {
			delete_post_meta( $post_id, $meta_key, $meta_value );
		}
	}

	
	if ( isset( $_POST['bw_testimonial_company_nonce'] ) && wp_verify_nonce( $_POST['bw_testimonial_company_nonce'], basename( __FILE__ ) ) ) {
		$new_meta_value = ( isset( $_POST['bw-testimonial-company'] ) ? $_POST['bw-testimonial-company'] : '' );
		$meta_key = 'company';
		$meta_value = get_post_meta( $post_id, $meta_key, true );

		if ( $new_meta_value && '' == $meta_value ) {
			add_post_meta( $post_id, $meta_key, $new_meta_value, true );
		} elseif ( $new_meta_value && $new_meta_value != $meta_value ) {
			update_post_meta( $post_id, $meta_key, $new_meta_value );
		} elseif ( '' == $new_meta_value && $meta_value ) {
			delete_post_meta( $post_id, $meta_key, $meta_value );
		}
	}
}
