<?php
// gets posts for the post grid
function bw_posts ($args) {
	$args = wp_parse_args($args, array(
		'layout' => 'default',
		'post_type' => 'post',
		'posts_per_page' => 9,
		'taxonomy' => false,
		'meta' => false,
		'paged' => 1,
		'element_id' => false,
		's' => false
	));
	$query = array(
		'post_type' => $args['post_type'],
		'posts_per_page' => $args['posts_per_page'],
		'paged' => $args['paged'],
		'orderby' => array(
			'date' => 'DESC',
			'menu_order' => 'ASC'
		)
	);
	$element_id = $args['element_id'];
	$layout = preg_replace('/[^\w\-]+/', '_', $args['layout']);

	if (!empty($args['taxonomy']) && is_array($args['taxonomy'])) {
		$query['tax_query'] = array();
		if (count($args['taxonomy']) > 1) $query['tax_query']['relation'] = 'AND';
		foreach ($args['taxonomy'] as $taxonomy => $terms) {
			$query['tax_query'][] = array(
				'taxonomy' => $taxonomy,
				'field'    => 'term_id',
				'terms'    => $terms
			);
		}
	}

	if (!empty($args['meta']) && is_array($args['meta'])) {
		$query['meta_query'] = array();
		if (count($args['meta']) > 1) $query['meta_query']['relation'] = 'AND';
		foreach ($args['meta'] as $key => $value) {
			if (is_array($value)) {
				$query['meta_query']["{$key}_clause"] = $value;
			} else {
				$query['meta_query']["{$key}_clause"] = array(
					'key'   => $key,
					'value' => $value
				);
			}
		}
	}

	$data = new stdClass();

	$data->args = $args;
	$data->query = $query;

	$results = new WP_Query($query);
	$data->found_posts = $results->found_posts;
	$data->posts = array();
	while ($results->have_posts()) {
		$results->the_post();
		ob_start();
		if ( file_exists( get_stylesheet_directory() . "/acf-blocks/bw-post-grid/layouts/{$layout}/post-grid-item-template.php" ) ) {
			include get_stylesheet_directory() . "/acf-blocks/bw-post-grid/layouts/{$layout}/post-grid-item-template.php";
		} else {
			include get_stylesheet_directory() . "/acf-blocks/bw-post-grid/layouts/default/post-grid-item-template.php";
		}
		$data->posts[] = preg_replace('/[\r\n\t]+/', '', ob_get_clean());
	}
	wp_reset_query();

	return $data;
}

// endpoint for getting additional posts
function bw_posts_request ($request) {
	$args = array();

	$layout = $request->get_param('layout');
	if (!empty($layout)) $args['layout'] = $layout;

	$post_type = $request->get_param('post_type');
	if (!empty($post_type)) $args['post_type'] = $post_type;

	$posts_per_page = $request->get_param('posts_per_page');
	if (is_numeric($posts_per_page)) $args['posts_per_page'] = intval($posts_per_page);

	$taxonomy = $request->get_param('taxonomy');
	if (is_array($taxonomy)) $args['taxonomy'] = $taxonomy;

	$meta = $request->get_param('meta');
	if (is_array($meta)) $args['meta'] = $meta;

	$orderby = $request->get_param('orderby');
	if (is_array($orderby)) $args['orderby'] = $orderby;

	$paged = $request->get_param('paged');
	if (is_numeric($paged)) $args['paged'] = intval($paged);
	
	$element_id = $request->get_param('element_id');
	if (is_numeric($element_id)) $args['element_id'] = intval($element_id);

	$s = $request->get_param('s');
	if (is_string($s)) $args['s'] = $s;

	return bw_posts($args);
}

// register endpoint for getting additional posts
add_action('rest_api_init', function () {
	register_rest_route('bw', '/posts', array(
		'methods' => 'POST',
		'callback' => 'bw_posts_request',
		'permission_callback' => '__return_true'
	));
});

// prints a select field for filtering taxonomy
function bw_post_grid_taxonomy_filter_select($taxonomy, $placeholder = '- Any -') {
	$terms = get_terms(array('taxonomy' => $taxonomy));
	?>
		<select name="<?php echo $taxonomy; ?>-select" class="bw-filter" data-filter-taxonomy="<?php echo $taxonomy; ?>">
			<option value=""><?php echo $placeholder; ?></option>
			<?php foreach ($terms as $term) : ?>
				<option value="<?php echo $term->term_id; ?>"><?php echo $term->name; ?></option>
			<?php endforeach; ?>
		</select>
	<?php
}
