
import { formatISO, parseISO, isValid } from 'date-fns';

/**
 * 날짜 문자열을 ISO 형식으로 변환하는 함수
 * "오늘, 19:00 PM"과 같은 형식을 처리하기 위한 함수
 */
export const normalizeDate = (dateStr: string): string => {
  // 이미 ISO 형식인 경우 그대로 반환
  if (dateStr.match(/^\d{4}-\d{2}-\d{2}T/)) {
    return dateStr;
  }

  try {
    // "오늘"이라는 표현이 있으면 현재 날짜로 변환
    if (dateStr.includes('오늘')) {
      const today = new Date();
      
      // 시간 추출 시도
      const timeMatch = dateStr.match(/(\d{1,2}):(\d{2})/);
      if (timeMatch) {
        const hours = parseInt(timeMatch[1], 10);
        const minutes = parseInt(timeMatch[2], 10);
        today.setHours(hours, minutes, 0, 0);
      }
      
      return formatISO(today);
    }
    
    // 일반 날짜 문자열은 그대로 Date 객체로 변환 시도
    const date = new Date(dateStr);
    if (isValid(date)) {
      return formatISO(date);
    }
    
    // 변환 실패 시 현재 시간 반환
    console.warn(`날짜 변환 오류: "${dateStr}"를 ISO 형식으로 변환할 수 없습니다.`);
    return formatISO(new Date());
  } catch (error) {
    console.error(`날짜 변환 오류: "${dateStr}"를 ISO 형식으로 변환할 수 없습니다.`, error);
    // 오류 발생 시 현재 시간 반환 (데이터 손실 방지)
    return formatISO(new Date());
  }
};

/**
 * ISO 형식의 날짜 문자열을 사용자 친화적인 형식으로 변환
 */
export const formatDateForDisplay = (isoDateStr: string): string => {
  // 입력값이 유효한지 보호 처리
  if (!isoDateStr || typeof isoDateStr !== 'string') {
    console.warn('유효하지 않은 날짜 입력:', isoDateStr);
    return '날짜 없음';
  }
  
  try {
    // 이미 포맷된 날짜 문자열(예: "오늘, 14:30")이면 그대로 반환
    if (isoDateStr.includes('오늘,') || 
        isoDateStr.includes('년') && isoDateStr.includes('월') && isoDateStr.includes('일')) {
      return isoDateStr;
    }
    
    // 유효한 ISO 날짜인지 확인
    let date;
    if (isoDateStr.match(/^\d{4}-\d{2}-\d{2}T/)) {
      // ISO 형식인 경우
      date = parseISO(isoDateStr);
    } else {
      // ISO 형식이 아닌 경우 일반 Date 생성자 시도
      date = new Date(isoDateStr);
    }
    
    if (!isValid(date) || isNaN(date.getTime())) {
      console.warn('유효하지 않은 날짜 형식:', isoDateStr);
      return '유효하지 않은 날짜';
    }
    
    // 현재 날짜와 비교
    const today = new Date();
    const isToday = 
      date.getDate() === today.getDate() &&
      date.getMonth() === today.getMonth() &&
      date.getFullYear() === today.getFullYear();
    
    if (isToday) {
      return `오늘, ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
    }
    
    // 그 외의 경우 YYYY년 MM월 DD일 형식으로 반환
    return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일 ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
  } catch (error) {
    console.error('날짜 포맷 변환 오류:', error, isoDateStr);
    // 오류 발생 시 기본값 반환
    return '날짜 오류';
  }
};
