<?php
/**
 * Página de Login de Compibot.
 *
 * @package Compibot
 */

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

/**
 * Construye la URL de onboarding indicando que el plugin ya está instalado en WordPress.
 *
 * @return string
 */
function compibot_get_onboarding_register_url() {
	$site_domain = wp_parse_url( get_site_url(), PHP_URL_HOST );
	$return_url  = admin_url( 'admin.php?page=compibot_login&registration=completed' );
	$base_url    = 'https://panel.compibot.com/onboarding/';
	$query_args  = array(
		'source'               => 'wordpress-plugin',
		'origin'               => 'compibot-plugin',
		'installed_from_wp'    => '1',
		'skip_plugin_download' => '1',
		'redirect_to'          => $return_url,
	);

	if ( ! empty( $site_domain ) ) {
		$query_args['dominio'] = $site_domain;
	}

	return add_query_arg( $query_args, $base_url );
}

/**
 * Devuelve el mensaje a mostrar cuando el usuario vuelve del onboarding.
 *
 * @return string
 */
function compibot_get_registration_notice_message() {
	$registration_state = isset( $_GET['registration'] ) ? sanitize_text_field( wp_unslash( $_GET['registration'] ) ) : '';

	if ( 'completed' !== $registration_state ) {
		return '';
	}

	return 'La cuenta se ha creado correctamente. Continúa desde esta pantalla e inicia sesión con tus credenciales de Compibot.';
}

/**
 * Obtiene el correo enviado desde el formulario de login.
 *
 * @return string
 */
function compibot_get_login_request_email() {
	$email_keys = array(
		'compibot_email_input',
		'email',
	);

	foreach ( $email_keys as $email_key ) {
		if ( isset( $_POST[ $email_key ] ) ) {
			return sanitize_email( wp_unslash( $_POST[ $email_key ] ) );
		}
	}

	return '';
}

/**
 * Obtiene la contraseña enviada desde el formulario de login.
 *
 * @return string
 */
function compibot_get_login_request_password() {
	$password_keys = array(
		'compibot_password_input',
		'password',
	);

	foreach ( $password_keys as $password_key ) {
		if ( isset( $_POST[ $password_key ] ) ) {
			return sanitize_text_field( wp_unslash( $_POST[ $password_key ] ) );
		}
	}

	return '';
}

/**
 * Función para mostrar la página de login y manejar la lógica de autenticación.
 */
