/**
 * 포맷팅 관련 유틸리티 함수
 */

/**
 * HTML 엔티티 디코딩
 * @param {string} text - HTML 엔티티가 포함된 텍스트
 * @returns {string} 디코딩된 텍스트
 */
export const decodeHtmlEntities = (text) => {
  if (!text) return '';
  const textarea = document.createElement('textarea');
  textarea.innerHTML = text;
  return textarea.value;
};

/**
 * 시간 문자열 포맷팅 (HH:mm 형식으로)
 * @param {string} time - 시간 문자열 (HH:mm:ss 또는 HH:mm)
 * @returns {string|null} 포맷된 시간 또는 null
 */
export const formatTime = (time) => {
  if (!time) return null;
  return time.slice(0, 5);
};

/**
 * 숫자에 천 단위 콤마 추가
 * @param {number} num - 숫자
 * @returns {string} 콤마가 추가된 문자열
 */
export const formatNumber = (num) => {
  if (num === null || num === undefined) return '0';
  return num.toLocaleString('ko-KR');
};

/**
 * 조회수 포맷팅 (1만 이상이면 '만' 단위로)
 * @param {number} count - 조회수
 * @returns {string} 포맷된 조회수
 */
export const formatViewCount = (count) => {
  if (!count) return '0';
  if (count >= 10000) {
    return `${(count / 10000).toFixed(1)}만`;
  }
  return formatNumber(count);
};

/**
 * 파일 크기 포맷팅
 * @param {number} bytes - 바이트 단위 크기
 * @returns {string} 포맷된 크기 (예: "1.5 MB")
 */
export const formatFileSize = (bytes) => {
  if (!bytes) return '0 B';
  const units = ['B', 'KB', 'MB', 'GB'];
  let size = bytes;
  let unitIndex = 0;
  while (size >= 1024 && unitIndex < units.length - 1) {
    size /= 1024;
    unitIndex++;
  }
  return `${size.toFixed(1)} ${units[unitIndex]}`;
};

/**
 * 재생 시간 포맷팅 (초 -> MM:SS 또는 HH:MM:SS)
 * @param {number} seconds - 초 단위 시간
 * @returns {string} 포맷된 시간
 */
export const formatDuration = (seconds) => {
  if (!seconds) return '0:00';
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);

  if (hours > 0) {
    return `${hours}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;
  }
  return `${minutes}:${String(secs).padStart(2, '0')}`;
};

/**
 * 텍스트 말줄임 처리
 * @param {string} text - 원본 텍스트
 * @param {number} maxLength - 최대 길이
 * @returns {string} 말줄임 처리된 텍스트
 */
export const truncateText = (text, maxLength) => {
  if (!text) return '';
  if (text.length <= maxLength) return text;
  return `${text.slice(0, maxLength)}...`;
};
