<?php
/**
 * Settings Class
 *
 * Manages plugin settings
 *
 * @package SmartyPress_AI_Engine
 * @since 1.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Settings management class
 */
class SmartyPress_AI_Settings {

	/**
	 * Settings option name
	 *
	 * @var string
	 */
	private $option_name = 'smartypress_ai_settings';

	/**
	 * Get all settings
	 *
	 * @return array All settings.
	 */
	public function get_all_settings() {
		return get_option( $this->option_name, array() );
	}

	/**
	 * Get setting value
	 *
	 * @param string $key Setting key.
	 * @param mixed  $default Default value.
	 * @return mixed Setting value.
	 */
	public function get_setting( $key, $default = null ) {
		$settings = $this->get_all_settings();
		return $settings[ $key ] ?? $default;
	}

	/**
	 * Get module setting
	 *
	 * @param string $module_id Module ID.
	 * @param string $key Setting key.
	 * @param mixed  $default Default value.
	 * @return mixed Module setting value.
	 */
	public function get_module_setting( $module_id, $key, $default = null ) {
		$modules = $this->get_setting( 'modules', array() );
		$module_id = $this->normalize_module_id( $module_id );
		$module  = $modules[ $module_id ] ?? array();

		if ( 'seo_analysis' === $module_id && ! isset( $modules['seo_analysis'] ) && isset( $modules['web_search'] ) ) {
			$module = $modules['web_search'];
		}

		if ( is_array( $module ) ) {
			return $module[ $key ] ?? $default;
		}

		return $default;
	}

	/**
	 * Update setting
	 *
	 * @param string $key Setting key.
	 * @param mixed  $value Setting value.
	 * @return bool True on success, false on failure.
	 */
	public function update_setting( $key, $value ) {
		$settings = $this->get_all_settings();
		$settings[ $key ] = $value;
		return update_option( $this->option_name, $settings );
	}

	/**
	 * Update module setting
	 *
	 * @param string $module_id Module ID.
	 * @param string $key Setting key.
	 * @param mixed  $value Setting value.
	 * @return bool True on success, false on failure.
	 */
	public function update_module_setting( $module_id, $key, $value ) {
		$settings = $this->get_all_settings();
		$modules  = $settings['modules'] ?? array();
		$module_id = $this->normalize_module_id( $module_id );

		// Ensure module entry exists and is an array
		if ( ! isset( $modules[ $module_id ] ) ) {
			$modules[ $module_id ] = array();
		} elseif ( ! is_array( $modules[ $module_id ] ) ) {
			// Convert scalar (boolean) to array format
			$old_value = $modules[ $module_id ];
			$modules[ $module_id ] = array( 'enabled' => (bool) $old_value );
		}

		$modules[ $module_id ][ $key ] = $value;
		$settings['modules']           = $modules;

		return update_option( $this->option_name, $settings );
	}

	/**
	 * Check if module is enabled
	 *
	 * @param string $module_id Module ID.
	 * @return bool True if enabled, false otherwise.
	 */
	public function is_module_enabled( $module_id ) {
		$modules = $this->get_setting( 'modules', array() );
		$module_id = $this->normalize_module_id( $module_id );

		if ( ! isset( $modules[ $module_id ] ) ) {
			if ( 'seo_analysis' === $module_id && isset( $modules['web_search'] ) ) {
				$legacy_module = $modules['web_search'];

				if ( is_bool( $legacy_module ) ) {
					return $legacy_module;
				}

				if ( is_array( $legacy_module ) ) {
					return isset( $legacy_module['enabled'] ) && $legacy_module['enabled'];
				}

				return (bool) $legacy_module;
			}

			// Default internal modules are enabled for upgraded installations.
			$default_enabled = array( 'content_generator', 'image_generator', 'image_alt_generator', 'seo_analysis', 'seo_optimization' );
			return in_array( $module_id, $default_enabled, true );
		}

		// If module setting is a boolean, return it
		if ( is_bool( $modules[ $module_id ] ) ) {
			return $modules[ $module_id ];
		}

		// If module setting is an array, check 'enabled' key
		if ( is_array( $modules[ $module_id ] ) ) {
			return isset( $modules[ $module_id ]['enabled'] ) && $modules[ $module_id ]['enabled'];
		}

		return (bool) $modules[ $module_id ];
	}

	/**
	 * Enable module
	 *
	 * @param string $module_id Module ID.
	 * @return bool True on success, false on failure.
	 */
	public function enable_module( $module_id ) {
		return $this->update_module_setting( $module_id, 'enabled', true );
	}

	/**
	 * Disable module
	 *
	 * @param string $module_id Module ID.
	 * @return bool True on success, false on failure.
	 */
	public function disable_module( $module_id ) {
		return $this->update_module_setting( $module_id, 'enabled', false );
	}

	/**
	 * Normalize legacy module ids to current ids.
	 *
	 * @param string $module_id Module ID.
	 * @return string
	 */
	private function normalize_module_id( $module_id ) {
		return 'web_search' === $module_id ? 'seo_analysis' : $module_id;
	}
}