function compibot_login_page() {
	// Iniciar el buffer de salida para prevenir problemas de encabezados.
	$db_manager              = new CompibotDatabaseManager();
	$onboarding_register_url = compibot_get_onboarding_register_url();
	$registration_notice     = compibot_get_registration_notice_message();
	$submitted_email         = compibot_get_login_request_email();
	ob_start();
	global $wpdb;
	$table_name = $wpdb->prefix . 'compibot';

	// Si se ha enviado el formulario de inicio de sesión.
	if ( isset( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] && isset( $_POST['compibot_compibot_login_nonce'] ) ) {
		// 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    = $submitted_email;
		$password = compibot_get_login_request_password();

		// Lógica de autenticación del usuario.
		$login_response = compibot_login( $email, $password );

		// Verificar si hay un error.
		if ( isset( $login_response['error'] ) ) {
			// Mapeamos los errores a mensajes amigables.
			$error_messages = array(
				'Correo o contraseña incorrectos' => 'Error: El correo electrónico o la contraseña son incorrectos.',
				'Invalid service'                 => 'Error: Servicio no válido. Contacta al soporte técnico.',
				'User not found'                  => 'Error: No se encontró un usuario con ese correo electrónico.',
				'Error al conectar con la API'    => 'Error: No se pudo conectar con el servicio de autenticación. Inténtalo más tarde.',
				'Email y contraseña obligatorios' => 'Error: El correo electrónico y la contraseña son campos obligatorios.',
				'Origen no válido'                => 'Error: No hay datos para el dominio del usuario.',
			);
			$error_message  = isset( $error_messages[ $login_response['error'] ] ) ? $error_messages[ $login_response['error'] ] : 'Error: Ocurrió un problema durante el inicio de sesión.';

		} elseif ( isset( $login_response['token'] ) && isset( $login_response['public_token'] ) ) {
			// Si la autenticación es exitosa, actualizamos el token y el public_token en la base de datos.
			$new_token    = sanitize_text_field( $login_response['token'] );
			$public_token = sanitize_text_field( $login_response['public_token'] );
			$db_manager->compibot_update(
				array(
					'token'        => $new_token,
					'public_token' => $public_token,
					'active'       => 1,
				),
				array( 'id' => 1 )
			);

			// Limpia el buffer de salida antes de redirigir.
			ob_end_clean();

			// Redirigimos inmediatamente a la página principal del plugin.
			wp_safe_redirect( admin_url( 'admin.php?page=compibot' ) );
			exit; // Asegúrate de salir después para evitar más procesamiento.
		} else {
			// Utilizamos `add_settings_error` para mostrar el mensaje en lugar de `echo`.
			$error_message = 'Error inesperado: No se encontró el token en la respuesta.';
		}
	}

	// Asegúrate de que ob_start no se llama aquí si la redirección ha ocurrido.
	ob_start();
	// Formulario de inicio de sesión.
	?>
	<div class="login-container">
		<h2>Iniciar sesión en Compibot</h2>
		<p>Accede con las credenciales asociadas a tu cuenta de Compibot.</p>

		<?php if ( ! empty( $registration_notice ) ) : ?>
			<div class="notice notice-success" style="margin: 0 0 20px; padding: 12px 16px;">
				<p style="margin: 0;"><?php echo esc_html( $registration_notice ); ?></p>
			</div>
		<?php endif; ?>

		<!-- Mostrar mensaje de error si existe -->
		<?php if ( ! empty( $error_message ) ) : ?>
			<div class="error-message" style="color: red; font-weight: bold; margin-bottom: 20px;">
				<?php echo esc_html( $error_message ); ?>
			</div>
		<?php endif; ?>

		<form method="POST" action="" class="compibot-login-form" autocomplete="off" data-lpignore="true">
			<input type="hidden" name="compibot_compibot_login_nonce" value="<?php echo esc_attr( wp_create_nonce( 'compibot_compibot_login_action' ) ); ?>">
			<div class="compibot-autofill-decoy" aria-hidden="true">
				<label for="compibot_fake_username">Usuario</label>
				<input type="text" id="compibot_fake_username" name="compibot_fake_username" tabindex="-1" autocomplete="username">
				<label for="compibot_fake_password">Contraseña</label>
				<input type="password" id="compibot_fake_password" name="compibot_fake_password" tabindex="-1" autocomplete="current-password">
			</div>
			<div class="form-group">
				<label for="compibot_email">Correo electrónico:</label>
				<input type="email" id="compibot_email" name="compibot_email_input" value="<?php echo esc_attr( $submitted_email ); ?>" required autocomplete="off" autocapitalize="none" spellcheck="false" data-lpignore="true" class="compibot-real-credential" readonly>
			</div>
			<div class="form-group">
				<label for="compibot_password">Contraseña:</label>
				<input type="password" id="compibot_password" name="compibot_password_input" required autocomplete="new-password" data-lpignore="true" class="compibot-real-credential" readonly>
			</div>
			
			<div class="forgot-password" style="margin-bottom: 10px;">
				<a 
					style="text-decoration: none; color: #4b04d7;font-size:16px;"
					href="https://panel.compibot.com/password-reset"
					target="_blank"
				>
					Olvidé mi contraseña
				</a>
			</div>
			<div class="login-actions">
			<button type="submit" class="login-btn">Iniciar sesión</button>
				<a class="register-btn" href="<?php echo esc_url( $onboarding_register_url ); ?>" target="_blank" rel="noopener noreferrer">Registrarme</a>
			</div>
		</form>
	</div>
	<script>
		document.addEventListener('DOMContentLoaded', function () {
			var loginForm = document.querySelector('.compibot-login-form');

			if (!loginForm) {
				return;
			}

			var realFields = loginForm.querySelectorAll('.compibot-real-credential');
			var unlockFields = function () {
				realFields.forEach(function (field) {
					field.removeAttribute('readonly');
				});
			};

			realFields.forEach(function (field) {
				field.addEventListener('focus', unlockFields, { once: true });
				field.addEventListener('pointerdown', unlockFields, { once: true });
				field.addEventListener('keydown', unlockFields, { once: true });
			});
		});
	</script>
 
	<?php
	ob_end_flush();
}
