<?php
/**
 * Manejo de la creación y verificación de tablas en Compibot.
 *
 * Este archivo contiene funciones para crear la tabla del plugin en la base de datos,
 * verificar la validez del token y gestionar la conexión con la API de Compibot.
 *
 * @package Compibot
 */

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

/**
 * Crea la tabla necesaria para el plugin en la base de datos.
 *
 * Esta función usa `dbDelta()` para crear la tabla si no existe y almacena datos iniciales
 * si es necesario.
 *
 * @return void
 */
function compibot_compibot_create_table() {
	global $wpdb;
	$table_name      = $wpdb->prefix . 'compibot';
	$charset_collate = $wpdb->get_charset_collate();

	$sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        token varchar(255) DEFAULT '0' NOT NULL,
        public_token varchar(255) DEFAULT '0' NOT NULL,
        active tinyint(1) DEFAULT '0' NOT NULL,
        replace_flag tinyint(1) DEFAULT '0' NOT NULL,
        last_scan datetime DEFAULT NULL,
        modulos TEXT DEFAULT NULL,
        site_type varchar(20) DEFAULT NULL,
        scanned_items int(20) DEFAULT '0',
        scan_type TEXT DEFAULT NULL,
        kb_scanned float(10, 2) DEFAULT '0.00',
        kb_total float(10, 2) DEFAULT '0.00',
        kb_plan float(10, 2) DEFAULT '0.00',
        total_viewed int(20) DEFAULT '0',
        PRIMARY KEY (id)
    ) $charset_collate;";

	require_once ABSPATH . 'wp-admin/includes/upgrade.php';
	dbDelta( $sql );

	// Verificamos si ya existe una fila con el id = 1.
	$db_manager = new CompibotDatabaseManager();
	$exists     = $db_manager->compibot_select( 'COUNT(*)', 'plugin_exists_compibot', 3600 );

	if ( '0' === $exists ) {
		// Si no existe, entonces insertamos una fila con valores por defecto.
		$inserted_id = $db_manager->compibot_insert(
			array(
				'token'  => '0',
				'active' => 0,
			),
			array( '%s', '%d' ) // Formatos para la seguridad de los datos (cadena, entero).
		);
	}

	// Verificamos si Woocommerce se encuentra instalado en el entorno donde se está activando el plugin.
	if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
		$site_type = 'woocommerce';
	} else {
		$site_type = 'blog';
	}

	// Guardamos el valor en la base de datos que acabamos de crear.
	$db_manager->compibot_update(
		array( 'site_type' => $site_type ),
		array( 'id' => 1 )
	);
}

/**
 * Verifica el tipo de inicio de sesión y actualiza el token en la base de datos.
 *
 * @return void
 */
function compibot_select_type_login() {
	$db_manager = new CompibotDatabaseManager();
	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	$token       = '';
	$site_domain = isset( $_SERVER['HTTP_HOST'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : '';

	if ( ! empty( $token ) ) {
		$service_check = compibot_check_token_in_django( $token, $site_domain );

		if ( 'success' === $service_check['status'] ) {
			// Esto implica que el token tiene asociado un service válido, por lo que ese service es el que corresponde al usuario.

			// Si la respuesta incluye el "public_token", lo actualizamos junto con el token.
			$public_token = isset( $service_check['public_token'] ) ? sanitize_text_field( $service_check['public_token'] ) : '0';

			$db_manager->compibot_update(
				array(
					'token'        => $token,
					'public_token' => $public_token,
					'active'       => 1,
				),
				array( 'id' => 1 ),
				array( '%s', '%s', '%d' ),
				array( '%d' )
			);

		} else {
			// El servicio no es válido, por lo que se mostrará un mensaje de error.
			wp_die( 'El servicio no es válido. Por favor, contacta al soporte técnico. Error XXXXX' );
		}
	}
}


/**
 * Verifica la validez del token a través de la API de Compibot.
 *
 * @param string $token       Token a verificar.
 * @param string $site_domain Dominio del sitio donde está instalado el plugin.
 * @return array Respuesta de la API con el estado del token.
 */
function compibot_check_token_in_django( $token, $site_domain ) {

	// URL de la API de Django que se encarga de verificar si el token es válido.
	$url = 'https://panel.compibot.com/api/verify-token/';

	$version = CompibotPlugin::VERSION; // Versión del plugin.
	$cms     = 'WordPress'; // Definimos el CMS como WordPress.

	// Datos que se van a enviar a la API de Django en la solicitud POST.
	$data = wp_json_encode(
		array(
			'token'       => $token,
			'site_domain' => $site_domain,
			'cms'         => $cms,
			'version'     => $version,
		)
	);

	// Realizamos la solicitud POST a la API de Django.
	$response = wp_remote_post(
		$url,
		array(
			'method'  => 'POST',
			'body'    => $data,
			'headers' => array( 'Content-Type' => 'application/json' ),
		)
	);

	// Comprobamos si hubo error en la solicitud.
	if ( is_wp_error( $response ) ) {
		return array(
			'status'  => 'error',
			'message' => 'Error al conectar con la API',
		);
	}

	// Obtenemos la respuesta de la API de Django.
	$body   = wp_remote_retrieve_body( $response );
	$result = json_decode( $body, true ); // Decodificamos el JSON.

	// Devolvemos el resultado (debe contewner un campo "status" con "success" o "error").
	if ( $result && isset( $result['status'] ) ) {
		// TODO: Obtener el public_token de la respuesta.
		return array(
			'status'       => isset( $result['status'] ) ? $result['status'] : 'error',
			'public_token' => isset( $result['public_token'] ) ? $result['public_token'] : '0',
		);
		// Devolvemos la respuesta de Django.
	} else {
		return array(
			'status'  => 'error',
			'message' => 'Respuesta inválida del servidor.',
		);
	}
}
