<?php
/**
 * Mixes functions.
 *
 * @package    opalestate
 * @author     Opal  Team <info@wpopal.com >
 */

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

/**
 * Output message json.
 *
 * @param bool   $result
 * @param string $message
 * @param array  $args
 * @param bool   $return
 * @return false|mixed|string|void
 */
function opalestate_output_msg_json( $result = false, $message = '', $args = [], $return = false ) {
	$out          = new stdClass();
	$out->status  = $result;
	$out->message = $message;
	if ( $args ) {
		foreach ( $args as $key => $arg ) {
			$out->$key = $arg;
		}
	}
	if ( $return ) {
		return json_encode( $out );
	} else {
		echo json_encode( $out );
		die;
	}
}

/**
 * Process upload images for properties
 */
function opalesate_upload_image( $submitted_file, $parent_id = 0 ) {
	require_once ABSPATH . 'wp-admin/includes/image.php';
	require_once ABSPATH . 'wp-admin/includes/file.php';
	require_once ABSPATH . 'wp-admin/includes/media.php';

	// Handle PHP uploads in WordPress, sanitizing file names, checking extensions for mime type, and moving the
	// file to the appropriate directory within the uploads directory.
	$uploaded_image = wp_handle_upload( $submitted_file, [ 'test_form' => false ] );

	if ( isset( $uploaded_image['file'] ) ) {
		$file_name = basename( $submitted_file['name'] );
		$file_type = wp_check_filetype( $uploaded_image['file'] );   //Retrieve the file type from the file name.

		// Prepare an array of post data for the attachment.
		$attachment_details = [
			'guid'           => $uploaded_image['url'],
			'post_mime_type' => $file_type['type'],
			'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $file_name ) ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		];

		// This function inserts an attachment into the media library.
		$attach_id = wp_insert_attachment( $attachment_details, $uploaded_image['file'], $parent_id );

		// This function generates metadata for an image attachment.
		// It also creates a thumbnail and other intermediate sizes of the image attachment based on the sizes defined
		$attach_data = wp_generate_attachment_metadata( $attach_id, $uploaded_image['file'] );

		// Update metadata for an attachment.
		wp_update_attachment_metadata( $attach_id, $attach_data );

		$thumbnail_url = opalestate_get_upload_image_url( $attach_data );

		$ajax_response = [
			'success'       => true,
			'url'           => $thumbnail_url,
			'attachment_id' => $attach_id,
		];

		update_post_meta( $attach_id, '_pending_to_use_', 1 );

		return $ajax_response;
	}

	return [];
}

/**
 * Upload an image with data base64 encoded.
 *
 * @param array $file File information (data, file_name, type)
 * @return bool|int|\WP_Error
 */
function opalestate_upload_base64_image( $file, $parent_id = 0 ) {
	// Upload dir.
	$img       = str_replace( ' ', '+', $file['data'] );
	$decoded   = base64_decode( $img );
	$filename  = $file['file_name'];
	$file_type = $file['type'];

	/*
	 * A writable uploads dir will pass this test. Again, there's no point
	 * overriding this one.
	 */
	if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) ) {
		return false;
	}

	$filename = wp_unique_filename( $uploads['path'], $filename );

	// Move the file to the uploads dir.
	$new_file = $uploads['path'] . "/$filename";

	// Save the image in the uploads directory.
	$upload_file = file_put_contents( $new_file, $decoded );

	$attachment = [
		'post_mime_type' => $file_type,
		'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $file['file_name'] ) ),
		'post_content'   => '',
		'post_status'    => 'inherit',
		'guid'           => $uploads['url'] . '/' . basename( $filename ),
	];

	$attach_id = wp_insert_attachment( $attachment, $new_file, $parent_id );

	require_once( ABSPATH . 'wp-admin/includes/image.php' );
	$attach_data = wp_generate_attachment_metadata( $attach_id, $new_file );
	wp_update_attachment_metadata( $attach_id, $attach_data );

	return $attach_id;
}

function opalestate_get_request_viewing_time_list() {
	$range_time = opalestate_get_option( 'request_viewing_time_range', 15 );

	return apply_filters( 'opalestate_request_viewing_time_list', opalestate_get_time_lapses( $range_time ) );
}

/**
 * Gets time lapses.
 */
function opalestate_get_time_lapses( $lapse = 15 ) {

	$output   = [];
	$start    = '12:00AM';
	$end      = '11:59PM';
	$interval = '+' . $lapse . ' minutes';

	$start_str = strtotime( $start );
	$end_str   = strtotime( $end );
	$now_str   = $start_str;

	$time_format_value = 'h:i a';
	$time_format_show  = 'h:i A';

	if ( '24_hour' === opalestate_get_option( 'time_format' ) ) {
		$time_format_value = 'H:i';
		$time_format_show  = 'H:i';
	}

	$time_format_value = apply_filters( 'opalestate_time_lapse_value', $time_format_value );
	$time_format_show  = apply_filters( 'opalestate_time_lapse_show', $time_format_show );

	while ( $now_str <= $end_str ) {
		$output[ date( $time_format_value, $now_str ) ] = date( $time_format_show, $now_str );
		$now_str                                        = strtotime( $interval, $now_str );
	}

	return $output;
}


function is_single_property() {
	global $post;

	$post_type = get_post_type();

	return $post_type == 'opalestate_property' && is_single();
}

function is_single_agent() {
	global $post;

	$post_type = get_post_type();

	return $post_type == 'opalestate_agent' && is_single();
}

function is_single_agency() {
	global $post;

	$post_type = get_post_type();

	return $post_type == 'opalestate_agency' && is_single();
}

/**
 * Gets search form styles.
 *
 * @return array
 */
function opalestate_search_properties_form_styles() {
	return apply_filters( 'opalestate_search_properties_form_styles', [
		'search-form-h'     => esc_html__( 'Advanced V1', 'opalestate-pro' ),
		'advanced-v2'       => esc_html__( 'Advanced V2', 'opalestate-pro' ),
		'advanced-v3'       => esc_html__( 'Advanced V3', 'opalestate-pro' ),
		'advanced-v4'       => esc_html__( 'Advanced V4', 'opalestate-pro' ),
		'advanced-v5'       => esc_html__( 'Advanced V5', 'opalestate-pro' ),
		'advanced-v6'       => esc_html__( 'Advanced V6', 'opalestate-pro' ),
		'search-form-v'     => esc_html__( 'Vertical Advanced', 'opalestate-pro' ),
		'search-form-v2'    => esc_html__( 'Vertical Advanced V2', 'opalestate-pro' ),
		'search-form-v3'    => esc_html__( 'Vertical Advanced V3', 'opalestate-pro' ),
		'simple-city'       => esc_html__( 'Simple City', 'opalestate-pro' ),
		'simple-keyword'    => esc_html__( 'Simple Keyword', 'opalestate-pro' ),
		'collapse-city'     => esc_html__( 'Collapse City', 'opalestate-pro' ),
		'collapse-keyword'  => esc_html__( 'Collapse Keyword', 'opalestate-pro' ),
		'collapse-advanced' => esc_html__( 'Collapse Advanced', 'opalestate-pro' ),
	] );
}

