<?php
/*
Plugin Name: Cetelem Payment Gateway
Requires Plugins: woocommerce
Version: 3.4.3
Plugin URI: https://www.cetelem.es
Description: Add to WooCommerce Cetelem payment gateway.
Author URI: https://dabasystem.com
Author: Banco Cetelem S.A.U.
Requires at least: 5.0
Tested up to: 6.9.4
WC requires at least: 5.6
WC tested up to: 10.6

Text Domain: cetelem-payment
Domain Path: /languages
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl-3.0.html
@package WC - Cetelem payment gateway
@category Core
@author Banco Cetelem S.A.U.
*/

//Igual no deberías poder abrirme
defined('ABSPATH') || exit;

//Define las constantes
define('DIRECCION_cetelem', plugin_basename(__FILE__));


$options = get_option('woocommerce_Cetepay_Gateway_settings');

// Valor configurado en el panel (por defecto 90 si no existe)
$importe_config = isset($options['importe_minimo']) ? (float) $options['importe_minimo'] : 90;

// Aplicar el filtro (permite sobreescritura externa)
$importe_final = apply_filters('woocommerce_cetelem_minimum', $importe_config);

//Define las variables
$cetelem = [
	'plugin' 		=> 'Cetelem payment gateway',
	'plugin_url' 	=> 'https://www.cetelem.es',
	'ajustes' 		=> 'admin.php?page=wc-settings&tab=checkout&section=Cetepay_Gateway',
	'importe'       => $importe_final,
	'encuotas'      => apply_filters('woocommerce_ecredit_minimum', 35),
	'maximo'        => 20000,
];

