<?php

namespace Easymailing\App\Core\Transient;

class FlashBag
{
	private $storageKey = '_easymailing_flashes';
	private $expiration = 90; // Tiempo de expiración en segundos

	/**
	 * Añadir un mensaje flash
	 *
	 * @param string $type    Tipo de mensaje (success, warning, info, danger).
	 * @param string $message Contenido del mensaje.
	 */
	public function add(string $type, string $message): void
	{
		$typeKey = sanitize_key($type);
		$storedFlashes = $this->getAllFlashes();

		// Añadir el mensaje al tipo correspondiente
		$storedFlashes[$typeKey][] = sanitize_text_field($message);

		// Guardar en transients
		set_transient($this->storageKey, $storedFlashes, $this->expiration);
	}

	/**
	 * Obtener y eliminar mensajes de un tipo específico.
	 *
	 * @param string $type    Tipo de mensaje.
	 * @param array  $default Valor predeterminado si no existen mensajes.
	 *
	 * @return array
	 */
	public function get(string $type, array $default = []): array
	{
		$typeKey = sanitize_key($type);
		$storedFlashes = $this->getAllFlashes();

		if (!isset($storedFlashes[$typeKey])) {
			return $default;
		}

		$messages = $storedFlashes[$typeKey];

		// Eliminar los mensajes de este tipo
		unset($storedFlashes[$typeKey]);

		// Actualizar el transient
		set_transient($this->storageKey, $storedFlashes, $this->expiration);

		return $messages;
	}

	/**
	 * Comprobar si hay mensajes de un tipo específico.
	 *
	 * @param string $type Tipo de mensaje.
	 *
	 * @return bool
	 */
	public function has(string $type): bool
	{
		$typeKey = sanitize_key($type);
		$storedFlashes = $this->getAllFlashes();

		return isset($storedFlashes[$typeKey]) && !empty($storedFlashes[$typeKey]);
	}

	/**
	 * Mostrar notificaciones de administrador.
	 */
	public function adminNotices(): void
	{
		$types = ['success', 'warning', 'info', 'error'];

		foreach ($types as $type) {
			if ($this->has($type)) {
				$messages = $this->get($type);

				foreach ($messages as $message) {
					echo '<div class="notice notice-' . esc_attr($type) . ' is-dismissible em-mb-2">';
					echo '<p>' . esc_html($message) . '</p>';
					echo '<button type="button" class="notice-dismiss">';
					echo '<span class="screen-reader-text">' . esc_html__('Dismiss this notice.', 'easymailing') . '</span>';
					echo '</button>';
					echo '</div>';
				}
			}
		}
	}

	/**
	 * Obtener todos los mensajes flash almacenados.
	 *
	 * @return array
	 */
	public function getAllFlashes(): array
	{
		$storedFlashes = get_transient($this->storageKey);

		return is_array($storedFlashes) ? $storedFlashes : [];
	}
}
