<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

if ( ! class_exists( 'ACF_Location' ) ) :

	abstract class ACF_Location extends ACF_Legacy_Location {

		/**
		 * The location rule name.
		 *
		 * @since 5.9.0
		 * @var string
		 */
		public $name = '';

		/**
		 * The location rule label.
		 *
		 * @since 5.9.0
		 * @var string
		 */
		public $label = '';

		/**
		 * The location rule category.
		 *
		 * Accepts "post", "page", "user", "forms" or a custom label.
		 *
		 * @since 5.9.0
		 * @var string
		 */
		public $category = 'post';

		/**
		 * Whether or not the location rule is publicly accessible.
		 *
		 * @since 5.0.0
		 * @var bool
		 */
		public $public = true;

		/**
		 * The object type related to this location rule.
		 *
		 * Accepts an object type discoverable by `acf_get_object_type()`.
		 *
		 * @since 5.9.0
		 * @var string
		 */
		public $object_type = '';

		/**
		 * The object subtype related to this location rule.
		 *
		 * Accepts a custom post type or custom taxonomy.
		 *
		 * @since 5.9.0
		 * @var string
		 */
		public $object_subtype = '';

		/**
		 * Constructor.
		 *
		 * @date    8/4/20
		 * @since   5.9.0
		 *
		 * @param   void
		 * @return  void
		 */
		public function __construct() {
			$this->initialize();

			// Call legacy constructor.
			parent::__construct();
		}

		/**
		 * Initializes props.
		 *
		 * @date    5/03/2014
		 * @since   5.0.0
		 *
		 * @param   void
		 * @return  void
		 */
		public function initialize() {
			// Set props here.
		}

		/**
		 * Returns an array of operators for this location.
		 *
		 * @date    9/4/20
		 * @since   5.9.0
		 *
		 * @param   array $rule A location rule.
		 * @return  array
		 */
		public static function get_operators( $rule ) {
			return array(
				'==' => __( 'is equal to', 'acf' ),
				'!=' => __( 'is not equal to', 'acf' ),
			);
		}

		/**
		 * Returns an array of possible values for this location.
		 *
		 * @date    9/4/20
		 * @since   5.9.0
		 *
		 * @param   array $rule A location rule.
		 * @return  array
		 */
		public function get_values( $rule ) {
			return array();
		}

		/**
		 * Returns the object_type connected to this location.
		 *
		 * @date    1/4/20
		 * @since   5.9.0
		 *
		 * @param   array $rule A location rule.
		 * @return  string
		 */
		public function get_object_type( $rule ) {
			return $this->object_type;
		}

		/**
		 * Returns the object_subtype connected to this location.
		 *
		 * @date    1/4/20
		 * @since   5.9.0
		 *
		 * @param   array $rule A location rule.
		 * @return  string|array
		 */
		public function get_object_subtype( $rule ) {
			return $this->object_subtype;
		}

		/**
		 * Matches the provided rule against the screen args returning a bool result.
		 *
		 * @date    9/4/20
		 * @since   5.9.0
		 *
		 * @param   array $rule The location rule.
		 * @param   array $screen The screen args.
		 * @param   array $field_group The field group settings.
		 * @return  bool
		 */
		public function match( $rule, $screen, $field_group ) {
			return false;
		}

		/**
		 * Compares the given value and rule params returning true when they match.
		 *
		 * @date    17/9/19
		 * @since   5.8.1
		 *
		 * @param   array $rule The location rule data.
		 * @param   mixed $value The value to compare against.
		 * @return  bool
		 */
		public function compare_to_rule( $value, $rule ) {
			$result = ( $value == $rule['value'] );

			// Allow "all" to match any value.
			if ( $rule['value'] === 'all' ) {
				$result = true;
			}

			// Reverse result for "!=" operator.
			if ( $rule['operator'] === '!=' ) {
				return ! $result;
			}
			return $result;
		}
	}

endif; // class_exists check