// Load plugin textdomain
add_action( 'plugins_loaded', 'cetelem_load_textdomain' );
function cetelem_load_textdomain() {
    load_plugin_textdomain( 'cetelem-payment', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}

// Enqueue admin styles for the settings page
add_action( 'admin_enqueue_scripts', 'cetelem_admin_styles' );
function cetelem_admin_styles( $hook ) {
    if ( $hook === 'woocommerce_page_wc-settings' ) {
        wp_enqueue_style(
            'cetelem-admin-css',
            plugins_url( 'assets/css/cetelem-admin.css', __FILE__ ),
            [],
            '3.3.6'
        );
    }
}


/*
Añade el botón de configuración
*/
function cetelem_enlace_de_ajustes($enlaces)
{
	global $cetelem;

	$enlaces_de_ajustes = [
		'<a href="' . $cetelem['ajustes'] . '" title="' . esc_attr__('Settings of ', 'cetelem-payment') . $cetelem['plugin'] . '">' . esc_attr__('Settings', 'cetelem-payment') . '</a>',
	];
	foreach ($enlaces_de_ajustes as $enlace_de_ajustes) {
		array_unshift($enlaces, $enlace_de_ajustes);
	}

	return $enlaces;
}
$plugin = DIRECCION_cetelem;
add_filter("plugin_action_links_$plugin", 'cetelem_enlace_de_ajustes');

//¿Está activo WooCommerce?
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
if (is_plugin_active('woocommerce/woocommerce.php') || is_network_only_plugin('woocommerce/woocommerce.php')) {
	//Añade compatibilidad con HPOS
	add_action('before_woocommerce_init', function () {
		if (class_exists('\Automattic\WooCommerce\Utilities\FeaturesUtil')) {
			\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
		}
	});

	//Añade compatibilidad con cart_checkout_blocks
	add_action('before_woocommerce_init', function () {
		if (class_exists('\Automattic\WooCommerce\Utilities\FeaturesUtil')) {
			\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('cart_checkout_blocks', __FILE__, true);
		}
	});

	//Añade soporte para el bloque del checkout
	function cetelem_gateway_blocks_support()
	{
		if (class_exists('Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType')) {
			require_once plugin_dir_path(__FILE__) . 'includes/class-cetelem-gateway-blocks-support.php';

			add_action(
				'woocommerce_blocks_payment_method_type_registration',
				function (Automattic\WooCommerce\Blocks\Payments\PaymentMethodRegistry $payment_method_registry) {
					$payment_method_registry->register(new Cetelem_Blocks());
				}
			);
		}
	}
	add_action('woocommerce_blocks_loaded', 'cetelem_gateway_blocks_support');

	/*
	Inicia el plugin
	*/
	function cetepaga_init_gateway()
	{
		//¿Existe la clase que controla los medios de pago?
		if (! class_exists('WC_Payment_Gateway')) {
			return;
		}

		/*
        Carga el método de pago enCuotas
        */
		if (file_exists(ABSPATH . 'activa-cetelem.txt')) { //Solo si existe el fichero en el directorio raíz
			include('includes/encuotas.php');
		}

		/*
		Añade el medio de pago
		*/
		#[AllowDynamicProperties]
		class Cetepay_Gateway extends WC_Payment_Gateway
		{
			/*
			Inicia lu construcción
			*/
			public function __construct()
			{
				$this->id					= 'cetelem';
				$this->icon 				= apply_filters('woocommerce_cetelem_icon', plugins_url('assets/images/cetelem.png', __FILE__));
				$this->url					= 'https://ecommerce.cetelem.es/eCommerceLite/configuracion.htm';
				$this->url_test				= 'https://test.cetelem.es/eCommerceLite/configuracion.htm';
				$this->method_title			= esc_attr__('Cetelem', 'cetelem-payment');
				$this->method_description	= esc_attr__('Finance your purchase with Cetelem', 'cetelem-payment');
				$this->notify_url   		= WC()->api_request_url('Cetepay_Gateway');
				$this->init();
			}

			/*
			Inicializa los datos
			*/
			public function init()
			{
				//Carga los campos del formulario
				$this->init_form_fields();

				//Carga la configuración actual
				$this->init_settings();

				//Recoge los datos de la versión anterior
				$campos = [
					'activar'   => 'woocommerce_activar_calculadora',
					'mostrar'   => 'woocommerce_mostrar_cetelem',
					'tipo'      => 'woocommerce_tipo_calculadora',
					'color'     => 'woocommerce_color_calculadora',
					'fuente'    => 'woocommerce_fuente_calculadora',
					'meses'     => 'woocommerce_meses_calculadora',
					'codigo'    => 'woocommerce_codigo_calculadora'
				];

				foreach ($campos as $campo => $opcion) {
					if (get_option($opcion)) {
						$this->settings[$campo]    = get_option($opcion);
						delete_option($opcion);
						update_option('woocommerce_cetelem_settings', $this->settings);
					}
				}

				//Define las variables
				$this->codcentro            = $this->settings['codcentro'];
				$this->custom_nif           = $this->settings['custom_nif'];
				$this->title                = $this->settings['title'];
				$this->description          = $this->settings['description'];
				$this->testing              = $this->settings['testing'];
				$this->activar              = $this->settings['activar'];
				$this->mostrar              = $this->settings['mostrar'];
				$this->material             = $this->settings['material'];
				$this->method_title			= $this->title;
				$this->method_description	= $this->description;

				//Acciones
				add_action('woocommerce_receipt_cetelem', [$this, 'cetelem_pedido']);
				add_action('woocommerce_update_options_payment_gateways_' . $this->id, [$this, 'process_admin_options']);

				//Acción que gestiona la respuesta de Cetelem
				add_action('woocommerce_api_' . strtolower(get_class($this)), [$this, 'cetelem_notificacion']);

				//Elimina Cetelem si el pedido es inferior al importe mínimo
				if (! is_admin() && (is_checkout() || WC_Blocks_Utils::has_block_in_page(wc_get_page_id('checkout'), 'woocommerce/checkout'))) {
					add_filter('woocommerce_available_payment_gateways', [$this, 'cetelem_filtra_medios_de_pago']);
				}
			}


			public function admin_options()
			{
				include('includes/formulario.php');
			}


			public function init_form_fields()
			{
				global $cetelem;
				$shipping_options = [];

				// Obtener las zonas de envío configuradas en WooCommerce
				$shipping_zones = WC_Shipping_Zones::get_zones();

				foreach ($shipping_zones as $zone) {
					foreach ($zone['shipping_methods'] as $method) {
						if ($method->enabled == 'yes') { // Solo agregar los métodos de envío habilitados
							$shipping_options[$method->get_instance_id()] = $method->get_title() . " (" . $method->get_method_title() . ")";
						}
					}
				}

				// Obtener métodos de envío globales (sin zona específica) que estén habilitados
				$global_shipping_methods = WC()->shipping->get_shipping_methods();
				foreach ($global_shipping_methods as $method_id => $method) {
					if ($method->enabled == 'yes') { // Verifica si el método está habilitado
						$shipping_options[$method_id] = $method->get_method_title();
					}
				}
				$this->form_fields = [
					'enabled' => [
						'title'			=> esc_attr__('Enable/Disable', 'cetelem-payment'),
						'type'			=> 'checkbox',
						'label'			=> esc_attr__('Enable Cetelem', 'cetelem-payment'),
						'default'		=> 'yes'
					],
					'codcentro' => [
						'title'			=> esc_attr__('Commerce code', 'cetelem-payment'),
						'type'			=> 'text',
						'description'	=> esc_attr__('The commerce code.', 'cetelem-payment'),
						'default'		=> esc_attr__('Cetelem', 'cetelem-payment'),
						'desc_tip' 		=>  true,
					],
					'custom_nif' => [
						'title'			=> esc_attr__('Do you have a custom NIF/CIF field?', 'cetelem-payment'),
						'type'			=> 'text',
						'description'	=> esc_attr__("Name of your custom NIF/CIF field. Please leave blank if you don't have one.", 'cetelem-payment'),
						'placeholder'	=> 'billing_vat',
						'desc_tip' 		=>  true,
					],
					'title' => [
						'title'			=> esc_attr__('Title', 'cetelem-payment'),
						'type'			=> 'text',
						'description'	=> esc_attr__('This controls the title which the user sees during checkout.', 'cetelem-payment'),
						'default'		=> esc_attr__('Financing with Cetelem', 'cetelem-payment'),
						'desc_tip' 		=>  true,
					],
					'description' => [
						'title'			=> esc_attr__('Description', 'cetelem-payment'),
						'type'			=> 'textarea',
						'description'	=> esc_attr__('This controls the description which the user sees during checkout.', 'cetelem-payment'),
						// translators: %s es el importe mínimo a financiar. %% es el símbolo de porcentaje usado en TAE y comisiones.
						'default'		=> sprintf(esc_attr__('Interest free finance your purchase with Cetelem to X months (TAE x%%). Minimum amount to be financed: %s €. Example of finance for 600 € in X months: formalization commission X%% payable on the first mounthly fee, monthly fee X €, total due amount X €. Offer subject to prior authorization by Banco Cetelem S.A.U. after studying the documentation and contract signing. Validity date of the offer until 31/12/2020.', 'cetelem-payment'), $cetelem['importe']),
						'desc_tip' 		=>  true,
					],
					'testing' => [
						'title'			=> esc_attr__('Testing mode', 'cetelem-payment'),
						'type'			=> 'checkbox',
						'label'			=> esc_attr__('Enable testing mode', 'cetelem-payment'),
						'description'	=> esc_attr__('Gateway in testing mode.', 'cetelem-payment'),
						'default'		=> 'No'
					],
					'material' => [
						'title'			=> esc_attr__('Special code', 'cetelem-payment'),
						'type'			=> 'checkbox',
						'label'			=> esc_attr__('Enable special code', 'cetelem-payment'),
						'description'   => esc_attr__('Send special code 333.', 'cetelem-payment'),
						'default'		=> 'no'
					],
					'activar'      => [
						'title'			=> esc_attr__('Enable/Disable', 'cetelem-payment'),
						'label'         => esc_attr__('Enable or disable the calculator.', 'cetelem-payment'),
						'description'	=> esc_attr__('Add <code>[calculator]</code> shortcode whatever you want to show our calculator.', 'cetelem-payment'),
						'default' 		=> 'no',
						'type'			=> 'checkbox',
					],
					'mostrar'      => [
						'title'			=> esc_attr__('Where to show?', 'cetelem-payment'),
						'description'	=> esc_attr__('Where you want to show the calculator.', 'cetelem-payment'),
						'default' 		=> 'all',
						'type'			=> 'select',
						'class'			=> 'wc-enhanced-select',
						'options'		=> [
							'all'			=> esc_attr__('Both pages', 'cetelem-payment'),
							'product'		=> esc_attr__('Product page', 'cetelem-payment'),
							'checkout'		=> esc_attr__('Checkout page', 'cetelem-payment')
						],
						'desc_tip' 		=>  true,
					],
					'tipo'         => [
						'title'			=> esc_attr__('Calculator Type', 'cetelem-payment'),
						'description'	=> esc_attr__('Select the calculator type.', 'cetelem-payment'),
						'default' 		=> 'Combo',
						'type'			=> 'select',
						'class'			=> 'wc-enhanced-select',
						'options'		=> [
							'Combo'				=> 'Combo',
							'Slider'			=> 'Slider',
						],
						'desc_tip' 		=>  true,
					],
					'color'        => [
						'title'			=> esc_attr__('Color', 'cetelem-payment'),
						'description'	=> esc_attr__('Select your calculator custom color.', 'cetelem-payment'),
						'default' 		=> '#000',
						'type'			=> 'color',
						'desc_tip' 		=>  true,
					],
					'fuente'       => [
						'title'			=> esc_attr__('Font size', 'cetelem-payment'),
						'description'	=> esc_attr__('Select the calculator font size.', 'cetelem-payment'),
						'default' 		=> '12',
						'type'			=> 'select',
						'class'			=> 'wc-enhanced-select',
						'options'		=> [
							'12'			=> '12px',
							'14'			=> '14px',
							'16'			=> '16px',
							'18'			=> '18px',
						],
						'desc_tip' 		=>  true,
					],
					'meses'        => [
						'title'			=> esc_attr__('Months', 'cetelem-payment'),
						'type'			=> 'text',
						'description'	=> esc_attr__('Insert the list of months separated by commas (,).', 'cetelem-payment'),
						'desc_tip' 		=>  true,
					],
					'codigo'       => [
						'title'			=> esc_attr__('Promotion code', 'cetelem-payment'),
						'type'			=> 'text',
						'description'	=> esc_attr__('Insert your promotion code, if you have one.', 'cetelem-payment'),
						'desc_tip' 		=>  true,
					],
					'enabled' => [
						'title'       => esc_attr__('Enable/Disable', 'cetelem-payment'),
						'type'        => 'checkbox',
						'label'       => esc_attr__('Enable Cetelem', 'cetelem-payment'),
						'default'     => 'yes'
					],
					'title' => [
						'title'       => esc_attr__('Title', 'cetelem-payment'),
						'type'        => 'text',
						'description' => esc_attr__('This controls the title which the user sees during checkout.', 'cetelem-payment'),
						'default'     => esc_attr__('Financing with Cetelem', 'cetelem-payment'),
						'desc_tip'    => true,
					],
					'shipping_providers' => [
						'title'       => esc_attr__('Seleccione el punto de recogida', 'cetelem-payment'),
						'type'        => 'multiselect',
						'description' => esc_attr__('Seleccione los transportistas que estarán disponibles para esta opción.', 'cetelem-payment'),
						'options'     => $shipping_options,
						'desc_tip'    => true,
						'default'     => [],
						'class'       => 'wc-enhanced-select',
					],
					'importe_minimo' => [
						'title'       => __('Importe mínimo de financiación', 'cetelem-payment'),
						'type'        => 'number',
						'description' => __('Importe mínimo (en euros) para ofrecer el método de pago Cetelem.', 'cetelem-payment'),
						'default'     => '90',
						'desc_tip'    => true,
					],

				];
			}

			/*
            Devuelve el número de pedido original al evitar fallos con números de pedido largos
            */
			public function cetelem_recupera_numero_pedido($numero_pedido)
			{
				$real_order = get_transient('cetelem_order_temp_' . $numero_pedido);

				if ($real_order) {
					return $real_order;
				} else {
					return ltrim(substr($numero_pedido, 3), '0');
				}
			}

			/*
            Prepara el número de pedido para evitar fallos con números de pedido largos
            */
			public function cetelem_prepara_numero_pedido($numero_pedido)
			{
				$transaction_id     = str_pad($numero_pedido, 6, '0', STR_PAD_LEFT);
				$aleatorio          = wp_rand(1, 999);
				$transaction_id2    = substr_replace($transaction_id, $aleatorio, 0, -3);
				set_transient('cetelem_order_temp_' . $transaction_id2, $numero_pedido, 3600);

				return $transaction_id2;
			}

			/*
			Genera los datos que se van a enviar a Cetelem
			*/
			public function cetelem_dame_datos($pedido)
			{
				//Obtiene el número de pedido
				$numero_pedido = method_exists($pedido, 'get_id') ? $pedido->get_id() : $pedido->id;
				if ('yes' === get_option('wcj_order_number_sequential_enabled') && $pedido->get_meta('_wcj_order_number', true)) { //Compatibilidad con Booster for WooCommerce
					$numero_pedido = $pedido->get_meta('_wcj_order_number', true);
				}

				$facturacion = $pedido->get_address('billing');


				$codigoPostal = $this->GetCodigoPostal($pedido, $facturacion);

				$albaran    = $this->cetelem_prepara_numero_pedido($numero_pedido);

				$nif        = (! empty($this->custom_nif)) ? $pedido->get_meta("_{$this->custom_nif}", true) : $pedido->get_meta("_billing_nif", true);

				$facturacion        = $pedido->get_address('billing');
				$telefono           = (preg_match('/(9|8)[ 0-9 ]{8}/', preg_replace('/\s+/', '', $facturacion["phone"]), $temporal)) ? 'Telefono1' : 'Telefono2';

				//Datos para Cetelem
				$datos_cetelem = [
					'COMANDO'				=> 'INICIO',
					'Albaran'				=> substr($numero_pedido, -13),
					'IdTransaccion'			=> substr(gmdate("y"), -1) . str_pad(gmdate("z") + 1, 3, "0", STR_PAD_LEFT) . $albaran,
					'CodCentro'				=> $this->codcentro,
					'Importe'				=> number_format($pedido->get_total(), 2, ".", "") * 100,
					'ReturnURL'				=> get_home_url() . "/cetelem-procesa-pedido?pedido=" . $numero_pedido,
					'ReturnOK'				=> $this->notify_url . "?pedido=" . $numero_pedido,
					'Nombre'				=> $facturacion["first_name"],
					'Apellidos'				=> $facturacion["last_name"],
					'NIF'					=> $nif,
					'Direccion'				=> preg_replace("/[^a-zA-Z0-9àáâäãåacceèéêëeiìíîïlnòóôöõøùúûüuuÿýzzñçcšžÀÁÂÄÃÅACCEEÈÉÊËÌÍÎÏILNÒÓÔÖÕØÙÚÛÜUUŸÝZZÑßÇOEÆCŠŽ\s\-_\/.,']+/", "", preg_replace("/º|ª/", "", $facturacion["address_1"] . " " . $facturacion["address_2"])),
					'Localidad'				=> $facturacion["city"],
					'CodigoPostalEnvio'		=> sprintf("%05d", $codigoPostal),
					'Email'					=> $facturacion["email"],
					$telefono				=> preg_replace('/\s+/', '', $facturacion["phone"]),
				];

				//Comprueba el pedido - Campo Material
				$producto   = 0;
				$productos  = false;
				//Procesa los productos
				foreach ($pedido->get_items() as $elemento) {
					if ($elemento->get_total() / $elemento->get_quantity() >= 600) {
						$producto++;
						if ($elemento->get_quantity() > 1) {
							$productos  = true;
						}
					}
					if ($pedido->get_total() >= 1200 && $producto >= 2) {
						$productos  = true;
					}
				}
				//Añade el campo Material
				if (($productos || $pedido->get_total() > 3000) && $this->material == 'yes') {
					$datos_cetelem['Material'] = 333;
				}

				//Devuelve los datos y añade un filtro para futuras integraciones
				return apply_filters('woocommerce_cetelem_data', $datos_cetelem, $pedido);
			}

			/*
			Procesa el pago y devuelve el resultado
			*/
			public function process_payment($numero_pedido)
			{
				$pedido = wc_get_order($numero_pedido);

				return [
					'result'	=> 'success',
					'redirect'	=> $pedido->get_checkout_payment_url(true)
				];
			}

			private function getCodigoPostal($pedido, $facturacion)
			{

				$shipping_methods = $pedido->get_shipping_methods();

				$shipping_method_ids = [];
				$metodo = [];

				foreach ($shipping_methods as $method) {
					$shipping_method_ids[] = $method->get_instance_id(); // Esto devuelve "flat_rate", "free_shipping", etc.
					$metodo[] = $method->get_method_id();
				}

				// Obtener transportistas seleccionados en la configuración
				$cetelem_settings = get_option('woocommerce_cetelem_settings', []);
				$selected_shipping_providers = isset($cetelem_settings['shipping_providers']) ? $cetelem_settings['shipping_providers'] : [];
				if ( ! is_array( $selected_shipping_providers ) ) {
					$selected_shipping_providers = array_filter( array_map( 'trim', explode( ',', $selected_shipping_providers ) ) );
				}

				if ( ! empty( $selected_shipping_providers ) && array_intersect($shipping_method_ids, $selected_shipping_providers)) {
					$codigoPostal = '';
				} else if (in_array('pickup_location', $metodo)) {
					$codigoPostal = '';
				} else {
					$codigoPostal = $facturacion["postcode"];
				}
				return $codigoPostal;
			}

			/*
			Envía el pedido a Cetelem
			*/
			public function cetelem_pedido($numero_pedido)
			{
				setcookie('cetelem', $numero_pedido, time() + 3600, COOKIEPATH, COOKIE_DOMAIN, false);

				echo '<p>' . esc_html__('Thank you for your order, please wait until redirecting you to Cetelem.', 'cetelem-payment') . '</p>';

				$pedido = wc_get_order($numero_pedido);
				$datos_cetelem = $this->cetelem_dame_datos($pedido);

				$url = ($this->testing == 'no') ? $this->url : $this->url_test;

				echo '<form action="' . esc_url($url) . '" method="post" id="cetelem_payment_form" target="_top">';
				foreach ($datos_cetelem as $key => $value) {
					echo'<input type="hidden" name="' . esc_attr($key) . '" value="' . esc_attr($value) . '" />';
				}
				echo '
        <div class="payment_buttons">
            <input type="submit" class="button-alt" id="submit_cetelem_payment_form" value="' . esc_attr__('Pay via Cetelem', 'cetelem-payment') . '" />
            <a class="button cancel" href="' . esc_url($pedido->get_cancel_order_url()) . '">' . esc_attr__('Cancel order & restore cart', 'cetelem-payment') . '</a>
        </div>
    </form>';
			}


			/*
			Comprueba la respuesta de Cetelem
			*/
			public function cetelem_notificacion()
			{
				$ip = '';

				if (isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) {
					$ip = sanitize_text_field(wp_unslash($_SERVER['HTTP_CLIENT_IP']));
				} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
					$ip = sanitize_text_field(wp_unslash($_SERVER['HTTP_X_FORWARDED_FOR']));
				} elseif (isset($_SERVER['REMOTE_ADDR']) && ! empty($_SERVER['REMOTE_ADDR'])) {
					$ip = sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR']));
				}

				//¿Proxy?
				$ips    = explode(',', $ip);
				//La respuesta no llega desde la IP prevista
				if ($ip != '213.170.60.39') {
					if ($ips[0] != '213.170.60.39') {
						exit();
					}
				}

				//Lee la cookie y obtenemos los datos del pedido
				$numero_pedido = 0;

				// Verificación de nonce recomendada si esto se usa en una acción sensible
				/*$cetelem_nonce = isset($_REQUEST['cetelem_nonce']) ? sanitize_text_field(wp_unslash($_REQUEST['cetelem_nonce'])) : '';
				if (empty($cetelem_nonce) || ! wp_verify_nonce($cetelem_nonce, 'cetelem_nonce_action')) {
					wp_die('<strong>' . esc_html__('Acceso no autorizado', 'cetelem-payment') . '</strong>');
				}*/

				// Sanitización y validación de entradas
				if (isset($_REQUEST['pedido'])) {
					$numero_pedido = absint(sanitize_text_field(wp_unslash($_REQUEST['pedido'])));
				} elseif (! empty($_REQUEST['IdTransaccion'])) {
					$id_transaccion = sanitize_text_field(wp_unslash($_REQUEST['IdTransaccion']));
					$numero_pedido = (int) $this->cetelem_recupera_numero_pedido(substr($id_transaccion, -6));
				} elseif (isset($_COOKIE['cetelem'])) {
					$numero_pedido = absint(sanitize_text_field(wp_unslash($_COOKIE['cetelem'])));
				}

				$pedido = wc_get_order($numero_pedido);


				//Realiza algunas comprobaciones de seguridad
				$id_pedido = method_exists($pedido, 'get_id') ? $pedido->get_id() : $pedido->id;
				if ($id_pedido != $numero_pedido) {
					exit();
				}
				if ($pedido->get_status() == 'completed') {
					exit();
				}

				//Comprueba los datos enviados por Cetelem
				if (! empty($_REQUEST['codResultado'])) {
					// Guarda los detalles del pedido
					if (! empty($_REQUEST['IdTransaccion'])) {
						$id_transaccion = sanitize_text_field(wp_unslash($_REQUEST['IdTransaccion']));
						$pedido->update_meta_data(esc_attr__('Operation', 'cetelem-payment'), $id_transaccion);
					}

					if (! empty($_REQUEST['NSolicitud'])) {
						$n_solicitud = sanitize_text_field(wp_unslash($_REQUEST['NSolicitud']));
						$pedido->update_meta_data(esc_attr__('Request', 'cetelem-payment'), $n_solicitud);
					}

					if (! empty($_REQUEST['codResultado'])) {
						$cod_resultado = sanitize_text_field(wp_unslash($_REQUEST['codResultado']));
						$pedido->update_meta_data(esc_attr__('Answer', 'cetelem-payment'), $cod_resultado);
					}


					//Comprueba el resultado de la operación
					if ($_REQUEST['codResultado'] == "00" || $_REQUEST['codResultado'] == "50") {	//Preautorizada o Aprobada
						//Marca el pedido como Procesando
						if ($_REQUEST['codResultado'] == "00" && ! $pedido->has_status(apply_filters('woocommerce_cetelem_authorized', 'processing'))) {
							$pedido->update_status(apply_filters('woocommerce_cetelem_preauthorized', 'on-hold'), esc_attr__('Operation preauthorized by Cetelem.', 'cetelem-payment')); //Preautorizada
						} else {
							$pedido->update_status(apply_filters('woocommerce_cetelem_authorized', 'processing'), esc_attr__('Operation authorized by Cetelem.', 'cetelem-payment')); //Aprobada

							//Reduce stock 
							if (version_compare(WOOCOMMERCE_VERSION, '3.0', '<')) {
								$pedido->reduce_order_stock();
							} else {
								wc_reduce_stock_levels($numero_pedido);
							}

							//Vacía el carrito
							WC()->cart->empty_cart();
						}

						//Envía al cliente a la página de gracias
						wp_redirect($this->get_return_url($pedido));
						die('Proceso completado con éxito.');
					} else if ($_REQUEST['codResultado'] == "99" || $_REQUEST['codResultado'] == "51") { //Rechazada
						if ($_REQUEST['codResultado'] == "99") {
							$pedido->update_status(apply_filters('woocommerce_cetelem_99', 'failed'), esc_attr__('Operation denied by Cetelem.', 'cetelem-payment')); //Rechazada

							//Vuelve a la página de pedido para volver a intentarlo
							wp_redirect($pedido->get_checkout_payment_url());
							die('Proceso completado sin éxito.');
						} else {
							$pedido->update_status(apply_filters('woocommerce_cetelem_51', 'cancelled'), esc_attr__('Operation denied by Cetelem.', 'cetelem-payment')); //Rechazada

							//Vuelve a la página de pedido para volver a intentarlo
							wp_redirect($pedido->get_view_order_url());
							die('Proceso completado sin éxito.');
						}
					}
				}
				//Si ha llegado hasta aquí es porque el pedido ha terminado en Cetelem, pero no se han recibido los datos correctamente en la tienda del cliente, por lo tanto ha ocurrido algún tipo de fallo
				//Marca el pedido como Fallido
				$pedido->update_status(apply_filters('woocommerce_cetelem_failed', 'failed'), esc_attr__('Operation awaiting answer by Cetelem.', 'cetelem-payment'));

				//Vuelve a la página de carrito para volver a intentarlo
				wp_redirect(get_permalink(wc_get_page_id('cart')));
				die('Proceso completado sin éxito.');
			}

			/*
			Elimina Cetelem para pedidos inferiores al importe mínimo
			*/
			public function cetelem_filtra_medios_de_pago($medios)
			{
				global $cetelem;

				if ((float) WC()->cart->total < $cetelem['importe'] || (float) WC()->cart->total > $cetelem['maximo']) {
					unset($medios['cetelem']);
				}

				return $medios;
			}

			/*
			Añade la calculadora en la descripción
			*/
			public function payment_fields()
			{
				global $cetelem;

				echo wp_kses_post(wpautop(wptexturize($this->get_description())));
				if ($this->activar == 'yes' && $this->mostrar != 'product' && (float) WC()->cart->total >= $cetelem['importe'] && (float) WC()->cart->total <= $cetelem['maximo']) {
					wc_get_template('calculadora-descripcion.php', ['total' => (float) WC()->cart->total], '', plugin_dir_path(__FILE__) . 'includes/');
				}
			}
		}
	}
	add_action('plugins_loaded', 'cetepaga_init_gateway', 0);

	/*
	Shortcode calculator
	*/
	function cetepay_shortcode($atributos)
	{
		global $product, $cetelem;
		
		if (WC()->payment_gateways->payment_gateways()['cetelem']->enabled == 'no' && (isset(WC()->payment_gateways->payment_gateways()['cetelem_cuotas']) && WC()->payment_gateways->payment_gateways()['cetelem_cuotas']->enabled == 'no')) {
			return; //Están desactivados los métodos de pago
		}

		//Comprueba si está activo EnCuotas y tiene activada la calculadora
		$encuotas   = maybe_unserialize(get_option('woocommerce_cetelem_cuotas_settings'));
		$activo     = (isset(WC()->payment_gateways->payment_gateways()['cetelem_cuotas']) && $encuotas['activar'] == 'yes') ? WC()->payment_gateways->payment_gateways()['cetelem_cuotas']->enabled : 'no';

		//Comprueba si la calculadora de Cetelem está activada
		$configuracion = maybe_unserialize(get_option('woocommerce_cetelem_settings'));

		$importe = apply_filters('woocommerce_cetelem_minimum', 90);

		$atributo   = shortcode_atts([
			'price'    => $importe //Importe personalizado
		], $atributos);

		$variable   = false;
		if (is_product()) {
			$precio      = (version_compare(WOOCOMMERCE_VERSION, '2.7', '<')) ? $product->get_price_including_tax() : wc_get_price_including_tax($product);
			$variable    = ($product->is_type('variable')) ? true : false;
		} elseif (is_checkout()) {
			$precio  = (float) WC()->cart->total;
		} else {
			$precio  = $atributo['price'];
		}

		if ($precio < $cetelem['importe'] || $precio > $cetelem['maximo']) {
			return apply_filters('woocommerce_cetelem_calculator', ''); //Si el precio es inferior al importe mínimo o superior al importe máximo no debe continuar este código
		}

		//Genera las calculadoras
		$calculadora_encuotas   = ($activo == 'yes') ? cetelem_cuotas_pinta_calculadora($precio, $variable) : ''; //enCuotas
		$calculadora_cetelem    = cetelem_pinta_calculadora($precio, $variable); //Cetelem
		
		return $calculadora_encuotas . $calculadora_cetelem; //Pinta las calculadoras
	}
	add_shortcode('calculator', 'cetepay_shortcode');

	/*
	Calculadora en la ficha de producto
	*/
	function cetelem_calculadora()
	{
		global $product, $cetelem;

		if (is_admin() || ! is_product()) {
			return; //¿Panel de administración o algo que no sea producto? no gracias
		}

		if (WC()->payment_gateways->payment_gateways()['cetelem']->enabled == 'no' && (isset(WC()->payment_gateways->payment_gateways()['cetelem_cuotas']) && WC()->payment_gateways->payment_gateways()['cetelem_cuotas']->enabled == 'no')) {
			return; //Están desactivados los métodos de pago
		}

		$variable = ($product->is_type('variable')) ? true : false;

		$precio  = (version_compare(WOOCOMMERCE_VERSION, '2.7', '<')) ? $product->get_price_including_tax() : wc_get_price_to_display($product);

		//Comprueba si está activo EnCuotas
		$activo     = (isset(WC()->payment_gateways->payment_gateways()['cetelem_cuotas'])) ? WC()->payment_gateways->payment_gateways()['cetelem_cuotas']->enabled : 'no';
		$encuotas   = maybe_unserialize(get_option('woocommerce_cetelem_cuotas_settings'));
		$importe    = ($activo == 'yes') ? $cetelem['encuotas'] : $cetelem['importe'];

		$configuracion = maybe_unserialize(get_option('woocommerce_cetelem_settings'));
		if (! empty($configuracion)) {
			if ($configuracion['activar'] != 'yes') {
				return; //Si no está activa la calculadora no debe continuar este código
			} elseif ($precio < $importe || $precio > $cetelem['maximo']) {
				echo wp_kses_post(apply_filters('woocommerce_cetelem_calculator', ''));
				return; //Si el precio es inferior al importe mínimo o superior al importe máximo no debe continuar este código
			}

			if ($configuracion['mostrar'] == 'checkout') {
				return; //Sólo debe mostrarse en la página de finalización de la compra
			}
		} else {
			return; //No hay opciones
		}

		if ($activo == 'yes' && $precio <= $encuotas['importe']) {
			echo wp_kses_post(cetelem_cuotas_pinta_calculadora($precio, $variable)); //enCuotas
		} else {
			echo wp_kses_post(cetelem_pinta_calculadora($precio, $variable)); //Cetelem
		}
		//Previene que se muestre más de una calculadora
		remove_filter('woocommerce_before_add_to_cart_button', 'cetelem_calculadora');
	}
	add_filter('woocommerce_before_add_to_cart_button', 'cetelem_calculadora');

	/*
	Recarga la calculadora en los productos variables
	*/
	function cetelem_calculadora_variable()
	{
		$product  = new WC_Product_Factory();
		$variation_id = 0;

		if (
			isset($_REQUEST['cetelem_nonce']) &&
			wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['cetelem_nonce'])), 'cetelem_nonce_action') &&
			isset($_REQUEST['variation_id'])
		) {
			$variation_id = absint(wp_unslash($_REQUEST['variation_id']));
		}


		if ($variation_id > 0) {
			$precio = (version_compare(WOOCOMMERCE_VERSION, '2.7', '<'))
				? get_product($variation_id)->get_price_including_tax()
				: wc_get_price_to_display($product->get_product($variation_id));
		}

		//Recoge los datos de configuración
		$configuracion = maybe_unserialize(get_option('woocommerce_cetelem_settings'));
		if (! empty($configuracion)) {
			//Recarga la calculadora
?>


		<?php
			if (!function_exists('cetelem_enqueue_calculadora_script')) {
				add_action('wp_enqueue_scripts', 'cetelem_enqueue_calculadora_script');

				function cetelem_enqueue_calculadora_script($precio = 0)
				{
					$configuracion = get_option('woocommerce_cetelem_settings', []);

					if (empty($configuracion) || $configuracion['activar'] !== 'yes') {
						return;
					}

					$testing = $configuracion['testing'] === 'no'
						? 'https://ecommercecalculadora.cetelem.es'
						: 'https://test.cetelem.es';

					$tipo = isset($configuracion['tipo']) ? $configuracion['tipo'] : 'Combo';
					$script_url = $testing . "/eCommerceCalculadora/resources/js/eCalculadoraCetelem{$tipo}.js";

					// 🔹 Inyectar variables y cargar el script remoto manualmente
					$inline_js = sprintf(
						"window.codCentro = '%s';
						window.cantidad = '%s';
						window.color = '%s';
						window.fontSize = '%s';
						window.codPromocion = '%s';
						window.listadoMeses = '%s';
						window.server = '%s';
						(function(){
							var s = document.createElement('script');
							s.src = '%s';
							s.async = false;
							document.head.appendChild(s);
						})();",
						esc_js($configuracion['codcentro'] ?? ''),
						esc_js(round($precio, 2)),
						esc_js($configuracion['color'] ?? '#000'),
						esc_js($configuracion['fuente'] ?? '12'),
						esc_js($configuracion['codigo'] ?? ''),
						esc_js(!empty($configuracion['meses']) ? $configuracion['meses'] : '3,6,12,18,24,36,42,48,60,120'),
						esc_js($testing),
						esc_js($script_url)
					);

					// Se engancha al 'jquery' que siempre carga antes
					wp_add_inline_script('jquery', $inline_js, 'after');
				}
			}
			
		}
	}
	add_action('wp_ajax_nopriv_cetelem_calculadora_variable', 'cetelem_calculadora_variable');
	add_action('wp_ajax_cetelem_calculadora_variable', 'cetelem_calculadora_variable');
	add_action('wp_enqueue_scripts', 'cetelem_enqueue_redirect_script');

	function cetelem_enqueue_redirect_script()
	{
		if (is_checkout()) {
			wp_register_script(
				'cetelem-redirect-form',
				plugins_url('assets/js/cetelem-redirect-form.js', __FILE__),
				array('jquery', 'jquery-blockui'),
				'1.0.0',
				true
			);

			wp_enqueue_script('cetelem-redirect-form');

			// Pasar datos desde PHP a JS
			wp_add_inline_script('cetelem-redirect-form', sprintf(
				"window.cetelemRedirect = {
                message: '<img src=\"%s\" alt=\"Redirecting…\" style=\"float:left; margin-right: 10px;\" />%s'
            };",
				esc_url(apply_filters('woocommerce_cetelem_icon', plugins_url('assets/images/cetelem.png', __FILE__))),
				esc_js(__('Thank you for your order. We are now redirecting you to Cetelem to make payment.', 'cetelem-payment'))
			), 'before');
		}
	}

	/*
	Recompone los nombres de las secciones
	*/
	function cetelem_secciones($secciones)
	{
		//Retrocompatibilidad con versiones anteriores a 2.6
		$seccion  = (version_compare(WOOCOMMERCE_VERSION, '2.6', '<')) ? 'Cetepay_Gateway' : 'cetelem';
		$opciones = (array) get_option('woocommerce_cetelem_settings');
		//Es la primera vez que se ejecuta el plugin. Inicializa datos
		if (! isset($opciones['title'])) {
			$opciones['title'] = (isset($secciones[$seccion])) ? $secciones[$seccion] : esc_attr__('Financing with Cetelem', 'cetelem-payment');
		}

		return $secciones;
	}
	add_filter('woocommerce_get_sections_checkout', 'cetelem_secciones');

	/*
	Añade el nuevo medio de pago
	*/
	function cetelem_anade_pago($metodos)
	{
		$metodos[] = 'Cetepay_Gateway';

		return $metodos;
	}
	add_filter('woocommerce_payment_gateways', 'cetelem_anade_pago', 10);

	/*
	Carga los scripts y CSS de WooCommerce
	*/
	function cetelem_screen_id($woocommerce_screen_ids)
	{
		$woocommerce_screen_ids[] = 'woocommerce_page_cetelem';

		return $woocommerce_screen_ids;
	}
	add_filter('woocommerce_screen_ids', 'cetelem_screen_id');

	/*
	Carga las hojas de estilo
	*/
	function cetelem_hojas_de_estilo()
	{
		//Carga la hoja de estilo
		wp_register_style('cetelem_hoja_de_estilo', plugins_url('assets/css/style.css', __FILE__));
		//Carga la hoja de estilo global
		wp_enqueue_style('cetelem_hoja_de_estilo');
	}
	add_action('admin_enqueue_scripts', 'cetelem_hojas_de_estilo');
}
function cetepay_enqueue_calculadora_script($precio = 0, $variable = false)
{
    $configuracion = get_option('woocommerce_cetelem_settings', []);

    if (empty($configuracion) || $configuracion['activar'] !== 'yes') {
        return;
    }

    $testing = isset($configuracion['testing']) && $configuracion['testing'] === 'no'
        ? 'https://ecommercecalculadora.cetelem.es'
        : 'https://test.cetelem.es';

    $tipo = !empty($configuracion['tipo']) ? $configuracion['tipo'] : 'Combo';
    $script_url = $testing . '/eCommerceCalculadora/resources/js/eCalculadoraCetelem' . $tipo . '.js';

    // Inyectar variables y cargar dinámicamente el script remoto
    $inline_js = sprintf(
    "window.codCentro = '%s';
     window.cantidad = '%s';
     window.color = '%s';
     window.fontSize = '%s';
     window.codPromocion = '%s';
     window.listadoMeses = '%s';
     window.server = '%s';
     (function(){
         var s = document.createElement('script');
         s.src = '%s';
         s.async = false;
         document.head.appendChild(s);
     })();",
    esc_js($configuracion['codcentro'] ?? ''),
    esc_js(round($precio, 2)),

        esc_js($configuracion['color'] ?? '#000'),
        esc_js($configuracion['fuente'] ?? '12'),
        esc_js($configuracion['codigo'] ?? ''),
        esc_js(!empty($configuracion['meses']) ? $configuracion['meses'] : '3,6,12,18,24,36,42,48,60,120'),
        esc_js($testing),
        esc_js($script_url)
    );

    wp_add_inline_script('jquery', $inline_js, 'after');
}



