/**
 * 应用全局常量配置
 *
 * @module utils/constants
 * @description 集中管理所有应用常量，避免硬编码和重复定义
 */

/**
 * localStorage 键名管理
 * @description 统一的localStorage键名规范，避免冲突和重复
 *
 * 命名规范：app-{feature}-{key}
 * - app: 应用级前缀
 * - feature: 功能模块标识（filesystem/device-test等）
 * - key: 具体的数据项
 */
export const STORAGE_KEYS = {
  // 文件系统模块
  FILESYSTEM: {
    FILE_PATH: 'app-filesystem-file-path',
    FILE_LIST: 'app-filesystem-file-list',
    FILE_CONTENT: 'app-filesystem-file-content',
    PATH_HISTORY: 'app-filesystem-path-history',
    FILE_CONTENT_HEIGHT: 'app-filesystem-file-content-height',
    PANEL_WIDTH: 'app-filesystem-panel-width',
    SIDEBAR_VISIBLE: 'app-filesystem-sidebar-visible',
    FAVORITE_FILES: 'app-filesystem-favorite-files',
    EDIT_MODE: 'app-filesystem-edit-mode', // HTML/Markdown 编辑模式状态
    FILE_DRAFT: 'app-filesystem-file-draft', // 文件草稿
    SORT: 'app-filesystem-sort', // 排序状态
    COL_SETTINGS: 'app-filesystem-col-settings', // 列配置（显隐+顺序）
    SHOW_HEADER: 'app-filesystem-show-header', // 表头显隐
    LAST_OPENED_FILE: 'app-filesystem-last-opened-file', // 上次打开的文件路径
    MULTI_PREVIEW_TABS: 'app-filesystem-multi-preview-tabs', // 多文件预览 tab 会话
  },

  // 设备测试模块
  DEVICE_TEST: {
    FILE_PATH: 'app-device-test-file-path',
    FILE_LIST: 'app-device-test-file-list',
    FILE_CONTENT: 'app-device-test-file-content',
    PATH_HISTORY: 'app-device-test-path-history',
    FILE_CONTENT_HEIGHT: 'app-device-test-file-content-height',
    PANEL_WIDTH: 'app-device-test-panel-width',
    FAVORITE_FILES: 'app-device-test-favorite-files',
  },

  // 通用配置
  COMMON: {
    THEME: 'app-common-theme',
    LANGUAGE: 'app-common-language',
  },
}

/**
 * 文件扩展名分类
 * @description 用于文件类型识别和图标映射
 */