/**
 * Gets loop property layouts.
 *
 * @return array
 */
function opalestate_get_loop_property_layouts() {
	return apply_filters( 'opalestate_get_loop_property_layouts', [
		'grid'       => esc_html__( 'Grid', 'opalestate-pro' ),
		'grid-v2'    => esc_html__( 'Grid v2', 'opalestate-pro' ),
		'grid-v3'    => esc_html__( 'Grid v3', 'opalestate-pro' ),
		'list'       => esc_html__( 'List', 'opalestate-pro' ),
		'list-v2'    => esc_html__( 'List v2', 'opalestate-pro' ),
		'mark-hover' => esc_html__( 'Mark hover', 'opalestate-pro' ),
	] );
}

/**
 * Gets display modes.
 *
 * @return array
 */
function opalestate_display_modes() {
	return apply_filters( 'opalestate_display_modes', [
		'grid' => esc_html__( 'Grid', 'opalestate-pro' ),
		'list' => esc_html__( 'List', 'opalestate-pro' ),
	] );
}

/**
 * Gets loop property grid layouts.
 *
 * @return array
 */
function opalestate_get_loop_property_grid_layouts() {
	return apply_filters( 'opalestate_get_loop_property_grid_layouts', [
		'grid'       => esc_html__( 'Grid', 'opalestate-pro' ),
		'grid-v2'    => esc_html__( 'Grid v2', 'opalestate-pro' ),
		'grid-v3'    => esc_html__( 'Grid v3', 'opalestate-pro' ),
		'mark-hover' => esc_html__( 'Mark hover', 'opalestate-pro' ),
	] );
}

/**
 * Gets loop property list layouts.
 *
 * @return array
 */
function opalestate_get_loop_property_list_layouts() {
	return apply_filters( 'opalestate_get_loop_property_list_layouts', [
		'list'    => esc_html__( 'List', 'opalestate-pro' ),
		'list-v2' => esc_html__( 'List v2', 'opalestate-pro' ),
	] );
}

function opalestate_get_map_api_uri() {

	$key = opalestate_options( 'google_map_api_keys' ) ?
		opalestate_options( 'google_map_api_keys' ) : 'AIzaSyAvJkbm23fhVAYcbdeVB0nkHjZmDeZ62bc';

	$api = 'https://maps.googleapis.com/maps/api/js?key=' . $key . '&libraries=geometry,places,drawing&ver=5.2.2';
	$api = apply_filters( 'opalestate_google_map_api_uri', $api );

	return $api;
}

function opalestate_get_map_search_api_uri( $address ) {

	$key = opalestate_options( 'google_map_api_keys' ) ?
		opalestate_options( 'google_map_api_keys' ) : 'AIzaSyAvJkbm23fhVAYcbdeVB0nkHjZmDeZ62bc';

	$api = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key={$key}";

	return $api;
}

function opalestate_is_setting_enabled( $value, $compare_with = null ) {
	if ( ! is_null( $compare_with ) ) {

		if ( is_array( $compare_with ) ) {
			// Output.
			return in_array( $value, $compare_with );
		}

		// Output.
		return ( $value === $compare_with );
	}

	return ( in_array( $value, [ 'enabled', 'on', 'yes' ] ) ? true : false );
}


function opalestate_get_dashdoard_page_uri() {
	return home_url();
}


if ( ! function_exists( 'opalestate_is_ajax_request' ) ) {
	function opalestate_is_ajax_request() {
		return defined( 'DOING_AJAX' ) && DOING_AJAX;
	}
}

if ( ! function_exists( 'opalmembership_add_notice' ) ) {
	function opalestate_add_notice( $type = 'error', $message = '' ) {
		if ( ! $type || ! $message ) {
			return;
		}
		$notices = OpalEstate()->session->get( 'notices', [] );
		if ( ! isset( $notices[ $type ] ) ) {
			$notices[ $type ] = [];
		}
		$notices[ $type ][] = $message;
		OpalEstate()->session->set( 'notices', $notices );
	}
}


if ( ! function_exists( 'opalestate_print_notices' ) ) {

	/**
	 * print all notices
	 */
	function opalestate_print_notices() {

		$notices = OpalEstate()->session->get( 'notices', [] );
		if ( empty( $notices ) ) {
			return;
		}
		ob_start();
		foreach ( $notices as $type => $messages ) {
			echo opalestate_load_template_path( 'notices/' . $type, [ 'messages' => $messages ] );
		}
		OpalEstate()->session->set( 'notices', [] );
		echo ob_get_clean();
	}
}


function opalestate_user_roles_by_user_id( $user_id ) {
	$user = get_userdata( $user_id );

	return empty( $user ) ? [] : $user->roles;
}

/**
 * Featured Image Sizes
 */
function opalestate_get_featured_image_sizes() {
	global $_wp_additional_image_sizes;
	$sizes = [ 'full' => esc_html__( 'Orginal Size', 'opalestate-pro' ) ];

	foreach ( get_intermediate_image_sizes() as $_size ) {

		if ( in_array( $_size, [ 'thumbnail', 'medium', 'medium_large', 'large' ] ) ) {
			$sizes[ $_size ] = $_size . ' - ' . get_option( "{$_size}_size_w" ) . 'x' . get_option( "{$_size}_size_h" );
		} elseif ( isset( $_wp_additional_image_sizes[ $_size ] ) ) {
			$sizes[ $_size ] = $_size . ' - ' . $_wp_additional_image_sizes[ $_size ]['width'] . 'x' . $_wp_additional_image_sizes[ $_size ]['height'];
		}

	}

	return apply_filters( 'opalestate_get_featured_image_sizes', $sizes );
}

/**
 * Gets register page uri.
 *
 * @return string
 */
function opalestate_get_register_page_uri() {
	global $opalmembership_options;
	$register_page = isset( $opalmembership_options['register_page'] ) ? get_permalink( absint( $opalmembership_options['register_page'] ) ) : get_bloginfo( 'url' );

	return apply_filters( 'opalestate_get_register_page_uri', $register_page );
}

/**
 * Gets search agency uri.
 *
 * @return false|string
 */
function opalestate_search_agency_uri() {
	return get_post_type_archive_link( 'opalestate_agency' );
}

/**
 * Gets current uri.
 *
 * @return string
 */
function opalestate_get_current_uri() {
	global $wp;

	$current_url = home_url( add_query_arg( [], $wp->request ) );

	return $current_url;
}

/**
 * Gets URL sort mode.
 *
 * @param string $mode
 * @return string
 */
