<?php
function bw_posts ($args) {
	$args = wp_parse_args($args, array(
		'layout' => 'default',
		'post_type' => 'post',
		'posts_per_page' => 9,
		'paged' => 1,
		's' => false,
		'taxonomy' => false,
		'meta' => false,
		'orderby' => false
	));

	$layout = preg_replace('/[^\w\-]+/', '_', $args['layout']);

	$query_args = array(
		'post_type' => $args['post_type'],
		'posts_per_page' => $args['posts_per_page'],
		'paged' => $args['paged'],
	);

	if (!empty($args['taxonomy']) && is_array($args['taxonomy'])) {
		$query_args['tax_query'] = array();
		if (count($args['taxonomy']) > 1) $query_args['tax_query']['relation'] = 'AND';
		foreach ($args['taxonomy'] as $taxonomy => $terms) {
			$query_args['tax_query'][] = array(
				'taxonomy' => $taxonomy,
				'field'    => 'term_id',
				'terms'    => $terms
			);
		}
	}

	if (!empty($args['meta']) && is_array($args['meta'])) {
		$query_args['meta_query'] = array();
		if (count($args['meta']) > 1) $query_args['meta_query']['relation'] = 'AND';
		foreach ($args['meta'] as $key => $value) {
			if (is_array($value)) {
				$query_args['meta_query']["{$key}_clause"] = $value;
			} else {
				$query_args['meta_query']["{$key}_clause"] = array(
					'key'   => $key,
					'value' => $value
				);
			}
		}
	}

	if (!empty($args['s'])) {
		$query_args['s'] = $args['s'];
		$query_args['orderby'] = 'relevance';
	} else if (!empty($args['orderby']) && is_array($args['orderby'])) {
		$query_args['orderby'] = array();
		foreach ($args['orderby'] as $index => $order) {
			if (!is_array($order)) $order = array(
				'key' => $order,
				'value' => 'ASC'
			);
			if (!empty($order['is_meta']) && empty($query_args['meta_query']["$order[key]_clause"])) {
				$query_args['meta_query']["$order[key]_clause"] = array(
					'key'   => $order['key'],
					'compare' => 'EXISTS'
				);
				$order['key'] = "$order[key]_clause";
			}
			$query_args['orderby'][$order['key']] = $order['order'];
		}
	}

	$data = new stdClass();

	$data->args = $args;
	$data->query = $query_args;

	add_action( 'pre_get_posts', 'bw_stickies_first');

	$results = new WP_Query($query_args);

	$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;
}


function bw_posts_request ($request) {
	$args = array();

	if (!empty($request->get_param('layout'))) {
		$args['layout'] = $request->get_param('layout');
	}

	if (!empty($request->get_param('post_type'))) {
		$args['post_type'] = $request->get_param('post_type');
	}

	if (is_numeric($request->get_param('posts_per_page'))) {
		$args['posts_per_page'] = intval($request->get_param('posts_per_page'));
	}

	if (is_numeric($request->get_param('paged'))) {
		$args['paged'] = intval($request->get_param('paged'));
	}

	if (is_string($request->get_param('s'))) {
		$args['s'] = $request->get_param('s');
	}

	if (is_array($request->get_param('taxonomy'))) {
		$args['taxonomy'] = $request->get_param('taxonomy');
	}

	if (is_array($request->get_param('meta'))) {
		$args['meta'] = $request->get_param('meta');
	}

	if (is_array($request->get_param('orderby'))) {
		$args['orderby'] = $request->get_param('orderby');
	}

	return bw_posts($args);
}

// register api route
add_action('rest_api_init', function () {
	register_rest_route('bw', '/postgrid/posts', array(
		'methods' => 'POST',
		'callback' => 'bw_posts_request',
		'permission_callback' => '__return_true'
	));
});

function bw_stickies_first ( $q ) {
	remove_action( 'pre_get_posts', 'bw_stickies_first' );
	$query = $q->query_vars;
	$q->is_home = true;

	// Get all stickies
	$stickies = get_option( 'sticky_posts' );
	// Make sure we have stickies, if not, bail
	if ( !$stickies )
		return;

	// Query the stickies according to category

	$query['posts_per_page'] = -1;
	$query['ignore_sticky_posts'] = 1;
	$query['post__in'] = $stickies;
	$query['orderby'] = 'post__in';
	$query['order'] = 'ASC';
	$query['fields'] = 'ids';

	$valid_sticky_ids = get_posts( $query );

	// Make sure we have valid ids
	if ( !$valid_sticky_ids ) {
		$q->set( 'post__not_in', $stickies );
		return;
	}

	// Remove these ids from the sticky posts array
	$invalid_ids = array_diff( $stickies, $valid_sticky_ids );

	// Check if we still have ids left in $invalid_ids
	if ( !$invalid_ids )
		return;

	// Lets remove these invalid ids from our query
	$q->set( 'post__not_in', $invalid_ids );
}