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

/**
 * HTML 엔티티 매핑
 */
const HTML_ENTITIES = {
  '&amp;': '&',
  '&lt;': '<',
  '&gt;': '>',
  '&quot;': '"',
  '&#39;': "'",
  '&apos;': "'",
  '&#x27;': "'",
  '&nbsp;': ' ',
};

/**
 * HTML 엔티티 디코딩 (순수 함수 - SSR 호환)
 * @param {string} text - HTML 엔티티가 포함된 텍스트
 * @returns {string} 디코딩된 텍스트
 */
export const decodeHtmlEntities = (text) => {
  if (!text) return '';
  return text.replace(
    /&(?:amp|lt|gt|quot|#39|apos|#x27|nbsp);/g,
    (match) => HTML_ENTITIES[match] || match
  );
};

/**
 * 시간 문자열 포맷팅 (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 {string} text - 쉼표로 구분된 크레딧 텍스트
 * @returns {string[]} 크레딧 배열
 */
export const parseCredits = (text) => {
  if (!text) return [];
  return text.split(',').map(item => item.trim()).filter(Boolean);
};

/**
 * 트랙 목록의 총 재생 시간 계산
 * @param {Array<{duration?: string}>} tracks - 트랙 배열 (duration: "MM:SS" 형식)
 * @returns {string} 총 재생 시간 ("MM:SS" 형식)
 */
export const calculateTotalDuration = (tracks) => {
  if (!tracks || !Array.isArray(tracks)) return '';

  const totalSeconds = tracks.reduce((acc, track) => {
    if (!track.duration) return acc;
    const parts = track.duration.split(':');
    if (parts.length !== 2) return acc;
    return acc + parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10);
  }, 0);

  if (totalSeconds === 0) return '';

  const minutes = Math.floor(totalSeconds / 60);
  const seconds = totalSeconds % 60;
  return `${minutes}:${seconds.toString().padStart(2, '0')}`;
};