function opalestate_get_url_sort_mode( $mode = "" ) {
	global $wp;

	$get = [];

	if ( isset( $_GET ) ) {
		$get = $_GET;
	}
	$get['display'] = $mode;
	$current_url    = home_url( add_query_arg( [ $get ], $wp->request ) );

	return $current_url;
}

/**
 *
 */
function opalestate_search_agent_uri() {
	global $opalestate_options;

	$search_agents = isset( $opalestate_options['search_agents'] ) ? get_permalink( absint( $opalestate_options['search_agents'] ) ) : opalestate_get_current_uri();

	return apply_filters( 'opalestate_get_search_agents_page_uri', $search_agents );
}

/**
 *
 */
function opalestate_get_session_location_val() {
	return isset( $_SESSION['set_location'] ) ? $_SESSION['set_location'] : 0;
}

function opalestate_get_location_active() {
	$location = opalestate_get_session_location_val();
	if ( ! is_numeric( $location ) ) {
		$term = get_term_by( 'slug', $location, 'opalestate_location' );
		$name = is_object( $term ) ? $term->name : esc_html__( 'Your Location', 'opalestate-pro' );

		return $name;
	} else {
		return esc_html__( 'Your Location', 'opalestate-pro' );
	}
}

function opalestate_get_upload_image_url( $attach_data ) {
	$upload_dir       = wp_upload_dir();
	$image_path_array = explode( '/', $attach_data['file'] );
	$image_path_array = array_slice( $image_path_array, 0, count( $image_path_array ) - 1 );
	$image_path       = implode( '/', $image_path_array );
	$thumbnail_name   = null;
	if ( isset( $attach_data['sizes']['user-image'] ) ) {
		$thumbnail_name = $attach_data['sizes']['user-image']['file'];
	} elseif ( isset( $attach_data['sizes']['thumbnail']['file'] ) ) {
		$thumbnail_name = $attach_data['sizes']['thumbnail']['file'];
	} else {
		return $upload_dir['baseurl'] . '/' . $attach_data['file'];
	}

	return $upload_dir['baseurl'] . '/' . $image_path . '/' . $thumbnail_name;
}

function opalestate_update_attachement_used( $attachment_id ) {

}

/**
 * batch including all files in a path.
 *
 * @param String $path : PATH_DIR/*.php or PATH_DIR with $ifiles not empty
 */
function opalestate_includes( $path, $ifiles = [] ) {
	if ( ! empty( $ifiles ) ) {
		foreach ( $ifiles as $key => $file ) {
			$file = $path . '/' . $file;
			if ( is_file( $file ) ) {
				require( $file );
			}
		}
	} else {
		$files = glob( $path );
		foreach ( $files as $key => $file ) {
			if ( is_file( $file ) ) {
				require( $file );
			}
		}
	}
}

/**
 * Gets property.
 *
 * @param $id
 * @return \Opalestate_Property
 */
function opalesetate_property( $id ) {
	global $property;

	$property = new Opalestate_Property( $id );

	return $property;
}

/**
 * Gets agency
 *
 * @param $id
 * @return \Opalestate_Agency
 */
function opalesetate_agency( $id ) {
	global $agency;

	$agency = new Opalestate_Agency( $id );

	return $agency;
}

/**
 * Gets agent.
 *
 * @param $id
 * @return \Opalestate_Agent
 */
function opalesetate_agent( $id ) {
	global $agent;

	$agent = new Opalestate_Agent( $id );

	return $agent;
}

/**
 * Gets opalestate options.
 *
 * @param string $key
 * @param string $default
 * @return mixed|void
 */
function opalestate_options( $key, $default = '' ) {
	global $opalestate_options;

	$value = isset( $opalestate_options[ $key ] ) ? $opalestate_options[ $key ] : $default;
	$value = apply_filters( 'opalestate_option_', $value, $key, $default );

	return apply_filters( 'opalestate_option_' . $key, $value, $key, $default );
}

/**
 * Gets image placeholder.
 *
 * @param string $size
 * @param bool   $url
 * @return string
 */
function opalestate_get_image_placeholder( $size = '', $url = false ) {
	$src = opalestate_get_image_placeholder_src();

	$size = is_string( $size ) ? $size : '';

	if ( $url ) {
		return esc_url( $src );
	}

	return '<img src="' . esc_url( $src ) . '" alt="' . sprintf( esc_html__( 'Placeholder %s', 'opalestate-pro' ), $size ) . '" />';
}

/**
 * Get image placeholder src.
 *
 * @return string
 */
function opalestate_get_image_placeholder_src() {
	return apply_filters( 'opalestate_get_image_placeholder_src', OPALESTATE_PLUGIN_URL . 'assets/images/placeholder.png' );
}

/**
 * Get User IP
 *
 * Returns the IP address of the current visitor
 *
 * @return string $ip User's IP address
 */
function opalestate_get_ip() {
	$ip = '127.0.0.1';

	if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
		//check ip from share internet
		$ip = $_SERVER['HTTP_CLIENT_IP'];
	} elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
		//to check ip is pass from proxy
		$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
	} elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
		$ip = $_SERVER['REMOTE_ADDR'];
	}

	return apply_filters( 'opalestate_get_ip', $ip );
}

/**
 * Gets currencies.
 *
 * @return array
 */