/*
Pinta la calculadora
*/

function cetelem_pinta_calculadora($precio, $variable)
{
	
	$configuracion  = maybe_unserialize(get_option('woocommerce_cetelem_settings'));

	if (! empty($configuracion) && $configuracion['activar'] === 'yes') {
		cetepay_enqueue_calculadora_script($precio, $variable);

		ob_start();
		?>
		<div id="eCalculadoraCetelemDiv"></div>
		<?php if ($variable) : ?>
			<div id="cetelem_calculadora" style="display: none;"></div>
		<?php endif; ?>
		<?php
		return ob_get_clean();
	}

	return '';
}



/*
Crea la URL de escucha
*/
function cetelem_escucha_url()
{
	//¿AJAX? no gracias
	if (defined('DOING_AJAX') && DOING_AJAX) {
		return;
	}

	//¿Panel de administración? no gracias
	if (is_admin()) {
		return;
	}

	//Redireccionamos a la página adecuada
	if (strpos(filter_input(INPUT_SERVER, 'REQUEST_URI'), 'cetelem-procesa-pedido') !== false) {
		//Comprueba si existe el número de pedido

		$pedido_id = 0;

		if (
			isset($_REQUEST['cetelem_nonce']) &&
			wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['cetelem_nonce'])), 'cetelem_nonce_action') &&
			isset($_REQUEST['pedido'])
		) {
			$pedido_id = absint(wp_unslash($_REQUEST['pedido']));

			$pedido = wc_get_order($pedido_id);

			if ($pedido) {
				$estado = $pedido->get_status();

				if ($estado === 'on-hold' || $estado === 'processing') {
					wp_redirect($pedido->get_checkout_order_received_url());
					exit;
				} elseif ($estado === 'failed') {
					wp_redirect($pedido->get_checkout_payment_url());
					exit;
				} elseif ($estado === 'cancelled') {
					wp_redirect($pedido->get_view_order_url());
					exit;
				}
			}
		}

		wp_redirect(get_permalink(wc_get_page_id('cart')));
		die();
	}
}
add_action('parse_request', 'cetelem_escucha_url', 999);


