<?php
/**
 * REST API Functions
 *
 * @package WP_Ultimo\Functions
 * @since   2.0.11
 */

// Exit if accessed directly
defined('ABSPATH') || exit;

/**
 * Get a endpoint nice-name from a class name.
 *
 * Example: '\WP_Ultimo\Models\Product' will return 'product'.
 *
 * @since 2.0.11
 *
 * @param string $class_name The class name. The class needs to exist.
 * @return string
 */
function wu_rest_get_endpoint_from_class_name($class_name) {

	$endpoint = $class_name;

	if (class_exists($class_name)) {

		$last_segment = explode('\\', $class_name);

		$endpoint = strtolower(end($last_segment));

	} // end if;

	return $endpoint;

} // end wu_rest_get_endpoint_from_class_name;

/**
 * Searches the hard-coded schemas for a arguments list.
 *
 * @since 2.0.11
 *
 * @param string  $class_name The class name. The class needs to exist.
 * @param string  $context The context. One of two values - create or update.
 * @param boolean $force_generate If we should try to generate the args when nothing is found.
 * @return array
 */
function wu_rest_get_endpoint_schema($class_name, $context = 'create', $force_generate = false) {

	$from_cache = false;

	$schema = array();

	$endpoint = wu_rest_get_endpoint_from_class_name($class_name);

	$schema_file = wu_path("inc/api/schemas/$endpoint-$context.php");

	if (file_exists($schema_file) && apply_filters('wu_rest_get_endpoint_schema_use_cache', true)) {

		$schema = include $schema_file;

		$from_cache = true;

	} // end if;

	if (empty($schema) && $from_cache === false && $force_generate) {

		$schema = wu_rest_generate_schema($class_name, $context);

	} // end if;

	return $schema;

}  // end wu_rest_get_endpoint_schema;

/**
 * Generates the rest schema for a class name.
 *
 * @since 2.0.11
 *
 * @param string $class_name The class name of the model.
 * @param string $context The context. Can be create or update.
 * @return array
 */
function wu_rest_generate_schema($class_name, $context = 'create') {

	$required_fields = wu_model_get_required_fields($class_name);

	$schema = wu_reflection_parse_object_arguments($class_name);

	foreach ($schema as $argument_name => &$argument) {

		$argument['type'] = wu_rest_treat_argument_type($argument['type']);

		$argument['required'] = $context === 'create' ? in_array($argument_name, $required_fields, true) : false;

		$schema[$argument_name] = $argument;

	} // end foreach;

	return $schema;

} // end wu_rest_generate_schema;

/**
 * Treat argument types to perform additional validations.
 *
 * @since 2.0.11
 *
 * @param string $type The type detected.
 * @return string
 */
function wu_rest_treat_argument_type($type) {

	$type = (string) $type;

	if ($type === 'bool') {

		$type = 'boolean';

	} elseif ($type === 'int') {

		$type = 'integer';

	} elseif ($type === 'float') {

		$type = 'number';

	} // end if;

	return $type;

} // end wu_rest_treat_argument_type;