function opalestate_get_currencies() {
	$currencies = [
		'AED' => esc_html__( 'United Arab Emirates dirham', 'opalestate-pro' ),
		'AFN' => esc_html__( 'Afghan afghani', 'opalestate-pro' ),
		'ALL' => esc_html__( 'Albanian lek', 'opalestate-pro' ),
		'AMD' => esc_html__( 'Armenian dram', 'opalestate-pro' ),
		'ANG' => esc_html__( 'Netherlands Antillean guilder', 'opalestate-pro' ),
		'AOA' => esc_html__( 'Angolan kwanza', 'opalestate-pro' ),
		'ARS' => esc_html__( 'Argentine peso', 'opalestate-pro' ),
		'AUD' => esc_html__( 'Australian dollar', 'opalestate-pro' ),
		'AWG' => esc_html__( 'Aruban florin', 'opalestate-pro' ),
		'AZN' => esc_html__( 'Azerbaijani manat', 'opalestate-pro' ),
		'BAM' => esc_html__( 'Bosnia and Herzegovina convertible mark', 'opalestate-pro' ),
		'BBD' => esc_html__( 'Barbadian dollar', 'opalestate-pro' ),
		'BDT' => esc_html__( 'Bangladeshi taka', 'opalestate-pro' ),
		'BGN' => esc_html__( 'Bulgarian lev', 'opalestate-pro' ),
		'BHD' => esc_html__( 'Bahraini dinar', 'opalestate-pro' ),
		'BIF' => esc_html__( 'Burundian franc', 'opalestate-pro' ),
		'BMD' => esc_html__( 'Bermudian dollar', 'opalestate-pro' ),
		'BND' => esc_html__( 'Brunei dollar', 'opalestate-pro' ),
		'BOB' => esc_html__( 'Bolivian boliviano', 'opalestate-pro' ),
		'BRL' => esc_html__( 'Brazilian real', 'opalestate-pro' ),
		'BSD' => esc_html__( 'Bahamian dollar', 'opalestate-pro' ),
		'BTC' => esc_html__( 'Bitcoin', 'opalestate-pro' ),
		'BTN' => esc_html__( 'Bhutanese ngultrum', 'opalestate-pro' ),
		'BWP' => esc_html__( 'Botswana pula', 'opalestate-pro' ),
		'BYR' => esc_html__( 'Belarusian ruble', 'opalestate-pro' ),
		'BZD' => esc_html__( 'Belize dollar', 'opalestate-pro' ),
		'CAD' => esc_html__( 'Canadian dollar', 'opalestate-pro' ),
		'CDF' => esc_html__( 'Congolese franc', 'opalestate-pro' ),
		'CHF' => esc_html__( 'Swiss franc', 'opalestate-pro' ),
		'CLP' => esc_html__( 'Chilean peso', 'opalestate-pro' ),
		'CNY' => esc_html__( 'Chinese yuan', 'opalestate-pro' ),
		'COP' => esc_html__( 'Colombian peso', 'opalestate-pro' ),
		'CRC' => esc_html__( 'Costa Rican col&oacute;n', 'opalestate-pro' ),
		'CUC' => esc_html__( 'Cuban convertible peso', 'opalestate-pro' ),
		'CUP' => esc_html__( 'Cuban peso', 'opalestate-pro' ),
		'CVE' => esc_html__( 'Cape Verdean escudo', 'opalestate-pro' ),
		'CZK' => esc_html__( 'Czech koruna', 'opalestate-pro' ),
		'DJF' => esc_html__( 'Djiboutian franc', 'opalestate-pro' ),
		'DKK' => esc_html__( 'Danish krone', 'opalestate-pro' ),
		'DOP' => esc_html__( 'Dominican peso', 'opalestate-pro' ),
		'DZD' => esc_html__( 'Algerian dinar', 'opalestate-pro' ),
		'EGP' => esc_html__( 'Egyptian pound', 'opalestate-pro' ),
		'ERN' => esc_html__( 'Eritrean nakfa', 'opalestate-pro' ),
		'ETB' => esc_html__( 'Ethiopian birr', 'opalestate-pro' ),
		'EUR' => esc_html__( 'Euro', 'opalestate-pro' ),
		'FJD' => esc_html__( 'Fijian dollar', 'opalestate-pro' ),
		'FKP' => esc_html__( 'Falkland Islands pound', 'opalestate-pro' ),
		'GBP' => esc_html__( 'Pound sterling', 'opalestate-pro' ),
		'GEL' => esc_html__( 'Georgian lari', 'opalestate-pro' ),
		'GGP' => esc_html__( 'Guernsey pound', 'opalestate-pro' ),
		'GHS' => esc_html__( 'Ghana cedi', 'opalestate-pro' ),
		'GIP' => esc_html__( 'Gibraltar pound', 'opalestate-pro' ),
		'GMD' => esc_html__( 'Gambian dalasi', 'opalestate-pro' ),
		'GNF' => esc_html__( 'Guinean franc', 'opalestate-pro' ),
		'GTQ' => esc_html__( 'Guatemalan quetzal', 'opalestate-pro' ),
		'GYD' => esc_html__( 'Guyanese dollar', 'opalestate-pro' ),
		'HKD' => esc_html__( 'Hong Kong dollar', 'opalestate-pro' ),
		'HNL' => esc_html__( 'Honduran lempira', 'opalestate-pro' ),
		'HRK' => esc_html__( 'Croatian kuna', 'opalestate-pro' ),
		'HTG' => esc_html__( 'Haitian gourde', 'opalestate-pro' ),
		'HUF' => esc_html__( 'Hungarian forint', 'opalestate-pro' ),
		'IDR' => esc_html__( 'Indonesian rupiah', 'opalestate-pro' ),
		'ILS' => esc_html__( 'Israeli new shekel', 'opalestate-pro' ),
		'IMP' => esc_html__( 'Manx pound', 'opalestate-pro' ),
		'INR' => esc_html__( 'Indian rupee', 'opalestate-pro' ),
		'IQD' => esc_html__( 'Iraqi dinar', 'opalestate-pro' ),
		'IRR' => esc_html__( 'Iranian rial', 'opalestate-pro' ),
		'ISK' => esc_html__( 'Icelandic kr&oacute;na', 'opalestate-pro' ),
		'JEP' => esc_html__( 'Jersey pound', 'opalestate-pro' ),
		'JMD' => esc_html__( 'Jamaican dollar', 'opalestate-pro' ),
		'JOD' => esc_html__( 'Jordanian dinar', 'opalestate-pro' ),
		'JPY' => esc_html__( 'Japanese yen', 'opalestate-pro' ),
		'KES' => esc_html__( 'Kenyan shilling', 'opalestate-pro' ),
		'KGS' => esc_html__( 'Kyrgyzstani som', 'opalestate-pro' ),
		'KHR' => esc_html__( 'Cambodian riel', 'opalestate-pro' ),
		'KMF' => esc_html__( 'Comorian franc', 'opalestate-pro' ),
		'KPW' => esc_html__( 'North Korean won', 'opalestate-pro' ),
		'KRW' => esc_html__( 'South Korean won', 'opalestate-pro' ),
		'KWD' => esc_html__( 'Kuwaiti dinar', 'opalestate-pro' ),
		'KYD' => esc_html__( 'Cayman Islands dollar', 'opalestate-pro' ),
		'KZT' => esc_html__( 'Kazakhstani tenge', 'opalestate-pro' ),
		'LAK' => esc_html__( 'Lao kip', 'opalestate-pro' ),
		'LBP' => esc_html__( 'Lebanese pound', 'opalestate-pro' ),
		'LKR' => esc_html__( 'Sri Lankan rupee', 'opalestate-pro' ),
		'LRD' => esc_html__( 'Liberian dollar', 'opalestate-pro' ),
		'LSL' => esc_html__( 'Lesotho loti', 'opalestate-pro' ),
		'LYD' => esc_html__( 'Libyan dinar', 'opalestate-pro' ),
		'MAD' => esc_html__( 'Moroccan dirham', 'opalestate-pro' ),
		'MDL' => esc_html__( 'Moldovan leu', 'opalestate-pro' ),
		'MGA' => esc_html__( 'Malagasy ariary', 'opalestate-pro' ),
		'MKD' => esc_html__( 'Macedonian denar', 'opalestate-pro' ),
		'MMK' => esc_html__( 'Burmese kyat', 'opalestate-pro' ),
		'MNT' => esc_html__( 'Mongolian t&ouml;gr&ouml;g', 'opalestate-pro' ),
		'MOP' => esc_html__( 'Macanese pataca', 'opalestate-pro' ),
		'MRO' => esc_html__( 'Mauritanian ouguiya', 'opalestate-pro' ),
		'MUR' => esc_html__( 'Mauritian rupee', 'opalestate-pro' ),
		'MVR' => esc_html__( 'Maldivian rufiyaa', 'opalestate-pro' ),
		'MWK' => esc_html__( 'Malawian kwacha', 'opalestate-pro' ),
		'MXN' => esc_html__( 'Mexican peso', 'opalestate-pro' ),
		'MYR' => esc_html__( 'Malaysian ringgit', 'opalestate-pro' ),
		'MZN' => esc_html__( 'Mozambican metical', 'opalestate-pro' ),
		'NAD' => esc_html__( 'Namibian dollar', 'opalestate-pro' ),
		'NGN' => esc_html__( 'Nigerian naira', 'opalestate-pro' ),
		'NIO' => esc_html__( 'Nicaraguan c&oacute;rdoba', 'opalestate-pro' ),
		'NOK' => esc_html__( 'Norwegian krone', 'opalestate-pro' ),
		'NPR' => esc_html__( 'Nepalese rupee', 'opalestate-pro' ),
		'NZD' => esc_html__( 'New Zealand dollar', 'opalestate-pro' ),
		'OMR' => esc_html__( 'Omani rial', 'opalestate-pro' ),
		'PAB' => esc_html__( 'Panamanian balboa', 'opalestate-pro' ),
		'PEN' => esc_html__( 'Peruvian nuevo sol', 'opalestate-pro' ),
		'PGK' => esc_html__( 'Papua New Guinean kina', 'opalestate-pro' ),
		'PHP' => esc_html__( 'Philippine peso', 'opalestate-pro' ),
		'PKR' => esc_html__( 'Pakistani rupee', 'opalestate-pro' ),
		'PLN' => esc_html__( 'Polish z&#x142;oty', 'opalestate-pro' ),
		'PRB' => esc_html__( 'Transnistrian ruble', 'opalestate-pro' ),
		'PYG' => esc_html__( 'Paraguayan guaran&iacute;', 'opalestate-pro' ),
		'QAR' => esc_html__( 'Qatari riyal', 'opalestate-pro' ),
		'RON' => esc_html__( 'Romanian leu', 'opalestate-pro' ),
		'RSD' => esc_html__( 'Serbian dinar', 'opalestate-pro' ),
		'RUB' => esc_html__( 'Russian ruble', 'opalestate-pro' ),
		'RWF' => esc_html__( 'Rwandan franc', 'opalestate-pro' ),
		'SAR' => esc_html__( 'Saudi riyal', 'opalestate-pro' ),
		'SBD' => esc_html__( 'Solomon Islands dollar', 'opalestate-pro' ),
		'SCR' => esc_html__( 'Seychellois rupee', 'opalestate-pro' ),
		'SDG' => esc_html__( 'Sudanese pound', 'opalestate-pro' ),
		'SEK' => esc_html__( 'Swedish krona', 'opalestate-pro' ),
		'SGD' => esc_html__( 'Singapore dollar', 'opalestate-pro' ),
		'SHP' => esc_html__( 'Saint Helena pound', 'opalestate-pro' ),
		'SLL' => esc_html__( 'Sierra Leonean leone', 'opalestate-pro' ),
		'SOS' => esc_html__( 'Somali shilling', 'opalestate-pro' ),
		'SRD' => esc_html__( 'Surinamese dollar', 'opalestate-pro' ),
		'SSP' => esc_html__( 'South Sudanese pound', 'opalestate-pro' ),
		'STD' => esc_html__( 'S&atilde;o Tom&eacute; and Pr&iacute;ncipe dobra', 'opalestate-pro' ),
		'SYP' => esc_html__( 'Syrian pound', 'opalestate-pro' ),
		'SZL' => esc_html__( 'Swazi lilangeni', 'opalestate-pro' ),
		'THB' => esc_html__( 'Thai baht', 'opalestate-pro' ),
		'TJS' => esc_html__( 'Tajikistani somoni', 'opalestate-pro' ),
		'TMT' => esc_html__( 'Turkmenistan manat', 'opalestate-pro' ),
		'TND' => esc_html__( 'Tunisian dinar', 'opalestate-pro' ),
		'TOP' => esc_html__( 'Tongan pa&#x2bb;anga', 'opalestate-pro' ),
		'TRY' => esc_html__( 'Turkish lira', 'opalestate-pro' ),
		'TTD' => esc_html__( 'Trinidad and Tobago dollar', 'opalestate-pro' ),
		'TWD' => esc_html__( 'New Taiwan dollar', 'opalestate-pro' ),
		'TZS' => esc_html__( 'Tanzanian shilling', 'opalestate-pro' ),
		'UAH' => esc_html__( 'Ukrainian hryvnia', 'opalestate-pro' ),
		'UGX' => esc_html__( 'Ugandan shilling', 'opalestate-pro' ),
		'USD' => esc_html__( 'United States dollar', 'opalestate-pro' ),
		'UYU' => esc_html__( 'Uruguayan peso', 'opalestate-pro' ),
		'UZS' => esc_html__( 'Uzbekistani som', 'opalestate-pro' ),
		'VEF' => esc_html__( 'Venezuelan bol&iacute;var', 'opalestate-pro' ),
		'VND' => esc_html__( 'Vietnamese &#x111;&#x1ed3;ng', 'opalestate-pro' ),
		'VUV' => esc_html__( 'Vanuatu vatu', 'opalestate-pro' ),
		'WST' => esc_html__( 'Samoan t&#x101;l&#x101;', 'opalestate-pro' ),
		'XAF' => esc_html__( 'Central African CFA franc', 'opalestate-pro' ),
		'XCD' => esc_html__( 'East Caribbean dollar', 'opalestate-pro' ),
		'XOF' => esc_html__( 'West African CFA franc', 'opalestate-pro' ),
		'XPF' => esc_html__( 'CFP franc', 'opalestate-pro' ),
		'YER' => esc_html__( 'Yemeni rial', 'opalestate-pro' ),
		'ZAR' => esc_html__( 'South African rand', 'opalestate-pro' ),
		'ZMW' => esc_html__( 'Zambian kwacha', 'opalestate-pro' ),
	];

	return apply_filters( 'opalestate_currencies', $currencies );
}

