<?php
/**
 * Manejo del estado del servicio y configuración del plugin Compibot.
 *
 * Este archivo contiene funciones para verificar el estado del servicio en la API de Compibot,
 * comprobar la versión del plugin, y gestionar configuraciones avanzadas.
 *
 * @package Compibot
 */

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

/**
 * Verifica el estado del servicio en la API de Compibot y actualiza la base de datos.
 *
 * @param string $token Token de autenticación del usuario.
 * @return string Estado del servicio ('active' o 'inactive').
 */
function compibot_check_service_status( $token ) {
	$db_manager = new CompibotDatabaseManager();
	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	$api_url  = 'https://panel.compibot.com/api/check-service/';
	$cms_name = 'WordPress';

	$response = wp_remote_post(
		$api_url,
		array(
			'body'    => wp_json_encode( array( 'token' => $token ) ),
			'headers' => array( 'Content-Type' => 'application/json' ),
		)
	);

	if ( is_wp_error( $response ) ) {
		return 'inactive'; // Si hay algún error en la llamada lo tratamos como inactivo.
	}

	$body = wp_remote_retrieve_body( $response );
	$data = json_decode( $body, true );

	if ( isset( $data['service']['active'] ) ) {
		// Actualizamos el campo "active" en la base de datos de WordPress.
		$is_active = (int) $data['service']['active']; // Lo convertimos si o si en entero.

		// Actualizamos la base de datos con el valor de "active".
		$db_manager->compibot_update(
			array( 'active' => $is_active ),
			array( 'id' => 1 )
		);

		// Si el servicio se encuentra activo en ese caso es cuando solo sacamos la versión del plugin.
		if ( 1 === $is_active ) {
			check_plugin_version( $cms_name );

			$addons = array();

			// Verificamos si hay addons disponibles en la respuesta.
			if ( isset( $data['service']['addons'] ) && ! empty( $data['service']['addons'] ) ) {
				// Addons es una lista de módulos.
				$addons = $data['service']['addons'];
			}
			// Guardamos los addons en la base de datos en formato JSON.
			$db_manager->compibot_update(
				array( 'modulos' => wp_json_encode( $addons ) ),
				array( 'id' => 1 )
			);
		}

		return 1 === $is_active ? 'active' : 'inactive';
	}

	return 'inactive';
}

// Hook para realizar la comprobación de la versión del plugin en el área de administración.
add_action( 'admin_init', 'compibot_check_plugin_version_conditionally' );

/**
 * Verifica la versión del plugin si estamos en la página de configuración de Compibot.
 *
 * @return void
 */
function compibot_check_plugin_version_conditionally() {
	// Verifica que estamos en la página de administración de compibot.
	// wp_unslash y sanitize_text_field son funciones de seguridad para evitar ataques XSS.

    // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';

	if ( 'compibot' === $page ) {
		compibot_compibot_check_plugin_version();
	}
}

/**
 * Verifica si hay una nueva versión disponible del plugin Compibot.
 *
 * Si hay una nueva versión, muestra un aviso en el panel de administración de WordPress.
 *
 * @return void
 */
