<?php
/**
 * Helper functions specific to IBM Watson.
 */

namespace Classifai\Providers\Watson;

use Classifai\Features\Classification;

/**
 * Returns the currently configured Watson API URL. Lookup order is,
 *
 * - Options
 * - Constant
 *
 * @return string
 */
function get_api_url(): string {
	$settings = ( new Classification() )->get_settings();
	$creds    = ! empty( $settings[ NLU::ID ] ) ? $settings[ NLU::ID ] : [];

	if ( ! empty( $creds['endpoint_url'] ) ) {
		return $creds['endpoint_url'];
	} elseif ( defined( 'WATSON_URL' ) ) {
		return WATSON_URL;
	} else {
		return '';
	}
}

/**
 * Returns the currently configured Watson username. Lookup order is,
 *
 * - Options
 * - Constant
 *
 * @return string
 */
function get_username(): string {
	$settings = ( new Classification() )->get_settings( NLU::ID );
	$username = ! empty( $settings['username'] ) ? $settings['username'] : '';

	if ( ! empty( $username ) ) {
		return $username;
	} elseif ( defined( 'WATSON_USERNAME' ) ) {
		return WATSON_USERNAME;
	} else {
		return '';
	}
}

/**
 * Returns the currently configured Watson username. Lookup order is,
 *
 * - Options
 * - Constant
 *
 * @return string
 */
function get_password(): string {
	$settings = ( new Classification() )->get_settings( NLU::ID );
	$password = ! empty( $settings['password'] ) ? $settings['password'] : '';

	if ( ! empty( $password ) ) {
		return $password;
	} elseif ( defined( 'WATSON_PASSWORD' ) ) {
		return WATSON_PASSWORD;
	} else {
		return '';
	}
}

/**
 * Get Content Classification method.
 *
 * @since 2.6.0
 *
 * @return string
 */
function get_classification_method(): string {
	$settings = ( new Classification() )->get_settings();

	return $settings['classification_method'] ?? '';
}

/**
 * Returns the feature threshold based on current configuration. Lookup
 * order is.
 *
 * - Option
 * - Constant
 *
 * Any results below the threshold will be ignored.
 *
 * @param string $feature The feature whose threshold to lookup
 * @return float
 */
function get_feature_threshold( string $feature ): float {
	$classification_feature = new Classification();
	$settings               = $classification_feature->get_settings();
	$threshold              = 0;

	if ( ! empty( $settings ) && ! empty( $settings[ $feature . '_threshold' ] ) ) {
		$threshold = filter_var(
			$settings[ $feature . '_threshold' ],
			FILTER_VALIDATE_FLOAT
		);
	}

	if ( empty( $threshold ) ) {
		$constant = 'WATSON_' . strtoupper( $feature ) . '_THRESHOLD';

		if ( defined( $constant ) ) {
			$threshold = floatval( constant( $constant ) );
		}
	}

	$threshold = empty( $threshold ) ? 0.7 : $threshold / 100;

	/**
	 * Filter the threshold for a specific feature. Any results below the
	 * threshold will be ignored.
	 *
	 * @since 1.0.0
	 * @hook classifai_feature_threshold
	 *
	 * @param float  $threshold The threshold to use, expressed as a decimal between 0 and 1 inclusive.
	 * @param string $feature   The feature in question.
	 *
	 * @return float The filtered threshold.
	 */
	return apply_filters( 'classifai_feature_threshold', $threshold, $feature );
}