/**
 * Get the price format depending on the currency position
 *
 * @return string
 */
function opalestate_price_format_position() {
	global $opalestate_options;
	$currency_pos = opalestate_options( 'currency_position', 'before' );

	$format = '%1$s%2$s';
	switch ( $currency_pos ) {
		case 'before' :
			$format = '%1$s%2$s';
			break;
		case 'after' :
			$format = '%2$s%1$s';
			break;
		case 'left_space' :
			$format = '%1$s&nbsp;%2$s';
			break;
		case 'right_space' :
			$format = '%2$s&nbsp;%1$s';
			break;
	}

	return apply_filters( 'opalestate_price_format_position', $format, $currency_pos );
}

/**
 * Price format.
 *
 * @param string $price
 * @param array  $args
 * @return mixed|void
 */
function opalestate_price_format( $price, $args = [] ) {

	$price = opalestate_price( $price, $args );
	$price = sprintf( opalestate_price_format_position(), opalestate_currency_symbol(), $price );

	return apply_filters( 'opalestate_price_format', $price );
}

function opalestate_get_currency() {
	return opalestate_options( 'currency', 'USD' );
}

/**
 * Gets currency symbol
 *
 * @param string $currency
 * @return string
 */
function opalestate_currency_symbol( $currency = '' ) {
	if ( ! $currency ) {
		$currency = opalestate_get_currency();
	}

	$symbols = apply_filters( 'opalestate_currency_symbols', [
		'AED' => '&#x62f;.&#x625;',
		'AFN' => '&#x60b;',
		'ALL' => 'L',
		'AMD' => 'AMD',
		'ANG' => '&fnof;',
		'AOA' => 'Kz',
		'ARS' => '&#36;',
		'AUD' => '&#36;',
		'AWG' => '&fnof;',
		'AZN' => 'AZN',
		'BAM' => 'KM',
		'BBD' => '&#36;',
		'BDT' => '&#2547;&nbsp;',
		'BGN' => '&#1083;&#1074;.',
		'BHD' => '.&#x62f;.&#x628;',
		'BIF' => 'Fr',
		'BMD' => '&#36;',
		'BND' => '&#36;',
		'BOB' => 'Bs.',
		'BRL' => '&#82;&#36;',
		'BSD' => '&#36;',
		'BTC' => '&#3647;',
		'BTN' => 'Nu.',
		'BWP' => 'P',
		'BYR' => 'Br',
		'BZD' => '&#36;',
		'CAD' => '&#36;',
		'CDF' => 'Fr',
		'CHF' => '&#67;&#72;&#70;',
		'CLP' => '&#36;',
		'CNY' => '&yen;',
		'COP' => '&#36;',
		'CRC' => '&#x20a1;',
		'CUC' => '&#36;',
		'CUP' => '&#36;',
		'CVE' => '&#36;',
		'CZK' => '&#75;&#269;',
		'DJF' => 'Fr',
		'DKK' => 'DKK',
		'DOP' => 'RD&#36;',
		'DZD' => '&#x62f;.&#x62c;',
		'EGP' => 'EGP',
		'ERN' => 'Nfk',
		'ETB' => 'Br',
		'EUR' => '&euro;',
		'FJD' => '&#36;',
		'FKP' => '&pound;',
		'GBP' => '&pound;',
		'GEL' => '&#x10da;',
		'GGP' => '&pound;',
		'GHS' => '&#x20b5;',
		'GIP' => '&pound;',
		'GMD' => 'D',
		'GNF' => 'Fr',
		'GTQ' => 'Q',
		'GYD' => '&#36;',
		'HKD' => '&#36;',
		'HNL' => 'L',
		'HRK' => 'Kn',
		'HTG' => 'G',
		'HUF' => '&#70;&#116;',
		'IDR' => 'Rp',
		'ILS' => '&#8362;',
		'IMP' => '&pound;',
		'INR' => '&#8377;',
		'IQD' => '&#x639;.&#x62f;',
		'IRR' => '&#xfdfc;',
		'ISK' => 'Kr.',
		'JEP' => '&pound;',
		'JMD' => '&#36;',
		'JOD' => '&#x62f;.&#x627;',
		'JPY' => '&yen;',
		'KES' => 'KSh',
		'KGS' => '&#x43b;&#x432;',
		'KHR' => '&#x17db;',
		'KMF' => 'Fr',
		'KPW' => '&#x20a9;',
		'KRW' => '&#8361;',
		'KWD' => '&#x62f;.&#x643;',
		'KYD' => '&#36;',
		'KZT' => 'KZT',
		'LAK' => '&#8365;',
		'LBP' => '&#x644;.&#x644;',
		'LKR' => '&#xdbb;&#xdd4;',
		'LRD' => '&#36;',
		'LSL' => 'L',
		'LYD' => '&#x644;.&#x62f;',
		'MAD' => '&#x62f;.&#x645;.',
		'MDL' => 'L',
		'MGA' => 'Ar',
		'MKD' => '&#x434;&#x435;&#x43d;',
		'MMK' => 'Ks',
		'MNT' => '&#x20ae;',
		'MOP' => 'P',
		'MRO' => 'UM',
		'MUR' => '&#x20a8;',
		'MVR' => '.&#x783;',
		'MWK' => 'MK',
		'MXN' => '&#36;',
		'MYR' => '&#82;&#77;',
		'MZN' => 'MT',
		'NAD' => '&#36;',
		'NGN' => '&#8358;',
		'NIO' => 'C&#36;',
		'NOK' => '&#107;&#114;',
		'NPR' => '&#8360;',
		'NZD' => '&#36;',
		'OMR' => '&#x631;.&#x639;.',
		'PAB' => 'B/.',
		'PEN' => 'S/.',
		'PGK' => 'K',
		'PHP' => '&#8369;',
		'PKR' => '&#8360;',
		'PLN' => '&#122;&#322;',
		'PRB' => '&#x440;.',
		'PYG' => '&#8370;',
		'QAR' => '&#x631;.&#x642;',
		'RMB' => '&yen;',
		'RON' => 'lei',
		'RSD' => '&#x434;&#x438;&#x43d;.',
		'RUB' => '&#8381;',
		'RWF' => 'Fr',
		'SAR' => '&#x631;.&#x633;',
		'SBD' => '&#36;',
		'SCR' => '&#x20a8;',
		'SDG' => '&#x62c;.&#x633;.',
		'SEK' => '&#107;&#114;',
		'SGD' => '&#36;',
		'SHP' => '&pound;',
		'SLL' => 'Le',
		'SOS' => 'Sh',
		'SRD' => '&#36;',
		'SSP' => '&pound;',
		'STD' => 'Db',
		'SYP' => '&#x644;.&#x633;',
		'SZL' => 'L',
		'THB' => '&#3647;',
		'TJS' => '&#x405;&#x41c;',
		'TMT' => 'm',
		'TND' => '&#x62f;.&#x62a;',
		'TOP' => 'T&#36;',
		'TRY' => '&#8378;',
		'TTD' => '&#36;',
		'TWD' => '&#78;&#84;&#36;',
		'TZS' => 'Sh',
		'UAH' => '&#8372;',
		'UGX' => 'UGX',
		'USD' => '&#36;',
		'UYU' => '&#36;',
		'UZS' => 'UZS',
		'VEF' => 'Bs F',
		'VND' => '&#8363;',
		'VUV' => 'Vt',
		'WST' => 'T',
		'XAF' => 'Fr',
		'XCD' => '&#36;',
		'XOF' => 'Fr',
		'XPF' => 'Fr',
		'YER' => '&#xfdfc;',
		'ZAR' => '&#82;',
		'ZMW' => 'ZK',
	] );

	$currency_symbol = isset( $symbols[ $currency ] ) ? $symbols[ $currency ] : '';

	return apply_filters( 'opalestate_currency_symbol', $currency_symbol, $currency );
}

