<?php
/**
 * Clase de administración de Compibot en WordPress.
 *
 * @package Compibot
 */

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

require_once plugin_dir_path( __FILE__ ) . '../manager/class-compibotdatabasemanager.php';

/**
 * Clase para gestionar la página de administración de Compibot en WordPress.
 */
class CompibotAdminPage {

	/**
	 * Instancia del gestor de base de datos.
	 *
	 * @var CompibotDatabaseManager
	 */
	private $db_manager;

	/**
	 * Constructor de la clase.
	 * Inicializa el gestor de base de datos y agrega acciones necesarias.
	 */
	public function __construct() {
		$this->db_manager = new CompibotDatabaseManager();
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
		add_action( 'wp_ajax_update_conversations', array( $this, 'compibot_handle_update_conversations' ) );
		add_action( 'wp_ajax_nopriv_update_conversations', array( $this, 'compibot_handle_update_conversations' ) );
		add_action( 'wp_ajax_update_info_section', array( $this, 'handle_update_info_section' ) );
		add_action( 'wp_ajax_nopriv_update_info_section', array( $this, 'handle_update_info_section' ) );
		add_action( 'wp_ajax_save_total_viewed', array( $this, 'save_total_viewed' ) );
	}

	/**
	 * Carga los estilos CSS para la página de administración.
	 */
	public function enqueue_styles() {
		  wp_enqueue_style( 'compibot-admin-css', plugin_dir_url( __FILE__ ) . '../assets/admin-page.css', array(), CompibotPlugin::VERSION );
	}

	/**
	 * Muestra la página de administración del plugin.
	 */
	public function display_page() {
		global $wpdb;

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

		// Comprobación de WP Rocket.
		CompibotWPCheckCache::check_and_warn();

		$token     = $this->db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );
		$is_active = $this->db_manager->compibot_select( 'active', 'plugin_is_active', 60 );

		if ( 0 === $is_active && '0' !== $token ) {
			echo '<div class="notice notice-error is-dismissible">';
			echo '<p>El servicio no se encuentra activo. Puede activarlo desde <a href="https://clientes.compibot.com" target="_blank">compibot.com</a>.</p>';
			echo '</div>';
		}

		$modulos_json = $this->db_manager->compibot_select( 'modulos', 'plugin_modulos', 60 );
		$modulos      = json_decode( is_string( $modulos_json ) ? stripslashes( $modulos_json ) : '', true );
		$modulos      = is_array( $modulos ) ? $modulos : array();

		$modulo_wordpress = is_array( $modulos ) && in_array( 'WordPress', $modulos, true );

