<?php
/**
 * Database manager
 */

// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
	die;
}

if ( ! class_exists( 'Jet_Smart_Filters_DB' ) ) {

	/**
	 * Define Jet_Smart_Filters_DB class
	 */
	class Jet_Smart_Filters_DB {

		/**
		 * Tables data
		 */
		public static function tables() {

			global $wpdb;
			$prefix = $wpdb->prefix . 'jet_smart_filters_';

			return array(
				'indexer' => array(
					'name'  => $prefix . 'indexer',
					'query' => "
						id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
						type VARCHAR(50),
						item_id BIGINT UNSIGNED,
						item_query VARCHAR(50),
						item_key VARCHAR(50),
						item_value VARCHAR(100),
						item_value_num DECIMAL(20,6) NULL,
						PRIMARY KEY (id),
						KEY idx_item_id (item_id),
						KEY idx_type_key (type,item_key),
						KEY idx_key_value (item_key,item_value),
						KEY idx_key_num (item_key,item_value_num)
					"
				)
			);
		}

		/**
		 * Get table data
		 */
		public static function get_table( $table_name ) {

			$tables = self::tables();

			return isset( $tables[$table_name] ) ? $tables[$table_name] : false;
		}

		/**
		 * Get table name
		 */
		public static function get_table_full_name( $table_name ) {

			$tables = self::tables();

			return isset( $tables[$table_name]['name'] ) ? $tables[$table_name]['name'] : false;
		}

		/**
		 * Create all tables on activation
		 */
		public static function create_all_tables() {

			global $wpdb;

			$charset_collate = $wpdb->get_charset_collate();

			foreach ( array_keys( self::tables() ) as $table_name ) {
				self::create_table( $table_name );
			}
		}

		/**
		 * Drop all tables on deactivation
		 */
		public static function drop_all_tables() {

			foreach ( array_keys( self::tables() ) as $table_name ) {
				self::drop( $table_name );
			}
		}

		/**
		 * Check if table is exists
		 */
		public static function is_table_exists( $table_name ) {

			global $wpdb;
			$table_full_name = self::get_table_full_name( $table_name );

			if ( ! $table_full_name ) {
				return false;
			}

			$found = $wpdb->get_var( $wpdb->prepare(
				"SHOW TABLES LIKE %s", $table_full_name
			) );

			if ( ! $found ) {
				return false;
			}

			return strtolower( $table_full_name ) === strtolower( $found );
		}

		/**
		 * Create table if allowed
		 */
		public static function create_table( $table_name ) {

			global $wpdb;

			$table = self::get_table( $table_name );

			if ( ! $table ) {
				return;
			}

			$charset_collate = $wpdb->get_charset_collate();

			$sql = "CREATE TABLE " . $table['name'] . " (
				" . $table['query'] . "
			) $charset_collate;";

			require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

			dbDelta( $sql );
		}

		/**
		 * Clear table data
		 */
		public static function clear_table( $table_name ) {

			global $wpdb;
			$table_full_name = self::get_table_full_name( $table_name );

			if ( ! $table_full_name ) {
				return false;
			}

			$wpdb->query( "TRUNCATE TABLE {$table_full_name}" );
		}

		/**
		 * Drop table data
		 */
		public static function drop( $table_name ) {

			global $wpdb;
			$table_full_name = self::get_table_full_name( $table_name );

			if ( ! $table_full_name ) {
				return false;
			}

			$wpdb->query( "DROP TABLE IF EXISTS {$table_full_name}" );
		}
	}
}
