/**
 * 文件类型判断工具函数
 *
 * @module utils/fileTypeHelpers
 * @description 统一文件类型判断逻辑，避免内联重复定义
 */

import { FILE_EXTENSIONS } from './constants'
import { getExt } from './fileUtils'

/**
 * 可预览的文件类型（有专门的预览处理）
 * @type {string[]}
 */
export const PREVIEWABLE_TYPES = [
  ...FILE_EXTENSIONS.IMAGE,
  ...FILE_EXTENSIONS.VIDEO_BROWSER,
  ...FILE_EXTENSIONS.AUDIO,
  'pdf', 'html', 'htm', 'md', 'markdown',
  // Office 文件支持预览
  'xlsx', 'xls', 'docx', 'doc',
  // CSV/TSV 表格文件
  'csv', 'tsv'
]

/**
 * 已知二进制文件类型（直接显示二进制文件信息）
 * @type {string[]}
 */
export const KNOWN_BINARY_TYPES = [
  // 可执行文件
  'exe', 'dll', 'so', 'bin',
  // 压缩文件
  'zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'iso', 'img', 'dmg',
  // Office PowerPoint（暂不支持预览）
  'ppt', 'pptx',
  // 其他二进制
  'pdb', 'idb', 'lib', 'obj', 'o', 'a'
]

/**
 * 文本可编辑类型（包括代码、配置和文本文件）
 * @type {string[]}
 */
export const TEXT_EDITABLE_TYPES = [
  ...FILE_EXTENSIONS.CODE,
  ...FILE_EXTENSIONS.CONFIG,
  ...FILE_EXTENSIONS.TEXT
]

/**
 * 判断是否为图片文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isImageFile = (path) => {
  const ext = getExt(path)
  return FILE_EXTENSIONS.IMAGE.includes(ext)
}

/**
 * 判断是否为视频文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isVideoFile = (path) => {
  const ext = getExt(path)
  return FILE_EXTENSIONS.VIDEO_BROWSER.includes(ext)
}

/**
 * 判断是否为音频文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isAudioFile = (path) => {
  const ext = getExt(path)
  return FILE_EXTENSIONS.AUDIO.includes(ext)
}

/**
 * 判断是否为 PDF 文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isPdfFile = (path) => {
  const ext = getExt(path)
  return ext === 'pdf'
}

/**
 * 判断是否为 HTML 文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isHtmlFile = (path) => {
  const ext = getExt(path)
  return ['html', 'htm'].includes(ext)
}

/**
 * 判断是否为 Markdown 文件
 * @param {string} path - 文件路径或扩展名
 * @returns {boolean}
 */
export const isMarkdownFile = (path) => {
  const ext = getExt(path)
  return ['md', 'markdown'].includes(ext)
}

/**
 * 判断文件是否支持预览模式
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isPreviewable = (path) => {
  const ext = getExt(path)
  return PREVIEWABLE_TYPES.includes(ext)
}

/**
 * 判断文件是否为已知二进制类型
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isKnownBinary = (path) => {
  const ext = getExt(path)
  return KNOWN_BINARY_TYPES.includes(ext)
}

/**
 * 判断文件是否可文本编辑
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isTextEditable = (path) => {
  const ext = getExt(path)
  return TEXT_EDITABLE_TYPES.includes(ext)
}

/**
 * 判断是否为配置文件
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isConfigFile = (path) => {
  const ext = getExt(path)
  return FILE_EXTENSIONS.CONFIG.includes(ext)
}

/**
 * 获取文件类型分类
 * @param {string} path - 文件路径
 * @returns {string} 类型分类：'image' | 'video' | 'audio' | 'pdf' | 'html' | 'markdown' | 'text' | 'binary' | 'unknown'
 */
export const getFileCategory = (path) => {
  if (isImageFile(path)) return 'image'
  if (isVideoFile(path)) return 'video'
  if (isAudioFile(path)) return 'audio'
  if (isPdfFile(path)) return 'pdf'
  if (isHtmlFile(path)) return 'html'
  if (isMarkdownFile(path)) return 'markdown'
  if (isTextEditable(path)) return 'text'
  if (isKnownBinary(path)) return 'binary'
  return 'unknown'
}

/**
 * 判断是否为 Excel 文件
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isExcelFile = (path) => {
  const ext = getExt(path)
  return ['xlsx', 'xls'].includes(ext)
}

/**
 * 判断是否为 Word 文件
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isWordFile = (path) => {
  const ext = getExt(path)
  return ['docx', 'doc'].includes(ext)
}

/**
 * 判断是否为 Office 文件
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isOfficeFile = (path) => {
  return isExcelFile(path) || isWordFile(path) || ['ppt', 'pptx'].includes(getExt(path))
}

/**
 * 判断是否为 CSV/TSV 文件
 * @param {string} path - 文件路径
 * @returns {boolean}
 */
export const isCsvFile = (path) => {
  const ext = getExt(path)
  return ['csv', 'tsv'].includes(ext)
}