		if ( isset( $_SERVER['REQUEST_METHOD'] ) && strtoupper( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) ) === 'POST' && isset( $_POST['scan_type'] ) ) {
			if ( ! isset( $_POST['scan_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['scan_nonce'] ) ), 'scan_action' ) ) {
				wp_die( esc_html( __( 'Error: Nonce verification failed.', 'compibot' ) ) );
			}
			$this->handle_scan_type_submission( $token );
		}

		$conversations = $this->get_chat_conversations( $token );
		$site_info     = $this->get_site_data( $token );
		$last_scan     = $this->db_manager->compibot_select( 'last_scan', 'plugin_last_scan', 60 );

		if ( ! function_exists( 'is_plugin_active' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		$is_woocommerce_active = is_plugin_active( 'woocommerce/woocommerce.php' );
		$selected_scan_type    = $this->db_manager->compibot_select( 'scan_type', 'plugin_selected_scan_type', 60 );

		include plugin_dir_path( __FILE__ ) . 'admin-page-template.php';
	}

	/**
	 * Maneja la recepción del tipo de escaneo seleccionado y lo guarda en la base de datos.
	 *
	 * @param string $token Token de autenticación del usuario.
	 * @return void
	 */
	private function handle_scan_type_submission( $token ) {
		if ( ! isset( $_POST['scan_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['scan_nonce'] ) ), 'scan_action' ) ) {
			wp_die( esc_html( __( 'Error: Nonce verification failed.', 'compibot' ) ) );
		}

		$scan_types = isset( $_POST['scan_type'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['scan_type'] ) ) : array();

		if ( is_array( $scan_types ) && isset( $scan_types[0] ) ) {
			$decoded_types = json_decode( stripslashes( $scan_types[0] ), true );
			$scan_types    = is_array( $decoded_types ) ? $decoded_types : array();
		}

		if ( is_array( $scan_types ) && ! empty( $scan_types ) ) {
			$scan_types = array_map( 'sanitize_text_field', $scan_types );
			$this->db_manager->compibot_update( array( 'scan_type' => implode( ',', $scan_types ) ), array( 'id' => 1 ) );
			$resultado = $this->perform_scan_based_on_type( $scan_types, $token );
			// TODO: Modificarlo para ennviar:.
				// status: loquesea.
		} else {
			echo '<p>Error: No se seleccionaron tipos de escaneo válidos.</p>';
		}
	}

	/**
	 * Ejecuta el escaneo basado en los tipos seleccionados.
	 *
	 * @param array  $scan_types Tipos de escaneo seleccionados.
	 * @param string $token      Token de autenticación del usuario.
	 * @return mixed Resultado del escaneo.
	 */
	private function perform_scan_based_on_type( $scan_types, $token ) {
		$scanner   = new CompibotScanner( $token );
		$resultado = $scanner->compibot_send_combined_data_batch( $scan_types );
		return $resultado;
	}

	/**
	 * Obtiene las conversaciones de chat registradas en el sistema.
	 *
	 * @param string $token Token de autenticación del usuario.
	 * @return mixed Conversaciones obtenidas.
	 */
	private function get_chat_conversations( $token ) {
		return compibot_get_chat_conversation( $token );
	}

	/**
	 * Obtiene información sobre el sitio web y su configuración.
	 *
	 * @param string $token Token de autenticación del usuario.
	 * @return array Información del sitio.
	 */
	private function get_site_data( $token ) {
		$scanner   = new CompibotScanner( $token );
		$site_data = array(
			'site_type'            => is_plugin_active( 'woocommerce/woocommerce.php' ) ? 'e-Commerce' : 'Blog',
			'installation_type'    => is_multisite() ? 'Multisite' : 'Standard',
			'total_items'          => $scanner->compibot_get_total_count(),
			'scanned_items'        => 0,
			'scanned_items_label'  => '0',
			'has_scanned_content'  => false,
			'show_total_reference' => true,
			'scan_counter_notice'  => '',
			'last_scan_date'       => 'No se ha realizado ningÃºn escaneo aÃºn',
			'kb_scanned'           => 0,
			'kb_total'             => 0,
			'kb_plan'              => 10000,
		);

		$scan_data = $this->db_manager->compibot_select_row( '*', 'plugin_scan_data', 60 );

		if ( '1' === $scan_data['active'] && $scan_data ) {
			$site_data['scanned_items']  = $scan_data['scanned_items'];
			$site_data['last_scan_date'] = $scan_data['last_scan'] ? date_i18n( 'j \d\e F \d\e Y, g:i A', strtotime( $scan_data['last_scan'] ) ) : 'No se ha realizado ningún escaneo aún';
		}

		return $site_data;
	}

	/**
	 * Maneja la actualización de las conversaciones en la página de administración.
	 *
	 * @return void
	 */
	public function compibot_handle_update_conversations() {
		$db_manager = new CompibotDatabaseManager();

		if ( ! isset( $_POST['compibot_update_conversations_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_update_conversations_nonce'] ) ), 'compibot_update_conversations_action' ) ) {
			wp_die( esc_html( __( 'Error: Nonce verification failed.', 'compibot' ) ) );
		}

		$intervalo   = isset( $_POST['intervalo'] ) ? sanitize_text_field( wp_unslash( $_POST['intervalo'] ) ) : 'ultimo mes';
		$page        = isset( $_POST['page'] ) ? intval( $_POST['page'] ) : 1; // Página solicitada.
		$order_array = isset( $_POST['order_array'] )
			? sanitize_text_field( wp_unslash( $_POST['order_array'] ) )
			: array( 'start_chatting_at' ); // Orden de las conversaciones.

		// Obtenemos el token asociado al usuario.
		$token = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

		// -- FUNCIÓN PARA PEDIR LOS DATOS A LA API --.
		$conversation_response = compibot_get_chat_conversation( $token, $intervalo, $page, $order_array );

		$conversations = $conversation_response['data'];

		$total_pages    = $conversation_response['total_pages'];
		$addons         = $conversation_response['addons'];
		$active_columns = array( 'date', 'status', 'conversation' );
		if ( in_array( 'summary', $addons, true ) ) {
			$active_columns[] = 'name';
			$active_columns[] = 'phone';
			$active_columns[] = 'mail';
			$active_columns[] = 'summary';
		}

		if ( in_array( 'sentimiento', $addons, true ) ) {
			$active_columns[] = 'feeling';
		}
		if ( in_array( 'compra', $addons, true ) ) {
			$active_columns[] = 'estimation';
		}

		unset( $conversations['addons'] );
		unset( $conversations['max_chatters'] );
		// Mostrar las conversaciones en la tabla.
		if ( empty( $conversations['conversations'] ) ) {
			echo '<p id="empty_conversations">No hay conversaciones registradas para ' . esc_attr( $intervalo ) . '.</p>';
		} else {
			echo '<tbody>';

			foreach ( $conversations as $conversation_list ) {
				foreach ( $conversation_list as $conversation_index => $conversation ) {

					if ( 'Finalizado' !== $conversation['status'] ) {
						echo '<tr class="row-chatting">';

						if ( ! empty( $conversation['start_chatting_at'] ) ) {
							// Divide la fecha y hora usando el separador "-".
							list($date, $time) = explode( ' - ', $conversation['start_chatting_at'] );

							// Imprime la fecha y hora en dos líneas.
							echo '<td data-label="Fecha">' . esc_html( $date ) . '<br><span class="time">' . esc_html( $time ) . '</span></td>';
						}

						echo '<td data-label="Estado">En curso</td>';
					} else {
						echo '<tr class="row-ended">';
						if ( ! empty( $conversation['start_chatting_at'] ) ) {
							// Divide la fecha y hora usando el separador " - ".
							list($date, $time) = explode( ' - ', $conversation['start_chatting_at'] );

							// Imprime la fecha y hora en dos líneas.
							echo '<td data-label="Fecha">' . esc_html( $date ) . '<br><span class="time">' . esc_html( $time ) . '</span></td>';
						}
						echo '<td data-label="Estado">' . esc_html( $conversation['status'] ) . '</td>';
					}

					if ( in_array( 'summary', $addons, true ) ) {
						echo '<td data-label="Nombre">' . esc_html( $conversation['name'] ) . '</td>';
						echo '<td data-label="Correo">' . esc_html( $conversation['mail'] ) . '</td>';
						echo '<td data-label="Teléfono">' . esc_html( $conversation['phone'] ) . '</td>';
						echo '<td data-label="Resumen">' . esc_html( $conversation['summary'] ) . '</td>';
					}

					if ( in_array( 'sentimiento', $addons, true ) ) {
						echo '<td data-label="Sentimiento">' . esc_html( $conversation['sentimiento'] ) . '</td>';
					}
					if ( in_array( 'compra', $addons, true ) ) {
						echo '<td data-label="Estimación">' . esc_html( $conversation['valor_compra'] ) . '</td>';
					}

					echo '<td class="toggle-column">
                        <button 
                            id="toggle-button-' . esc_attr( $conversation_index ) . '" 
                            class="open-conversation-button" 
                            data-chatter-id="' . esc_attr( $conversation['id'] ) . '"
                            data-viewed="' . esc_attr( $conversation['viewed'] ) . '"
                            onclick="handleBothFlows(' . esc_attr( $conversation_index ) . ')">
                            <i class="fa-solid fa-eye"></i> Abrir conversación
                        </button>
                    </td>';
					echo '</tr>';

					// Popup debajo de la conversación.
					echo '<tr id="popup-row-' . esc_attr( $conversation_index ) . '" class="popup-row" style="display:none;">';
					echo '<td id="open-conversation-row" colspan="' . count( $active_columns ) . '">';
					echo '<div class="popup-content"><ul>';

					foreach ( $conversation['conversation'] as $message ) {
						echo '<li>';
						// Mensaje del usuario.
						echo '<div class="message user-message">';
						echo '<span class="meta"><strong>' . ( esc_html( $conversation['name'] ) !== 'Desconocido' ? esc_html( $conversation['name'] ) : 'Usuario' ) . '</strong> ' . esc_html( $message['user_msg_time'] ) . '</span>';
						echo '<p>' . esc_html( $message['user_input'] ) . '</p>';
						echo '</div>';

						// Mensaje del bot.
						echo '<div class="message bot-message">';
						echo '<span class="meta"><strong>Compibot</strong> ' . esc_html( $message['bot_msg_time'] ) . '</span>';
						echo '<div class="bot-output-markdown">' . wp_kses_post( $message['bot_output'] ) . '</div>';
						echo '</div>';
						echo '</li>';
					}

					echo '</ul><button onclick="toggleConversation(' . esc_attr( $conversation_index ) . ')">Cerrar</button></div></td>';
					echo '</tr>';
				}
			}

			echo '</tbody>';
			if ( $total_pages > 1 ) {
				// Paginación con puntos suspensivos y primeras/últimas páginas.
				echo '<div class="pagination" style="text-align: center; margin-top: 20px;">';

				if ( $page > 1 ) {
					echo '<button onclick="changePage(' . esc_attr( ( $page - 1 ) ) . ')">Anterior</button>';
				}

				// Siempre muestra la primera página.
				echo '<button onclick="changePage(1)" ' . ( 1 === $page ? 'class="active"' : '' ) . '>1</button>';

				// Mostrar puntos suspensivos después de la primera página si la página actual está lejos.
				if ( $page > 3 ) {
					echo '<span>...</span>';
				}

				// Páginas cercanas a la página actual.
				$start = max( 2, $page - 1 );
				$end   = min( $total_pages - 1, $page + 1 );

				for ( $i = $start; $i <= $end; $i++ ) {
					echo '<button onclick="changePage(' . esc_attr( $i ) . ')" ' . ( $page === $i ? 'class="active"' : '' ) . '>' . esc_attr( $i ) . '</button>';
				}

				// Mostrar puntos suspensivos si la página actual está lejos del final.
				if ( $page < $total_pages - 2 ) {
					echo '<span>...</span>';
				}

				// Mostrar siempre la última página si es mayor que 1.
				if ( $total_pages > 1 ) {
					echo '<button onclick="changePage(' . esc_attr( $total_pages ) . ')" ' . ( $page === $total_pages ? 'class="active"' : '' ) . '>' . esc_attr( $total_pages ) . '</button>';
				}

				if ( $page < $total_pages ) {
					echo '<button onclick="changePage(' . esc_attr( $page + 1 ) . ')">Siguiente</button>';
				}

				echo '</div>';
			}
		}

		// Detener la ejecución para evitar que se imprima algo más.
		wp_die();
	}

	/**
	 * Maneja la actualización de la sección de información en la página de administración.
	 *
	 * @return void
	 */
	public function handle_update_info_section() {
		if ( ! isset( $_POST['compibot_update_info_section_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_update_info_section_nonce'] ) ), 'compibot_update_info_section_action' ) ) {
			wp_die( esc_html( __( 'Error: Nonce verification failed.', 'compibot' ) ) );
		}

		$month = isset( $_POST['month'] ) ? sanitize_text_field( wp_unslash( $_POST['month'] ) ) : '';
		$year  = isset( $_POST['year'] ) ? intval( sanitize_text_field( wp_unslash( $_POST['year'] ) ) ) : 0;

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

		$infosection_response = compibot_get_monthly_info( $token, $month, $year );

		wp_send_json( $infosection_response );
	}

	/**
	 * Guarda el valor de totalViewed en la base de datos.
	 *
	 * @return void
	 */
	public function save_total_viewed() {
		if ( ! isset( $_POST['compibot_save_total_viewed_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_save_total_viewed_nonce'] ) ), 'compibot_save_total_viewed_action' ) ) {
			wp_send_json_error( array( 'message' => 'Nonce inválido.' ), 403 );
		}

		$total_viewed = isset( $_POST['total_viewed'] ) ? intval( sanitize_text_field( wp_unslash( $_POST['total_viewed'] ) ) ) : 0;

		if ( is_numeric( $total_viewed ) && $total_viewed >= 0 ) {
			set_transient( 'compibot_unread_count', $total_viewed, 60 * 5 );
			wp_send_json_success( array( 'message' => 'Valor de totalViewed guardado correctamente.' ) );
		} else {
			wp_send_json_error( array( 'message' => 'No se recibió un valor válido de totalViewed.' ), 400 );
		}
	}

	/**
	 * Muestra el botón de escaneo o un mensaje de error.
	 */
	public function compibot_display_scan_button_or_message() {
		$db_manager = new CompibotDatabaseManager();

		$modulos = $db_manager->compibot_select( 'modulos', 'plugin_modulos', 60 );

		// Arreglo del error - Deprecated: stripslashes(): Passing null to parameter #1 ($string) of type string is deprecated.
		$modulos_json_cleaned = isset( $modulos_json ) && is_string( $modulos_json ) ? stripslashes( $modulos_json ) : '';

		$modulos = json_decode( $modulos_json_cleaned, true );
		$modulos = is_array( $modulos ) ? $modulos : array();

		$modulo_wordpress = is_array( $modulos ) && in_array( 'WordPress', $modulos, true );

		$last_scan = $db_manager->compibot_select( 'last_scan', 'plugin_last_scan', 60 );

		// Control de tiempo | Arreglo de - strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated.
		$last_scan_date = ! empty( $last_scan ) ? strtotime( $last_scan ) : false;

		echo '<form method="POST" id="scan-form" action="">';

		// Campos ocultos que serán rellenados dinámicamente.
		echo '<input type="hidden" name="scan_type[]" id="scan-type-hidden">';

		echo '<input type="hidden" name="scan_nonce" value="' . esc_attr( wp_create_nonce( 'scan_action' ) ) . '">';
		echo '<button type="submit" class="btn-scan">Realizar escaneo</button>';

		// Contenedor para el spinner (inicialmente oculto).
		echo '<span id="compibot-scan-spinner" class="compibot-spinner-loader" style="display: none;"></span>';

		echo '</form>';
		
	}
}

new CompibotAdminPage();