/**
 *Se encarga de gestionar y registrar el usuario de BackOffice actual como activo de Cetelem
	* @return void
*/
function getionarUsuarioEcomenrce()
{

	/*/iniciamos el proceso de registro del usuario
	//* Se revisa si el usuario ya está registrado
	//* si no lo está , se intentará registrar
	//* Si ya está registrado, se revisa su estado y si esta como no activo, se modifica por PUT
	//* Si el usuario esta activo, no se hace nada
	*/
	if ( !is_user_logged_in() || !current_user_can( 'manage_options' ) ){return;}
	require_once plugin_dir_path(__FILE__) . 'includes/class/RegistroUsuarioEcomerce.php';

	// 1. Obtenemos el objeto del usuario actualmente conectado.
	$current_user = wp_get_current_user();

	// 2. Comprobamos que el usuario exista (ID no sea 0) y que sea administrador.
	if ( $current_user->ID != 0 && is_admin()) 
	{
		// Si es un admin, recogemos sus datos.
		$email     = $current_user->user_email;
		$nombre    = $current_user->first_name!=""?$current_user->first_name: explode("@",$email)[0];
		$apellidos = $current_user->last_name!=""?$current_user->last_name: explode("@",$email)[1];
		$urlTienda = get_home_url();

		RegistroUsuarioEcomerce::registrarUsuarioEcomerceCetelem
		(
			$nombre." ".$apellidos, $email,$urlTienda
		);
	}
}
//Registra los usuarios de emcomerce a nuestro sistema para tener un control sobre ello
add_action( 'admin_notices', 'getionarUsuarioEcomenrce' );



