<?php
/**
 * Option functions.
 *
 * @since 1.0.0
 *
 * @package UserFeedback
 * @subpackage Options
 * @author  David Paternina
 */

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

function userfeedback_get_option_name() {
	return 'userfeedback_settings';
}

/**
 * Get UserFeedback default config values
 *
 * @return array
 */
function userfeedback_get_default_options() {
	return array(
		// Widget
		'widget_theme'                => 'light',
		'widget_color'                => '#ffffff',
		'widget_text_color'           => '#23282D',
		'widget_button_color'         => '#2D87F1',
		'widget_start_minimized'      => false,
		'widget_show_logo'            => false,
		'widget_custom_logo'          => '',
		'widget_position'             => 'bottom_right',
		// Notifications
		'notifications_recipients'    => '',
		'notifications_html_template' => true,
		'notifications_header_image'  => '',
		// UF settings permissions
		'save_settings'               => array( 'administrator' ),
		// UF Surveys / Responses permissions
		'create_edit_surveys'         => array( 'administrator', 'editor' ),
		'view_results'                => array( 'administrator', 'editor' ),
		'delete_surveys'              => array( 'administrator', 'editor' ),
		'allow_usage_tracking'        => true,
		// Email summaries
		'summaries_disabled'          => false,
		'summaries_html_template'     => true,
		'automatic_updates'   => 'none',
		// Heatmap settings
		'heatmap_auto_delete_enabled' => false,
		'heatmap_retention_period'    => '60',
	);
}

/**
 * Get UserFeedback config values
 *
 * @return array|mixed|void
 */
function userfeedback_get_options() {
	$settings = get_option( userfeedback_get_option_name() );

	if ( empty( $settings ) || ! is_array( $settings ) ) {
		$settings = array();
	}

	return $settings;
}

/**
 * Update UserFeedback config values.
 *
 * Merges the $settings parameter with the result of userfeedback_get_default_options
 * to guarantee that all options are always available.
 *
 * @see userfeedback_get_default_options()
 * @param $settings
 * @return boolean
 */
function userfeedback_save_options( $settings ) {
	if ( empty( $settings ) || ! is_array( $settings ) ) {
		return false;
	}

	$old_settings = userfeedback_get_options();
	$settings     = array_merge( userfeedback_get_default_options(), $old_settings, $settings );
	$did_update = update_option( userfeedback_get_option_name(), $settings );

	// If it updated, let's update the global variable
	if ( $did_update ) {
		global $userfeedback_settings;
		$userfeedback_settings = $settings;
	}

	return $did_update;
}

/**
 * Helper method for getting a setting's value. Falls back to the default
 * setting value if none exists in the options table.
 *
 * @since 1.0.0
 * @access public
 *
 * @param string $key   The setting key to retrieve.
 * @param mixed  $default   The default value of the setting key to retrieve.
 * @return mixed       The value of the setting.
 */
function userfeedback_get_option( $key = '', $default = false ) {
	global $userfeedback_settings;

	$value = ! empty( $userfeedback_settings[ $key ] ) ? $userfeedback_settings[ $key ] : $default;
	$value = apply_filters( 'userfeedback_get_option', $value, $key, $default );

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

/**
 * Helper method for updating a setting's value.
 *
 * @since 1.0.0
 * @access public
 *
 * @param string $key   The setting key.
 * @param string $value The value to set for the key.
 * @return boolean True if updated, false if not.
 */
function userfeedback_update_option( $key = '', $value = false ) {

	// If no key, exit
	if ( empty( $key ) ) {
		return false;
	}

	if ( empty( $value ) ) {
		return userfeedback_delete_option( $key );
	}

	$option_name = userfeedback_get_option_name();

	$settings = userfeedback_get_options();

	// Let's let devs alter that value coming in
	$value = apply_filters( 'userfeedback_update_option', $value, $key );

	// Next let's try to update the value
	$settings[ $key ] = $value;

	$did_update = update_option( $option_name, $settings );

	// If it updated, let's update the global variable
	if ( $did_update ) {
		global $userfeedback_settings;
		$userfeedback_settings[ $key ] = $value;
	}

	return $did_update;
}

/**
 * Helper method for deleting a setting's value.
 *
 * @since 1.0.0
 * @access public
 *
 * @param string $key   The setting key.
 * @return boolean True if removed, false if not.
 */
function userfeedback_delete_option( $key = '' ) {
	// If no key, exit
	if ( empty( $key ) ) {
		return false;
	}

	$option_name = userfeedback_get_option_name();

	// First let's grab the current settings
	$settings = userfeedback_get_options();

	// Next let's try to remove the key
	if ( isset( $settings[ $key ] ) ) {
		unset( $settings[ $key ] );
	}

	$did_update = update_option( $option_name, $settings );

	// If it updated, let's update the global variable
	if ( $did_update ) {
		global $userfeedback_settings;
		$userfeedback_settings = $settings;
	}

	return $did_update;
}

/**
 * Helper method for deleting multiple settings value.
 *
 * @since 1.0.0
 * @access public
 *
 * @param string $keys   The settings keys.
 * @return boolean True if removed, false if not.
 */
function userfeedback_delete_options( $keys = array() ) {
	// If no keys, exit
	if ( empty( $keys ) || ! is_array( $keys ) ) {
		return false;
	}

	$option_name = userfeedback_get_option_name();

	// First let's grab the current settings
	$settings = userfeedback_get_options();

	// Next let's try to remove the keys
	foreach ( $keys as $key ) {
		if ( isset( $settings[ $key ] ) ) {
			unset( $settings[ $key ] );
		}
	}

	$did_update = update_option( $option_name, $settings );

	// If it updated, let's update the global variable
	if ( $did_update ) {
		global $userfeedback_settings;
		$userfeedback_settings = $settings;
	}

	return $did_update;
}

function userfeedback_export_settings() {
	$settings = userfeedback_get_options();
	$exclude  = array();

	foreach ( $exclude as $e ) {
		if ( ! empty( $settings[ $e ] ) ) {
			unset( $settings[ $e ] );
		}
	}
	return wp_json_encode( $settings );
}

/**
 * Helper method for getting the license information.
 *
 * @since 1.0.0
 * @access public
 * @return string       The value of the setting.
 */
function userfeedback_get_license() {
	$license = UserFeedback()->license->get_site_license();
	$license = $license ? $license : UserFeedback()->license->get_network_license();
	$default = UserFeedback()->license->get_default_license_key();
	if ( empty( $license ) && ! empty( $default ) ) {
		$license        = array();
		$license['key'] = UserFeedback()->license->get_default_license_key();
	}
	return $license;
}

/**
 * Helper method for getting the license key.
 *
 * @since 1.0.0
 * @access public
 * @return string       The value of the setting.
 */
function userfeedback_get_license_key() {
	if ( userfeedback_is_pro_version() ) {
		return UserFeedback()->license->get_license_key();
	}
	return '';
}