export const FILE_EXTENSIONS = {
  // 图片文件
  IMAGE: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp', 'ico', 'heic', 'heif'],

  // 视频文件
  VIDEO_BROWSER: ['mp4', 'webm', 'ogg', 'mov', 'm4v'], // 浏览器原生支持
  VIDEO_EXTERNAL: ['avi', 'mkv', 'wmv', 'flv', 'rmvb', '3gp', 'mts'], // 需要外部播放器（注意：不用 'ts' 避免 TypeScript 冲突）
  // 音频文件
  AUDIO: ['mp3', 'wav', 'flac', 'aac', 'ogg', 'm4a', 'opus', 'webm'],

  // 文档文件
  DOCUMENT: ['doc', 'docx', 'pdf', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'rtf', 'odt', 'ods', 'odp'],

  // 压缩文件
  ARCHIVE: ['zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'z', 'cab', 'iso'],

  // 代码文件
  CODE: [
    'js', 'ts', 'jsx', 'tsx', 'cts', 'mts', 'cjs', 'mjs',
    'vue', 'py', 'java', 'c', 'cpp', 'h', 'go', 'rs', 'php', 'rb', 'cs', 'swift', 'kt',
    'scala', 'dart', 'css', 'scss', 'sass', 'less', 'sql', 'sh', 'bat', 'ps1',
    'flow', 'pch', 'cc', 'cxx', 'hpp', 'hxx', 'tcc', 'defs', 'makefile', 'mk', 'cmake',
    'dockerfile', 'm', 'r', 'matlab'
  ],

  // 配置文件（可编辑的文本格式）
  CONFIG: [
    // 数据格式
    'json', 'xml', 'yaml', 'yml',
    // 配置文件
    'toml', 'ini', 'cfg', 'conf',
    // 环境变量/属性
    'props', 'env', 'dotenv',
    // 其他
    'manifest', 'lock', 'ignore'
  ],

  // 纯文本文件
  TEXT: ['txt', 'text', 'log', 'md', 'markdown', 'rst', 'adoc', 'tex', 'msg', 'csv', 'tsv'],

  // 数据库文件
  DATABASE: ['db', 'sqlite', 'mdb', 'accdb'],

  // 可执行文件
  EXECUTABLE: ['exe', 'msi', 'app', 'dmg', 'deb', 'rpm', 'dll', 'so', 'jsa', 'jar'],

  // 字体文件
  FONT: ['ttf', 'otf', 'woff', 'woff2', 'eot'],
}

/**
 * 文件类型图标映射
 * @description 根据文件扩展名返回对应的图标
 */
export const FILE_ICONS = {
  // 图片
  IMAGE: '🖼️',

  // 视频
  VIDEO: '🎬',

  // 音频
  AUDIO: '🎵',

  // 文档
  PDF: '📕',
  DOC: '📘',
  XLS: '📗',
  PPT: '📙',
  TXT: '📃',
  DOCUMENT: '📄',

  // 压缩包
  ARCHIVE: '📦',

  // 代码
  CODE: '💻',

  // 编程语言特定图标
  JAVA: '☕',
  JAR: '🏺',
  JSA: '📦',
  GO: '🐹',
  PYTHON: '🐍',
  JAVASCRIPT: '📜',
  TYPESCRIPT: '💠',
  HTML: '🌐',
  CSS: '🎨',
  SQL: '🗃️',
  JSON: '📋',
  XML: '📰',
  YAML: '⚙️',
  SHELL: '🐚',
  C: '🔷',
  CPP: '🔶',
  RUST: '🦀',
  PHP: '🐘',
  RUBY: '💎',
  DART: '🎯',
  DOCKERFILE: '🐳',
  VUE: '💚',

  // 数据库
  DATABASE: '🗄️',

  // 可执行文件
  EXECUTABLE: '⚙️',

  // 字体
  FONT: '🔤',

  // 文件夹
  FOLDER: '📁',

  // OSS 桶
  BUCKET: '🪣',

  // 默认文件
  FILE: '📄',
}

/**
 * 文件类型到图标的映射表
 * @description 扩展名 -> 图标 的快速查找表
 */
export const FILE_ICON_MAP = new Map()

// 初始化图标映射表
const initIconMap = () => {
  // 图片
  FILE_EXTENSIONS.IMAGE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.IMAGE))

  // 视频
  FILE_EXTENSIONS.VIDEO_BROWSER.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.VIDEO))
  FILE_EXTENSIONS.VIDEO_EXTERNAL.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.VIDEO))

  // 音频
  FILE_EXTENSIONS.AUDIO.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.AUDIO))

  // 文档
  FILE_EXTENSIONS.DOCUMENT.forEach(ext => {
    if (ext === 'pdf') FILE_ICON_MAP.set(ext, FILE_ICONS.PDF)
    else if (['doc', 'docx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.DOC)
    else if (['xls', 'xlsx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.XLS)
    else if (['ppt', 'pptx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.PPT)
    else if (ext === 'txt') FILE_ICON_MAP.set(ext, FILE_ICONS.TXT)
    else FILE_ICON_MAP.set(ext, FILE_ICONS.DOCUMENT)
  })

  // 压缩文件
  FILE_EXTENSIONS.ARCHIVE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.ARCHIVE))

  // 代码文件（通用）
  FILE_EXTENSIONS.CODE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.CODE))

  // 配置文件（使用特定图标）
  const configIcons = {
    'json': FILE_ICONS.JSON,
    'xml': FILE_ICONS.XML,
    'yaml': FILE_ICONS.YAML,
    'yml': FILE_ICONS.YAML
  }
  FILE_EXTENSIONS.CONFIG.forEach(ext => {
    FILE_ICON_MAP.set(ext, configIcons[ext] || FILE_ICONS.YAML)
  })

  // 编程语言特定图标
  const langIcons = {
    // Java
    'java': FILE_ICONS.JAVA,
    'jar': FILE_ICONS.JAR,
    'jsa': FILE_ICONS.JSA,
    // Go
    'go': FILE_ICONS.GO,
    // Python
    'py': FILE_ICONS.PYTHON,
    'pyw': FILE_ICONS.PYTHON,
    // JavaScript/TypeScript
    'js': FILE_ICONS.JAVASCRIPT,
    'jsx': FILE_ICONS.JAVASCRIPT,
    'ts': FILE_ICONS.TYPESCRIPT,
    'tsx': FILE_ICONS.TYPESCRIPT,
    'mjs': FILE_ICONS.JAVASCRIPT,
    'cjs': FILE_ICONS.JAVASCRIPT,
    // Web
    'html': FILE_ICONS.HTML,
    'htm': FILE_ICONS.HTML,
    'xhtml': FILE_ICONS.HTML,
    'css': FILE_ICONS.CSS,
    'scss': FILE_ICONS.CSS,
    'sass': FILE_ICONS.CSS,
    'less': FILE_ICONS.CSS,
    // Shell
    'sh': FILE_ICONS.SHELL,
    'bash': FILE_ICONS.SHELL,
    'zsh': FILE_ICONS.SHELL,
    'fish': FILE_ICONS.SHELL,
    'cmd': FILE_ICONS.SHELL,
    'bat': FILE_ICONS.SHELL,
    'ps1': FILE_ICONS.SHELL,
    // C/C++
    'c': FILE_ICONS.C,
    'h': FILE_ICONS.C,
    'cpp': FILE_ICONS.CPP,
    'hpp': FILE_ICONS.CPP,
    'cc': FILE_ICONS.CPP,
    'cxx': FILE_ICONS.CPP,
    // Rust
    'rs': FILE_ICONS.RUST,
    // PHP
    'php': FILE_ICONS.PHP,
    // Ruby
    'rb': FILE_ICONS.RUBY,
    'gem': FILE_ICONS.RUBY,
    // SQL
    'sql': FILE_ICONS.SQL,
    // Dart
    'dart': FILE_ICONS.DART,
    // Dockerfile
    'dockerfile': FILE_ICONS.DOCKERFILE,
    // Vue
    'vue': FILE_ICONS.VUE,
  }

  Object.keys(langIcons).forEach(ext => FILE_ICON_MAP.set(ext, langIcons[ext]))

  // 数据库
  FILE_EXTENSIONS.DATABASE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.DATABASE))

  // 可执行文件
  FILE_EXTENSIONS.EXECUTABLE.slice(0, 6).forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.EXECUTABLE))

  // 字体
  FILE_EXTENSIONS.FONT.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.FONT))
}

