import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";

/**
 * Tailwind CSS 클래스를 병합하는 유틸리티 함수
 */
export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}

/**
 * 파일 크기를 사람이 읽기 쉬운 형태로 변환
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return "0 Bytes";

  const k = 1024;
  const sizes = ["Bytes", "KB", "MB", "GB"];
  const i = Math.floor(Math.log(bytes) / Math.log(k));

  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
}

/**
 * 파일 확장자 검증
 */
export function validateFileType(fileName: string): boolean {
  const allowedExtensions = [".xlsx", ".xls", ".csv"];
  const extension = fileName.toLowerCase().substring(fileName.lastIndexOf("."));
  return allowedExtensions.includes(extension);
}

/**
 * 파일 크기 검증 (MB 단위)
 */
export function validateFileSize(fileSize: number, maxSizeMB: number): boolean {
  const fileSizeMB = fileSize / (1024 * 1024);
  return fileSizeMB <= maxSizeMB;
}

/**
 * 날짜를 사람이 읽기 쉬운 형태로 변환
 */
export function formatDate(date: Date): string {
  return new Intl.DateTimeFormat("ko-KR", {
    year: "numeric",
    month: "short",
    day: "numeric",
    hour: "2-digit",
    minute: "2-digit",
  }).format(date);
}

/**
 * UUID 생성
 */
export function generateId(): string {
  return Math.random().toString(36).substring(2) + Date.now().toString(36);
}

/**
 * 딜레이 함수
 */
export function delay(ms: number): Promise<void> {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

/**
 * 셀 범위를 문자열로 변환 (예: A1:B2)
 */
export function rangeToCellAddress(
  startRow: number,
  startCol: number,
  endRow?: number,
  endCol?: number
): string {
  const colToLetter = (col: number): string => {
    let result = "";
    while (col >= 0) {
      result = String.fromCharCode((col % 26) + 65) + result;
      col = Math.floor(col / 26) - 1;
    }
    return result;
  };

  const start = `${colToLetter(startCol)}${startRow + 1}`;

  if (
    endRow !== undefined &&
    endCol !== undefined &&
    (endRow !== startRow || endCol !== startCol)
  ) {
    const end = `${colToLetter(endCol)}${endRow + 1}`;
    return `${start}:${end}`;
  }

  return start;
}
