/**
 * Date and time formatting utilities
 * Centralized configuration to avoid code duplication across services
 */

// Date formatting configuration
export const DATE_FORMAT_OPTIONS: Intl.DateTimeFormatOptions = {
  day: '2-digit',
  month: 'short',
  year: 'numeric',
} as const;

// Locale configuration
export const DEFAULT_LOCALE = 'en-US';

/**
 * Formats a date string to a localized date format
 * @param dateString - ISO date string or date-like string
 * @param locale - Locale for formatting (defaults to 'en-US')
 * @param options - Intl.DateTimeFormatOptions (defaults to predefined format)
 * @returns Formatted date string or empty string if invalid
 */
export const formatDate = (
  dateString?: string,
  locale: string = DEFAULT_LOCALE,
  options: Intl.DateTimeFormatOptions = DATE_FORMAT_OPTIONS
): string => {
  if (!dateString) return '';

  try {
    return new Date(dateString).toLocaleDateString(locale, options);
  } catch (_error) {
    console.warn('Invalid date string provided:', dateString);
    return '';
  }
};

/**
 * Formats read time for articles
 * @param readTime - Read time in minutes
 * @returns Formatted read time string
 */
export const formatReadTime = (readTime?: number): string => {
  if (!readTime || readTime <= 0) return '0 min read';
  return `${readTime} min read`;
};

/**
 * Formats video duration to minutes
 * @param duration - Duration in seconds
 * @returns Formatted duration string
 */
export const formatVideoDuration = (duration?: number): string => {
  if (!duration || duration <= 0) return '0 min';
  return `${Math.ceil(duration / 60)} min`;
};

/**
 * Formats playlist video count
 * @param totalVideos - Number of videos in playlist
 * @returns Formatted video count string
 */
export const formatVideoCount = (totalVideos?: number): string => {
  const count = totalVideos || 0;
  return `${count} video${count !== 1 ? 's' : ''}`;
};

/**
 * Default thumbnail fallback
 */
export const DEFAULT_THUMBNAIL = '/default-thumbnail.jpg';

/**
 * Safely extracts thumbnail URL from nested data structure
 * @param thumbnailData - Thumbnail data object with nested structure
 * @returns Thumbnail URL or default fallback
 */
export const extractThumbnailUrl = (thumbnailData?: {
  data?: {
    attributes?: {
      url?: string;
    };
  };
}): string => {
  return thumbnailData?.data?.attributes?.url || DEFAULT_THUMBNAIL;
};