// 执行初始化
initIconMap()

/**
 * 常用路径快捷方式
 * @description 系统常用路径的emoji标识
 */
export const PATH_ICONS = {
  DESKTOP: '🖥️',
  DOCUMENTS: '📁',
  DOWNLOADS: '📥',
  HOME: '🏠',
  ROOT: '📂',
  DRIVE: '💿',
}

/**
 * 文件大小单位
 * @description 用于文件大小格式化的单位数组
 */
export const BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']

/**
 * 默认配置值
 */
export const DEFAULTS = {
  // 路径历史最大记录数
  MAX_HISTORY_LENGTH: 20,

  // 收藏夹最大数量
  MAX_FAVORITES_LENGTH: 50,

  // 文件内容高度范围（px）
  MIN_CONTENT_HEIGHT: 100,
  MAX_CONTENT_HEIGHT: 800,
  DEFAULT_CONTENT_HEIGHT: 200,

  // 面板宽度范围（%）
  MIN_PANEL_WIDTH: 20,
  MAX_PANEL_WIDTH: 80,
  DEFAULT_PANEL_WIDTH: 50,

  // 侧边栏宽度（px）
  SIDEBAR_WIDTH: 220,
}

/**
 * 文件大小格式化配置
 */
export const FILE_SIZE_FORMAT = {
  UNIT: 1024, // 使用1024进制（KiB, MiB等）
  DECIMAL_PLACES: 2, // 保留小数位数
}

/**
 * 文件大小阈值配置
 * @description 用于文件处理逻辑的大小限制
 */
export const FILE_SIZE_THRESHOLDS = {
  LARGE_FILE: 100 * 1024, // 100KB - 大文件检测阈值
  MAX_TEXT_DISPLAY: 5 * 1024 * 1024, // 5MB - 文本文件最大显示大小
}

/**
 * UI 文本常量
 * @description 界面上显示的固定文本
 */
export const UI_TEXT = {
  // 对话框标题
  CREATE_FILE: '📄 新建文件',
  CREATE_FOLDER: '📁 新建文件夹',
  RENAME_FILE: '重命名文件',
  DELETE_CONFIRM: '确认删除',

  // 按钮文本
  CONFIRM: '确定',
  CANCEL: '取消',
  CREATE: '创建',
  SAVE: '保存',
  DELETE: '删除',

  // 提示信息
  FILE_NAME_EMPTY: '请输入内容',
  FILE_NAME_INVALID: '文件名包含非法字符',
  FOLDER_NAME_INVALID: '文件夹名包含非法字符',
  FILE_EXISTS: '文件已存在',
  FOLDER_EXISTS: '文件夹已存在',
  SELECT_DIRECTORY: '请先选择一个目录',
  CREATE_SUCCESS: '创建成功',
  CREATE_FAILED: '创建失败',

  // 输入提示
  ENTER_FILE_NAME: '请输入文件名（如: todo.md）',
  ENTER_FOLDER_NAME: '请输入文件夹名称',
}

/**
 * 验证规则
 * @description 数据验证的正则表达式规则
 */
export const VALIDATION_RULES = {
  // Windows 文件名非法字符
  ILLEGAL_FILE_NAME_CHARS: /[<>:"/\\|?*]/,
}