/**
 * Return the thousand separator for prices
 *
 * @return string
 */
function opalestate_get_price_thousand_separator() {
	$separator = stripslashes( opalestate_options( 'thousands_separator' ) );

	return $separator;
}

/**
 * Return the decimal separator for prices
 *
 * @return string
 */
function opalestate_get_price_decimal_separator() {
	$separator = stripslashes( opalestate_options( 'decimal_separator', '.' ) );

	return $separator ? $separator : '.';
}

/**
 * Return the number of decimals after the decimal point.
 *
 * @return int
 */
function opalestate_get_price_decimals() {
	return absint( opalestate_options( 'number_decimals', 2 ) );
}


/**
 * Returns Price.
 *
 * @param int   $price
 * @param array $args
 * @return bool|mixed|string|void
 */
function opalestate_price( $price, $args = [] ) {

	$negative = $price < 0;

	if ( $negative ) {
		$price = substr( $price, 1 );
	}


	extract( apply_filters( 'opalestate_price_args', wp_parse_args( $args, [
		'ex_tax_label'       => false,
		'decimal_separator'  => opalestate_get_price_decimal_separator(),
		'thousand_separator' => opalestate_get_price_thousand_separator(),
		'decimals'           => opalestate_get_price_decimals(),

	] ) ) );

	$negative = $price < 0;
	$price    = apply_filters( 'opalestate_raw_price', floatval( $negative ? $price * -1 : $price ) );
	$price    = apply_filters( 'opalestate_formatted_price', number_format( $price, $decimals, $decimal_separator, $thousand_separator ), $price, $decimals, $decimal_separator, $thousand_separator );

	return $price;
}

