<?php
/** API Winners Table Controller
 *
 * @package Bw-Winners-Network
 * @subpackage API
 */

namespace BwWinnersNetwork\API;

if ( ! class_exists( __NAMESPACE__ . '\Brand_List_Controller' ) ) {
	/**
	 * Controller for BwWinnersNetwork Winners Table block routes and endpoints
	 */
	class Brand_List_Controller {

		/**
		 * REST API namespace
		 *
		 * @var string
		 */
		public $namespace;

		/**
		 * Controller's resource name
		 *
		 * @var string
		 */
		public $resource_name;

		/**
		 * Controller's resource route
		 *
		 * @var string
		 */
		public $resource_route;

		/**
		 * Initializes properties and adds hooks.
		 */
		public function __construct() {
			$this->namespace = \BwWinnersNetwork\API_NAMESPACE;

			$this->resource_name = 'brand-list';

			$this->resource_route = '/' . $this->resource_name;

			add_action( 'rest_api_init', [ $this, 'register_routes' ] );
		}


		/**
		 * Registers routes for the Winners Table block
		 */
		public function register_routes() {

			register_rest_route(
				$this->namespace,
				$this->resource_route . '/settings',
				[
					'methods'             => 'GET',
					'callback'            => [ $this, 'block_settings' ],
					'permission_callback' => '__return_true'
				]
			);

			register_rest_route(
				$this->namespace,
				$this->resource_route . '/settings/(?P<global_site_id>\d+)',
				[
					'methods'             => 'GET',
					'callback'            => [ $this, 'block_settings' ],
					'permission_callback' => '__return_true'
				]
			);

			register_rest_route(
				$this->namespace,
				$this->resource_route . '/data',
				[
					'methods'             => 'POST',
					'callback'            => [ $this, 'block_data' ],
					'permission_callback' => '__return_true'
				]
			);
		}

		public function block_settings( $request ) {

			$global_site_id = $request->get_param( 'global_site_id' );

			$response = [
				'settings' => [],
				'select_options' => [],
				'token_suggestions' => []
			];


			// Global site select options

			$plugin_file = 'bw-winners-global-site/bw-winners-global-site.php';
			$global_site_options = [ [
				'label' => ' -- Select a Site -- ',
				'value' => ''
			] ];

			foreach ( get_sites( ['fields' => 'ids'] ) as $site_id ) {
				$active_plugins = get_blog_option( $site_id, 'active_plugins', [] );

				if ( in_array( $plugin_file, $active_plugins, true ) ) {
					$global_site_options[] = [
						'label' => get_blog_option( $site_id, 'blogname' ),
						'value' => $site_id
					];
				}
			}

			$response['select_options']['global_site'] = $global_site_options;


			// Order By options

			$response['select_options']['order_by'] = [
				[
					'label' => ' -- Select a Field --',
					'value' => ''
				],
				[
					'label' => 'Brand Name',
					'value' => 'brand_name'
				]
			];
			

			// Order By options

			$response['select_options']['order'] = [
				[
					'label' => 'Ascending',
					'value' => 'ASC'
				],
				[
					'label' => 'Descending',
					'value' => 'DESC'
				]
			];

			if ( isset( $global_site_id ) ) {

				$options = get_blog_option( $global_site_id, 'bw_winners_v2_options_site' );

				global $wpdb;

				$prefix = $wpdb->get_blog_prefix( $global_site_id );


				// Post tag category filter suggestions

				$results = $wpdb->get_col(
					"SELECT term.name
						FROM {$prefix}terms as term
							INNER JOIN {$prefix}term_taxonomy as term_tax ON term_tax.term_id = term.term_id
						WHERE term_tax.taxonomy = 'post_tag'
						GROUP BY term.name
						ORDER BY term.name"
				);

				if ( ! $wpdb->last_error ) {
					$response['token_suggestions']['post_tag'] = $results;
				} else {
					$response['token_suggestions']['post_tag'] = [];
				}


				// Competition name filter suggestions

				$results = $wpdb->get_col(
					"SELECT name
						FROM {$prefix}bw_winners_v2_competitions
						WHERE name IS NOT NULL
						GROUP BY name
						ORDER BY name"
				);

				if ( ! $wpdb->last_error ) {
					$response['token_suggestions']['competition_name'] = $results;
				} else {
					$response['token_suggestions']['competition_name'] = [];
				}


				// Brand name filter suggestions

				$results = $wpdb->get_col(
					"SELECT name
						FROM {$prefix}bw_winners_v2_brands
						WHERE name IS NOT NULL
						GROUP BY name
						ORDER BY name"
				);

				if ( ! $wpdb->last_error ) {
					$response['token_suggestions']['brand_name'] = $results;
				} else {
					$response['token_suggestions']['brand_name'] = [];
				}

			}

			return rest_ensure_response( $response );
		}

		public function block_data( $request ) {
			$args = $request->get_json_params();

			$query = new \BwWinnersNetwork\Query\Brands_Query( $args );

			return rest_ensure_response( [
				'brands' => $query->get_results(),
				'page' => $query->get_page(),
				'total_pages' => $query->get_total_pages(),
				'query' => $query->get_query(),
				'count_query' => $query->get_count_query()
			] );

		}
	}
}