function compibot_compibot_check_plugin_version() {
	$db_manager = new CompibotDatabaseManager();

	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	// Comprobar si el usuario actual tiene permisos de administrador.
	if ( ! current_user_can( 'manage_options' ) ) {
		return;
	}

	$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	if ( '0' === $token ) {
		return; // Si no hay token, no hacemos nada.
	}

	// Definir el nombre del CMS, por ejemplo, 'WordPress'.
	$cms_name = 'WordPress';

	// Obtenemos la versión actual del plugin.
	$version         = CompibotPlugin::VERSION; // Versión del plugin.
	$current_version = $version;

	// URL del endpoint de Django para obtener la última versión del plugin.
	$version_check_url = 'https://panel.compibot.com/api/get-latest-plugin-version/';

	// Hacemos la solicitud POST para obtener la versión más reciente.
	$response = wp_remote_post(
		$version_check_url,
		array(
			'body'    => wp_json_encode(
				array(
					'cms'             => $cms_name,
					'current_version' => $current_version, // Enviamos la versión actual.
				)
			),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	// Verificamos si hay un error en la solicitud.
	if ( is_wp_error( $response ) ) {
		return; // Si hay un error, salimos de la función.
	}

	$body = wp_remote_retrieve_body( $response );
	$data = json_decode( $body, true );

	if ( isset( $data['version'] ) ) {
		$latest_version = $data['version'];

		// Comprobar si la versión actual es diferente de la última versión.
		if ( $current_version !== $latest_version ) {
			// Mostrar un mensaje de aviso en el panel de administración.
			add_action(
				'admin_notices',
				function () use ( $latest_version, $token ) {
					$domain = isset( $_SERVER['SERVER_NAME'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_NAME'] ) ) : '';

					// Cambio solicitado por el phpcs.
					// urlencode() should only be used when dealing with legacy applications rawurlencode() should now be used instead.
					$encoded_token = rawurlencode( $token );
					$download_url  = "https://panel.compibot.com/validate-download/?token={$encoded_token}&domain={$domain}";
					echo '<div class="notice notice-warning is-dismissible">';
					echo '<p><strong>' . esc_html( '¡Nueva versión disponible!' ) . '</strong> ' .
					esc_html__( 'Hay una nueva versión de Compibot disponible', 'compibot' ) . ' (' .
					esc_html( $latest_version ) . '). <a href="' . esc_url( $download_url ) . '" target="_blank">' .
					esc_html( 'Haz clic aquí para descargarla' ) . '</a>.</p>';
					echo '</div>';
				}
			);
		} else {
			// Mostrar un mensaje indicando que el plugin está actualizado.
			add_action(
				'admin_notices',
				function () {
					echo '<div class="notice notice-success is-dismissible">';
					echo '<p>El plugin Compibot está actualizado a la última versión.</p>';
					echo '</div>';
				}
			);
		}
	}
}

/**
 * Guarda la configuración del plugin Compibot en la base de datos y la API.
 *
 * Esta función valida y sanitiza los datos del formulario enviados por el usuario,
 * luego los almacena en la base de datos y los envía a la API de Compibot.
 *
 * @return void
 */
function compibot_save_settings() {

	$db_manager = new CompibotDatabaseManager();

	global $wp_filesystem;
	if ( ! is_object( $wp_filesystem ) ) {
		require_once ABSPATH . 'wp-admin/includes/file.php';
		WP_Filesystem();
	}

	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	// Validar el nonce para proteger contra CSRF.
	if ( ! isset( $_POST['compibot_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_nonce'] ) ), 'compibot_save_settings_action' ) ) {
		wp_die( 'Permiso denegado: solicitud no válida.' );
	}

	$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	// Verificamos y "sanitizamos" los valores recibidos del formulario.
	$compibot_status = isset( $_POST['compibot_status'] ) ? intval( $_POST['compibot_status'] ) : 0;

	$chat_location = isset( $_POST['compibot-location'] ) ? sanitize_text_field( wp_unslash( $_POST['compibot-location'] ) ) : 'right';

	$notify_on_conversation_end = isset( $_POST['notify_on_conversation_end'] ) ? 1 : 0;

	$notify_on_conversation_start = isset( $_POST['notify_on_conversation_start'] ) ? 1 : 0;

	$compibot_site_name = isset( $_POST['compibot_site_name'] ) ? sanitize_text_field( wp_unslash( $_POST['compibot_site_name'] ) ) : 'compibot';

	$compibot_bot_name = isset( $_POST['compibot_bot_name'] ) ? sanitize_text_field( wp_unslash( $_POST['compibot_bot_name'] ) ) : 'compibot';

	$compibot_color = isset( $_POST['compibot_icon_style'] ) ? sanitize_text_field( wp_unslash( $_POST['compibot_icon_style'] ) ) : 'default';

	$compibot_mensaje_bienvenida = isset( $_POST['compibot_bot_bienvenida'] ) ? sanitize_text_field( wp_unslash( $_POST['compibot_bot_bienvenida'] ) ) : '';

	// Código para subir la imagen del icono y convertirla en Base64.
	$compibot_icon_base64 = '';

	if ( ! empty( $_FILES['compibot_icon']['tmp_name'] ) ) {
		$uploaded_file          = array_map( 'sanitize_text_field', wp_unslash( $_FILES['compibot_icon'] ) );
		$uploaded_file['name']  = sanitize_file_name( $uploaded_file['name'] ); // El nombre del archivo requiere sanitización especial.
		$uploaded_file['type']  = sanitize_mime_type( $uploaded_file['type'] ); // Sanitiza el tipo MIME.
		$uploaded_file['error'] = intval( $uploaded_file['error'] ); // Convierte en entero.
		$uploaded_file['size']  = intval( $uploaded_file['size'] ); // Convierte en entero.
		$file_type              = mime_content_type( $uploaded_file['tmp_name'] );

		$allowed_types = array( 'image/png', 'image/jpeg', 'image/jpg', 'image/webp' );
		if ( ! in_array( $file_type, $allowed_types, true ) ) {
			wp_die( 'Error: el archivo no es una imagen válida.' );
		}

		// Obtenemos el contenido de la imagen.
		$image_data = $wp_filesystem->get_contents( $uploaded_file['tmp_name'] );

		// Se usa base64_encode() de manera legítima para convertir la imagen en un formato base64.
		// que se utilizará en la interfaz sin almacenar archivos en el servidor.
		// No se emplea para ofuscar código ni con fines maliciosos.
		// Se desactiva la advertencia de PHPCS ya que su uso es seguro y justificado.
		// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
		$compibot_icon_base64 = 'data:' . $file_type . ';base64,' . base64_encode( $image_data );

	}

	// Realizamos la llamada a la API para enviar las configuraciones.
	$response = wp_remote_post(
		'https://panel.compibot.com/api/set-cms-config/',
		array(
			'body'    => wp_json_encode(
				array(
					'compibot_status'              => $compibot_status,
					'chat_location'                => $chat_location,
					'notify_on_conversation_end'   => $notify_on_conversation_end,
					'notify_on_conversation_start' => $notify_on_conversation_start,
					'site_name'                    => $compibot_site_name,
					'bot_name'                     => $compibot_bot_name,
					'color'                        => $compibot_color,
					'site_logo'                    => $compibot_icon_base64,
					'mensaje_bienvenida'           => $compibot_mensaje_bienvenida,

				)
			),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	// Procesamos la respuesta de la API.
	if ( is_wp_error( $response ) ) {
		wp_die( 'Error en la solicitud a la API: ' . esc_html( $response->get_error_message() ) );
	} else {
		$nonce = wp_create_nonce( 'compibot_save_settings_action' );
		// Redirige de vuelta a la página de configuraciones con un mensaje de éxito.
		wp_safe_redirect( admin_url( 'admin.php?page=compibot&status=success&_wpnonce=' . $nonce ) );
		exit;
	}
}

/**
 * Guarda la configuración del prompt en la API de Compibot.
 *
 * Esta función valida y sanitiza los datos del formulario enviados por el usuario
 * para personalizar los prompts de interacción con el bot, luego los envía a la API de Compibot.
 *
 * @return void
 */
function compibot_save_prompt() {
	if ( ! isset( $_POST['compibot_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_nonce'] ) ), 'compibot_save_prompt_action' ) ) {
		wp_die( 'Permiso denegado: solicitud no válida.' );
	}

	$db_manager = new CompibotDatabaseManager();

	$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	// Verificamos y "sanitizamos" los valores recibidos del formulario.
	$pr_option1 = isset( $_POST['pr_option1_mod1'] ) ? intval( $_POST['pr_option1_mod1'] ) : 0;

	$pr_option2 = isset( $_POST['pr_option2_mod1'] ) ? intval( $_POST['pr_option2_mod1'] ) : 0;

	$pr_option3 = isset( $_POST['pr_option3_mod1'] ) ? intval( $_POST['pr_option3_mod1'] ) : 0;

	$pr_custom_section = isset( $_POST['pr_custom_section_mod1'] ) ? sanitize_text_field( wp_unslash( $_POST['pr_custom_section_mod1'] ) ) : '';

	// Realizamos la llamada a la API para enviar las configuraciones.
	$response = wp_remote_post(
		'https://panel.compibot.com/api/set-pr-config/',
		array(
			'body'    => wp_json_encode(
				array(
					'pr_option1'        => $pr_option1,
					'pr_option2'        => $pr_option2,
					'pr_option3'        => $pr_option3,
					'pr_custom_section' => $pr_custom_section,

				)
			),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	// Procesamos la respuesta de la API.
	if ( is_wp_error( $response ) ) {
		wp_die( 'Error en la solicitud a la API: ' . esc_html( $response->get_error_message() ) );
	} else {
		$nonce = wp_create_nonce( 'compibot_save_settings_action' );

		set_transient( 'compibot_update_options_status', true, 30 );
		// Redirige de vuelta a la página de configuraciones con un mensaje de éxito.
		wp_safe_redirect( admin_url( 'admin.php?page=compibot' ) );
		exit;
	}
}

/**
 * Guarda la configuración del módulo de horarios en la API de Compibot.
 *
 * @return void
 */
function compibot_save_hours_module() {
	if ( ! isset( $_POST['compibot_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_nonce'] ) ), 'compibot_save_hours_module_action' ) ) {
		wp_die( 'Permiso denegado: solicitud no válida.' );
	}

	$db_manager = new CompibotDatabaseManager();

	// Obtenemos los datos que vamos a pasar a la API.
	$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	// Array de días de la semana.
	// Ejemplo: [dias_semana] => Mar,Mié,Jue,Vie.
	$dias_semana = isset( $_POST['dias_semana'] ) ? sanitize_text_field( wp_unslash( $_POST['dias_semana'] ) ) : '';

	// Horario de inicio.
	$hora_inicio = isset( $_POST['horas_inicio'] ) ? sanitize_text_field( wp_unslash( $_POST['horas_inicio'] ) ) : '00:00';

	// Horario de fin.
	$hora_fin = isset( $_POST['horas_fin'] ) ? sanitize_text_field( wp_unslash( $_POST['horas_fin'] ) ) : '23:59';

	// Acción fuera del horario registrado.
	$accion = isset( $_POST['accion_horario'] ) ? sanitize_text_field( wp_unslash( $_POST['accion_horario'] ) ) : 'hidden';

	// Mensaje fuera del horario registrado.
	$message = isset( $_POST['mensaje_fuera_horario'] ) ? sanitize_text_field( wp_unslash( $_POST['mensaje_fuera_horario'] ) ) : '';

	if ( '' === $dias_semana ) {
		$dias_semana = array();
	} else {
		$dias_semana = explode( ',', $dias_semana );
	}

	$horas = array( $hora_inicio, $hora_fin );

	// Realizamos la llamada a la API para enviar las configuraciones.
	$response = wp_remote_post(
		'https://panel.compibot.com/api/set-sch-config/',
		array(
			'body'    => wp_json_encode(
				array(
					'dias_semana' => $dias_semana,
					'horas'       => $horas,
					'accion'      => $accion,
					'message'     => $message,
				)
			),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	// Procesamos la respuesta de la API.
	if ( is_wp_error( $response ) ) {
		wp_die( 'Error en la solicitud a la API: ' . esc_html( $response->get_error_message() ) );
	} else {
		$nonce = wp_create_nonce( 'compibot_save_settings_action' );

		set_transient( 'compibot_update_options_status', true, 30 );
		// Redirige de vuelta a la página de configuraciones con un mensaje de éxito.
		wp_safe_redirect( admin_url( 'admin.php?page=compibot' ) );
		exit;
	}
}

/**
 * Guarda la configuración del módulo de razonamiento avanzado en la API de Compibot.
 *
 * @return void
 */
function compibot_save_comportamiento_module() {
	if ( ! isset( $_POST['compibot_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_nonce'] ) ), 'compibot_save_comportamiento_module_action' ) ) {
		wp_die( 'Permiso denegado: solicitud no válida.' );
	}

	$db_manager = new CompibotDatabaseManager();

	// Obtenemos los datos que vamos a pasar a la API.
	$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	$enabled = isset( $_POST['enabled'] ) ? intval( $_POST['enabled'] ) : 0;

	// Realizamos la llamada a la API para enviar las configuraciones.
	$response = wp_remote_post(
		'https://panel.compibot.com/api/set-th-config/',
		array(
			'body'    => wp_json_encode(
				array(
					'enabled' => $enabled,
				)
			),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	// Procesamos la respuesta de la API.
	if ( is_wp_error( $response ) ) {
		wp_die( 'Error en la solicitud a la API: ' . esc_html( $response->get_error_message() ) );
	} else {
		$nonce = wp_create_nonce( 'compibot_save_settings_action' );

		set_transient( 'compibot_update_options_status', true, 30 );
		// Redirige de vuelta a la página de configuraciones con un mensaje de éxito.
		wp_safe_redirect( admin_url( 'admin.php?page=compibot' ) );
		exit;
	}
}
