Source: modules/utils.js

/**
 * Utility functions for UI state management and formatting.
 * @module modules/utils
 */

/**
 * Toggles the loading state of a button (disables/enables and updates text).
 * @param {HTMLButtonElement} button - The button element to update
 * @param {boolean} isLoading - Whether the button should be in loading state
 */
export function setLoadingState(button, isLoading) {
  if (!button) return;
  button.disabled = isLoading;
  button.innerHTML = isLoading ? 'Cargando...' : button.dataset.originalText || button.innerHTML;
}

/**
 * Displays an error message and hides the success message.
 * @param {string} message - The error message to display
 * @param {HTMLElement} errorElement - The error message container element
 * @param {HTMLElement} successElement - The success message container element
 */
export function displayError(message, errorElement, successElement) {
  if (errorElement) {
    const messageSpan = errorElement.querySelector('span');
    if (messageSpan) {
      messageSpan.textContent = message;
    } else {
      errorElement.textContent = message;
    }
    errorElement.classList.remove('hidden');
  }
  if (successElement) {
    successElement.classList.add('hidden');
  }
}

/**
 * Displays a success message and hides the error message.
 * @param {string} message - The success message to display
 * @param {HTMLElement} successElement - The success message container element
 * @param {HTMLElement} errorElement - The error message container element
 */
export function displaySuccess(message, successElement, errorElement) {
  if (successElement) {
    const messageSpan = successElement.querySelector('span');
    if (messageSpan) {
      messageSpan.textContent = message;
    } else {
      successElement.textContent = message;
    }
    successElement.classList.remove('hidden');
  }
  if (errorElement) {
    errorElement.classList.add('hidden');
  }
}

/**
 * Hides both error and success messages.
 * @param {HTMLElement} errorElement - The error message container element
 * @param {HTMLElement} successElement - The success message container element
 */
export function clearMessages(errorElement, successElement) {
  if (errorElement) {
    errorElement.classList.add('hidden');
    const messageSpan = errorElement.querySelector('span');
    if (messageSpan) {
      messageSpan.textContent = '';
    }
  }
  if (successElement) {
    successElement.classList.add('hidden');
    const messageSpan = successElement.querySelector('span');
    if (messageSpan) {
      messageSpan.textContent = '';
    }
  }
}

/**
 * Formats a date string to a locale string.
 * @param {string} dateString - The date string to format
 * @returns {string} The formatted date string or 'N/A' if invalid
 */
export function formatDate(dateString) {
  if (!dateString) return 'N/A';

  const date = new Date(dateString);

  // If date is invalid, try to parse manually (handles some non-standard formats)
  if (isNaN(date.getTime())) {
    const parts = dateString.split(/[- :]/);
    if (parts.length >= 6) {
      const year = parseInt(parts[0]);
      const month = parseInt(parts[1]) - 1; // Month is 0-indexed
      const day = parseInt(parts[2]);
      const hours = parseInt(parts[3]);
      const minutes = parseInt(parts[4]);
      const seconds = parseInt(parts[5]);

      const validDate = new Date(year, month, day, hours, minutes, seconds);
      if (!isNaN(validDate.getTime())) {
        return validDate.toLocaleString();
      }
    }
    // Fallback: return original string if parsing fails
    return dateString;
  }

  return date.toLocaleString();
}