<?php
/**
 * Archivo de control del cron de Compibot.
 *
 * Este archivo maneja la programación y ejecución de la tarea cron que verifica
 * el estado del servicio del usuario y los módulos activos.
 *
 * @package Compibot
 */

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

/**
 * Función cron que se ejecutará cada hora. La finalidad de este cron es que cada hora se vea si el servicio del usuario está activo
 * y además ver que módulos tiene activo el usuario.
 */
function compibot_register_cron_event() {
	if ( ! wp_next_scheduled( 'compibot_check_service_cron' ) ) {
		wp_schedule_event( time(), 'hourly', 'compibot_check_service_cron' );
	}
}

add_action( 'wp', 'compibot_register_cron_event' );

/**
 * Función cron que se ejecutará cada hora.
 *
 * Verifica si el servicio del usuario está activo y los módulos asociados.
 */
function compibot_check_service_cron_function() {
	// Lo primero que tenemos que hacer es recoger el token de la base de datos.
	$db_manager = new CompibotDatabaseManager();
	$token      = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

	if ( $token ) {
		// Si tenemos token, entonces llamamos a la función que verifica el estado del servicio.
		compibot_check_service_status_cron( $token );
	}
}

add_action( 'compibot_check_service_cron', 'compibot_check_service_cron_function' );

/**
 * Verifica el estado del servicio y los módulos activos del usuario.
 *
 * @param string $token       Token de autenticación del usuario.
 */
function compibot_check_service_status_cron( $token ) {
	// URL del endpoint.
	$api_url = 'https://panel.compibot.com/api/check-service/';

	$gmt_offset = get_option( 'gmt_offset' );
	if ( $gmt_offset ) {
		$gmt_offset = floatval( $gmt_offset );
	} else {
		$gmt_offset = 0;
	}

	// Hacemos la solicitud a la API.
	$response = wp_remote_post(
		$api_url,
		array(
			'body'    => wp_json_encode( array( 'gmt_offset' => $gmt_offset ) ),
			'headers' => array(
				'Content-Type'  => 'application/json',
				'Authorization' => 'Bearer ' . $token,
			),
		)
	);

	if ( is_wp_error( $response ) ) {
		// Aquí puedes manejar el error, por ejemplo, guardar un log.
		return;
	}

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

	// Comprobamos si active tiene valor.
	if ( isset( $data ) ) {
		$is_active = $data['active']; // Convertimos el estado del servicio a entero.

		// Obtenemos los módulos que tiene.
		$addons = array();

		$addons = isset( $data['addons'] ) && ! empty( $data['addons'] ) ? $data['addons'] : array();

		// Guardamos ambos valores en la base de datos.
        // @phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
		$db_manager = new CompibotDatabaseManager();
		$db_manager->compibot_update(
			array(
				'active'  => $is_active,
				'modulos' => wp_json_encode( $addons ),
			),
			array( 'id' => 1 )
		);
	}
}


/**
 * Elimina el evento cron cuando se desactiva el plugin.
 */
function compibot_remove_cron_event() {
	$timestamp = wp_next_scheduled( 'compibot_check_service_cron' );
	if ( $timestamp ) {
		wp_unschedule_event( $timestamp, 'compibot_check_service_cron' );
	}
}
register_deactivation_hook( __FILE__, 'compibot_remove_cron_event' );
