<?php
/**
 * Manejo del inicio de sesión y autenticación en Compibot.
 *
 * Este archivo gestiona el formulario de inicio de sesión del usuario, la autenticación con la API
 * y el almacenamiento del token en la base de datos.
 *
 * @package Compibot
 */

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

define( 'COMPIBOT_API_BASE_URL', 'https://panel.compibot.com/api/' );

/**
 * Maneja el inicio de sesión del usuario y gestiona el token de autenticación.
 *
 * Si la autenticación es exitosa, almacena el token en la base de datos y redirige al usuario.
 * En caso de error, muestra un mensaje adecuado.
 *
 * @return void
 */
function compibot_compibot_login_form_handler() {
	$db_manager = new CompibotDatabaseManager();
	ob_start();
	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	if ( 'POST' === isset( $_SERVER['REQUEST_METHOD'] ) && sanitize_text_field( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) ) {

		// Verificamos el nonce.
		if ( ! isset( $_POST['compibot_compibot_login_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['compibot_compibot_login_nonce'] ) ), 'compibot_compibot_login_action' ) ) {
			wp_die( 'Permiso denegado: solicitud no válida.' );
		}
		$email    = isset( $_POST['email'] ) ? sanitize_email( wp_unslash( $_POST['email'] ) ) : '';
		$password = isset( $_POST['password'] ) ? sanitize_text_field( wp_unslash( $_POST['password'] ) ) : '';

		if ( ! is_email( $email ) ) {
			echo '<p>Error: El formato del correo electrónico no es válido</p>';
			return;
		}

		// Llamamos a la función para autenticar con la API.
		$login_response = compibot_login( $email, $password );

		if ( isset( $login_response['error'] ) ) {

			// Usamos una función centralizada para mostrar errores.
			compibot_compibot_show_error( $login_response['error'] );

		} elseif ( isset( $login_response['service'] ) && isset( $login_response['service']['token'] ) ) {
			// Si el login es exitoso, actualizamos el token en la base de datos.
			$new_token = sanitize_text_field( $login_response['service']['token'] );
			$updated   = $db_manager->compibot_update(
				array( 'token' => $new_token ),
				array( 'id' => 1 )
			);

			if ( false === $updated ) {
				compibot_compibot_show_error( 'Error al actualizar el token en la base de datos' );
			}

			// Logica adicional, como el manejo de la flag "boarded".
			compibot_compibot_finish_boarded( $new_token );

			// Redirigimos a inicio para cargar los datos necesarios.
			wp_safe_redirect( admin_url( 'admin.php?page=compibot' ) );
			exit; // Importante: Evitar más procesamiento después de la redirección.
		} else {
			compibot_compibot_show_error( 'Error inesperado: No se encontró el token en la respuesta' );
		}
	} else {
		// Mostramos el formulario si no se ha enviado aún.
		require_once plugin_dir_path( __FILE__ ) . '../admin/login-form.php';
	}
}

/**
 * Muestra mensajes de error en el formulario de inicio de sesión.
 *
 * @param string $message Mensaje de error a mostrar.
 * @return void
 */
function compibot_compibot_show_error( $message ) {
	echo '<div class="error-message" style="color: red; font-weight: bold; margin-bottom: 20px;">' . esc_html( $message ) . '</div>';
}

/**
 * Realiza la autenticación con la API de Compibot.
 *
 * @param string $email    Correo electrónico del usuario.
 * @param string $password Contraseña del usuario.
 * @return array Datos de autenticación o mensaje de error.
 */
function compibot_login( $email, $password ) {

	// Obtenemos los datos del plugin, incluyendo la versión.
	$version = CompibotPlugin::VERSION;
	$cms     = 'WordPress'; // Definimos el CMS como WordPress.

	// Obtenemos el dominio donde se está instalando el plugin.
	$domain = wp_parse_url( get_site_url(), PHP_URL_HOST );

	// Endpoint de la API.
	$url = COMPIBOT_API_BASE_URL . 'wp-login/';

	// Datos que se enviarán a la API.
	$body = wp_json_encode(
		array(
			'email'    => $email,
			'password' => $password,
			'cms'      => $cms,
			'version'  => $version,
			'domain'   => $domain,
		)
	);

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

	// Verificamos si hay algún error en la solicitud.
	if ( is_wp_error( $response ) ) {
		return array( 'error' => 'Error al conectar con la API' );
	}

	// Decodificamos la respuesta JSON.
	$data = json_decode( wp_remote_retrieve_body( $response ), true );

	if ( isset( $data['error'] ) ) {
		return array( 'error' => $data['error'] );

	}
	// TODO: Obtener el public_token de la respuesta.
	$token        = isset( $data['service']['token'] ) ? $data['service']['token'] : '0';
	$public_token = isset( $data['service']['public_token'] ) ? $data['service']['public_token'] : '0';

	return array(
		'token'        => $token,
		'public_token' => $public_token,
		'message'      => $data['message'],
	);
}

/**
 * Marca la cuenta como configurada en la API de Compibot.
 *
 * @param string $token Token de autenticación del usuario.
 * @return void
 */
function compibot_compibot_finish_boarded( $token ) {
	$url = COMPIBOT_API_BASE_URL . 'finish-boarded';
	wp_remote_post(
		$url,
		array(
			'method'  => 'POST',
			'body'    => wp_json_encode( array( 'token' => $token ) ),
			'headers' => array( 'Content-Type' => 'application/json' ),
		)
	);
}