/**
 *
 *  Applyer function to show unit for property
 */

function opalestate_areasize_unit_format( $value = '' ) {
	$measurement_units = opalestate_get_measurement_units();
	$unit              = opalestate_options( 'measurement_unit', 'sqft' );
	if ( isset( $measurement_units[ $unit ] ) ) {
		$unit = $measurement_units[ $unit ];
	}

	return sprintf( _x( '%1$s <span>%2$s</span>', 'areasize info', 'opalestate-pro' ), $value, $unit );
}

add_filter( 'opalestate_areasize_unit_format', 'opalestate_areasize_unit_format' );

/**
 *
 *  Applyer function to show unit for property
 */
if ( ! function_exists( 'opalestate_fnc_excerpt' ) ) {
	//Custom Excerpt Function
	function opalestate_fnc_excerpt( $limit, $afterlimit = '[...]' ) {
		$excerpt = get_the_excerpt();

		return opalestate_fnc_get_words( $excerpt, $limit, $afterlimit );
	}
}

function opalestate_fnc_get_words( $excerpt, $limit, $afterlimit = '...' ) {
	if ( $excerpt != '' ) {
		$excerpt = explode( ' ', strip_tags( $excerpt ), $limit );
	} else {
		$excerpt = explode( ' ', strip_tags( get_the_content() ), $limit );
	}
	if ( count( $excerpt ) >= $limit ) {
		array_pop( $excerpt );
		$excerpt = implode( " ", $excerpt ) . ' ' . $afterlimit;
	} else {
		$excerpt = implode( " ", $excerpt );
	}
	$excerpt = preg_replace( '`[[^]]*]`', '', $excerpt );

	return strip_shortcodes( $excerpt );
}

/**
 *
 */
function opalestate_is_own_property( $post_id, $user_id ) {
	$post = get_post( $post_id );
	wp_reset_postdata();
	if ( ! is_object( $post ) || ! $post->ID ) {
		return false;
	}

	return $user_id == $post->post_author;
}


if ( ! function_exists( 'opalesate_insert_user_agent' ) ) {

	function opalesate_insert_user_agent( $args = [] ) {
		$userdata = wp_parse_args( $args, [
			'first_name' => '',
			'last_name'  => '',
			'avatar'     => '',
			'job'        => '',
			'email'      => '',
			'phone'      => '',
			'mobile'     => '',
			'fax'        => '',
			'web'        => '',
			'address'    => '',
			'twitter'    => '',
			'facebook'   => '',
			'google'     => '',
			'linkedin'   => '',
			'instagram'  => '',
		] );

		$agent_id = wp_insert_post( [
			'post_title'   => $args['first_name'] && $args['last_name'] ? $args['first_name'] . ' ' . $args['last_name'] : $userdata['email'],
			'post_content' => 'empty description',
			'post_excerpt' => 'empty excerpt',
			'post_type'    => 'opalestate_agent',
			'post_status'  => 'publish',
			'post_author'  => 1,
		], true );

		foreach ( $userdata as $key => $value ) {
			if ( in_array( $key, [ 'first_name', 'last_name' ] ) ) {
				continue;
			}
			update_post_meta( $agent_id, OPALESTATE_AGENT_PREFIX . $key, $value );
		}
		do_action( 'opalesate_insert_user_agent', $agent_id );

		return $agent_id;
	}
}

/**
 * Returns the multilingual instance.
 *
 * @return Opalestate_Multilingual
 */
function opalestate_multilingual() {
	$multilingual = new Opalestate_Multilingual();

	return $multilingual;
}

/**
 * Is current WordPress is running on multi-languages.
 *
 * @return bool
 */
function opalestate_running_on_multilanguage() {
	return apply_filters( 'opalestate_is_running_multilanguage', Opalestate_Multilingual::is_polylang() || Opalestate_Multilingual::is_wpml() );
}

/**
 * Gets measurement units.
 *
 * @return array
 */
function opalestate_get_measurement_units() {
	return apply_filters( 'opalestate_measurement_units', [
		'sqft' => esc_html__( 'sq ft', 'opalestate-pro' ),
		'sqm'  => esc_html__( 'sq m', 'opalestate-pro' ),
		'mq'   => esc_html__( 'mq', 'opalestate-pro' ),
		'm2'   => esc_html__( 'm2', 'opalestate-pro' ),
	] );
}

/**
 * Gets time formats.
 *
 * @return array
 */
function opalestate_get_time_formats() {
	return apply_filters( 'opalestate_time_formats', [
		'12_hour' => esc_html__( '12-hour', 'opalestate-pro' ),
		'24_hour' => esc_html__( '24-hour', 'opalestate-pro' ),
	] );
}