/*
Elimina todo rastro del plugin al desinstalarlo
*/
function cetelem_desinstalar()
{
	delete_option('woocommerce_cetelem_settings');
	delete_option('woocommerce_cetelem_cuotas_settings');
}
register_uninstall_hook(__FILE__, 'cetelem_desinstalar');


add_action('wp_enqueue_scripts', function() {
    if (!is_product()) {
        return;
    }

    global $product;
    if (!$product instanceof WC_Product) {
        return;
    }

    $configuracion = get_option('woocommerce_cetelem_settings', []);
    if (empty($configuracion) || $configuracion['activar'] !== 'yes') {
        return;
    }

    $precio = wc_get_price_to_display($product);
    $testing = isset($configuracion['testing']) && $configuracion['testing'] === 'no'
        ? 'https://eCommerceCalculadora.cetelem.es'
        : 'https://test.cetelem.es';

    $inline_js = sprintf(
        "window.server = '%s';
         window.codCentro = '%s';
         window.color = '%s';
         window.fontSize = '%s';
         window.codPromocion = '%s';
         window.listadoMeses = '%s';
         window.cantidad = '%s';
         window.material = '';
         window.variable = false;",
        esc_js($testing),
        esc_js($configuracion['codcentro'] ?? ''),
        esc_js($configuracion['color'] ?? '#000'),
        esc_js($configuracion['fuente'] ?? '12'),
        esc_js($configuracion['codigo'] ?? ''),
        esc_js(!empty($configuracion['meses']) ? $configuracion['meses'] : '3,6,12,18,24,36,42,48,60,120'),
        esc_js(number_format((float)$precio, 2, '.', ''))
    );
    wp_add_inline_script('jquery', $inline_js, 'after');
});
