<?php
/**
 * Clase que maneja la recopilación y envío de datos del CMS mediante un cron diario.
 *
 * @package Compibot
 */

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

/**
 * Clase para gestionar la recopilación de datos del CMS y enviarlos a la API.
 */
class CompibotDailyCmsData {

	/**
	 * URL base de la API del servidor de Compibot.
	 *
	 * @var string
	 */
	private $api_base_url = 'https://panel.compibot.com/';

	/**
	 * Token de autenticación para la API.
	 *
	 * @var string
	 */
	private $token;

	/**
	 * Constructor de la clase que inicializa el token.
	 */
	public function __construct() {
		$this->token = $this->get_token();
	}

	/**
	 * Método principal para ejecutar el cron diario.
	 *
	 * @return bool `true` si se ejecuta correctamente, `false` en caso contrario.
	 */
	public function execute() {
		$cms_data = $this->get_cms_data();

		if ( ! $cms_data ) {
			return false;
		}

		$response = $this->send_data_to_api( $cms_data );

		return $response;
	}

	/**
	 * Obtiene los datos del CMS necesarios.
	 *
	 * @return array Datos del CMS.
	 */
	private function get_cms_data() {
		$version_php = phpversion();
		global $wp_version;
		$version_wordpress = $wp_version;

		return array(
			'version_php'       => $version_php,
			'version_wordpress' => $version_wordpress,
			'gmt_offset'        => get_option( 'gmt_offset' ),
		);
	}

	/**
	 * Método para enviar los datos al endpoint de la API.
	 *
	 * @param array $data Datos a enviar al servidor.
	 * @return bool `true` si la solicitud fue exitosa, `false` en caso contrario.
	 */
	private function send_data_to_api( $data ) {
		if ( ! $this->token ) {
			return false;
		}

		$api_endpoint = $this->api_base_url . 'api/daily-cms-data/';

		$response = wp_remote_post(
			$api_endpoint,
			array(
				'method'  => 'POST',
				'body'    => wp_json_encode( $data ),
				'headers' => array(
					'Content-Type'  => 'application/json',
					'Authorization' => 'Bearer ' . $this->token,
				),
				'timeout' => 15,
			)
		);

		if ( is_wp_error( $response ) ) {
			return false;
		}

		return wp_remote_retrieve_response_code( $response ) === 200;
	}

	/**
	 * Método que obtiene el token de la base de datos.
	 *
	 * @return string|null Token de autenticación o null si no existe.
	 */
	private function get_token() {
		$db_manager = new CompibotDatabaseManager();
		$token      = $db_manager->compibot_select( 'token', 'plugin_token_compibot_page', 60 );

		return $token;
	}
}