/**
 * Returns property statuses.
 *
 * @return array
 */
function opalestate_get_property_statuses() {
	return apply_filters( 'opalestate_get_property_statuses', [
		'all'       => esc_html__( 'All', 'opalestate-pro' ),
		'publish'   => esc_html__( 'Published', 'opalestate-pro' ),
		'published' => esc_html__( 'Published', 'opalestate-pro' ),
		'pending'   => esc_html__( 'Pending', 'opalestate-pro' ),
		'expired'   => esc_html__( 'Expired', 'opalestate-pro' ),
	] );
}

/**
 * Returns property meta icon classes.
 *
 * @param $key
 */
function opalestate_get_property_meta_icon( $key ) {
	$classes = '';
	$classes .= 'icon-property-' . esc_attr( $key );

	switch ( $key ) {
		case 'builtyear':
			$icon = 'fas fa-calendar';
			break;
		case 'parking':
			$icon = 'fas fa-car';
			break;
		case 'bedrooms':
			$icon = 'fas fa-bed';
			break;
		case 'bathrooms':
			$icon = 'fas fa-bath';
			break;
		case 'plotsize':
			$icon = 'fas fa-map';
			break;
		case 'areasize':
			$icon = 'fas fa-arrows-alt';
			break;
		case 'orientation':
			$icon = 'fas fa-compass';
			break;
		case 'livingrooms':
			$icon = 'fas fa-tv';
			break;
		case 'kitchens':
			$icon = 'fas fa-utensils';
			break;
		case 'amountrooms':
			$icon = 'fas fa-building';
			break;
		default:
			$icon = $key;
			break;
	}

	$classes .= ' ';

	$classes .= apply_filters( 'opalestate_property_meta_icon', $icon, $key );

	return $classes;
}

/**
 * Is enable price field in the search forms?
 *
 * @return bool
 */
function opalestate_is_enable_price_field() {
	return 'on' == opalestate_get_option( 'opalestate_ppt_price_opt', 'on' );
}

/**
 * Is enable areasize field in the search forms?
 *
 * @return bool
 */
function opalestate_is_enable_areasize_field() {
	return 'on' == opalestate_get_option( 'opalestate_ppt_areasize_opt', 'on' );
}

function opalestate_is_require_login_to_show_author_box() {
	$require = opalestate_get_option( 'enable_single_login_to_show_author_box', 'off' );

	return ! ( $require == 'on' ) || ( $require == 'on' && is_user_logged_in() );
}

/**
 * Clean variables using sanitize_text_field. Arrays are cleaned recursively.
 * Non-scalar values are ignored.
 *
 * @param string|array $var Data to sanitize.
 * @return string|array
 */
function opalestate_clean( $var ) {
	if ( is_array( $var ) ) {
		return array_map( 'opalestate_clean', $var );
	}

	return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
}

/**
 * Get unique ID.
 *
 * This is a PHP implementation of Underscore's uniqueId method. A static variable
 * contains an integer that is incremented with each call. This number is returned
 * with the optional prefix. As such the returned value is not universally unique,
 * but it is unique across the life of the PHP process.
 *
 * @param string $prefix Prefix for the returned ID.
 * @return string Unique ID.
 * @see       wp_unique_id() Themes requiring WordPress 5.0.3 and greater should use this instead.
 *
 * @staticvar int $id_counter
 *
 */
function opalestate_unique_id( $prefix = '' ) {
	static $id_counter = 0;
	if ( function_exists( 'wp_unique_id' ) ) {
		return wp_unique_id( $prefix );
	}

	return $prefix . (string) ++$id_counter;
}

/**
 * Get email date format.
 *
 * @return string
 */
function opalestate_email_date_format() {
	return apply_filters( 'opalestate_email_date_format', 'F j, Y, g:i a' );
}

/**
 * Get autocomplete restrictions.
 *
 * @return string
 */
function opalestate_get_autocomplete_restrictions() {
	$restrictions_option = trim( opalestate_options( 'autocomplete_restrictions', '' ) );

	if ( ! $restrictions_option ) {
		return '';
	}

	$array   = explode( ',', $restrictions_option );
	$results = [];

	foreach ( $array as $res ) {
		$results[] = strtolower( trim( $res ) );
	}

	if ( ! $results ) {
		return '';
	}

	return json_encode( $results );
}

/**
 * Query property data for a term and return IDs.
 *
 * Use for 'post__in' in WP_Query.
 *
 * @param string $term The term to search.
 * @return array
 */
function opalestate_search_property_by_term( $term ) {
	global $wpdb;

	// Filters the search fields.
	$search_fields = array_map( 'opalestate_clean', apply_filters( 'opalestate_search_property_fields', [
		'opalestate_ppt_sku',
		'opalestate_ppt_address',
	] ) );

	// Prepare search bookings.
	$property_ids = [];

	if ( is_numeric( $term ) ) {
		$property_ids[] = absint( $term );
	}

	if ( ! empty( $search_fields ) ) {
		$search = $wpdb->get_col( $wpdb->prepare(
			"SELECT DISTINCT `p1`.`post_id` FROM {$wpdb->postmeta} AS `p1` WHERE `p1`.`meta_value` LIKE %s AND `p1`.`meta_key` IN ('" . implode( "','",
				array_map( 'esc_sql', $search_fields ) ) . "')", // @codingStandardsIgnoreLine
			'%' . $wpdb->esc_like( opalestate_clean( $term ) ) . '%'
		) );

		$property_ids = array_unique( array_merge( $property_ids, $search ) );
	}

	return apply_filters( 'opalestate_search_property_results', $property_ids, $term, $search_fields );
}

/**
 * Get Schedule Intervals
 *
 * @return array
 */
function opalestate_get_schedule_interval_options() {
	return apply_filters( 'opalestate_schedule_interval_options', [
			'0'                  => esc_html__( 'Never', 'opalestate-pro' ),
			WEEK_IN_SECONDS      => esc_html__( '1 Week', 'opalestate-pro' ),
			DAY_IN_SECONDS       => esc_html__( '24 Hours', 'opalestate-pro' ),
			12 * HOUR_IN_SECONDS => esc_html__( '12 Hours', 'opalestate-pro' ),
			6 * HOUR_IN_SECONDS  => esc_html__( '6 Hours', 'opalestate-pro' ),
			HOUR_IN_SECONDS      => esc_html__( '1 Hours', 'opalestate-pro' ),
		]
	);
}

if ( ! function_exists( 'opalestate_write_log' ) ) {

	/**
	 * Write log.
	 *
	 * @param $log
	 */
	function opalestate_write_log( $log ) {
		if ( true === WP_DEBUG ) {
			if ( is_array( $log ) || is_object( $log ) ) {
				error_log( print_r( $log, true ) );
			} else {
				error_log( $log );
			}
		}
	}
}
