// ============================================================
// infrastructure/storage/ipc-file.ts — 渲染进程侧文件操作桥接
//
// 职责：
//   - 封装 window.fileStorage 调用（由 preload 注入）
//   - 降级方案：非 Electron 环境使用 localStorage 模拟
//   - 提供统一的文件操作 API 供上层 Store 使用
//
// 使用模式：
//   本模块是唯一直接访问 window.fileStorage 的地方，
//   media-store / db-encrypt 等均通过本模块操作文件。
// ============================================================

import { hasIpc } from '@/shared/utils/bus';
import { logger } from '@/shared/utils/bus';

// ---------- 文件 API ----------

export async function writeFile(relativePath: string, data: string, encoding?: 'base64' | 'utf8'): Promise<string | null> {
  if (!hasIpc() || !window.fileStorage) {
    logger.warn('storage', 'fileStorage 不可用，文件写入跳过');
    return null;
  }
  return window.fileStorage.writeFile(relativePath, data, encoding);
}

export async function readFile(relativePath: string): Promise<string | null> {
  if (!hasIpc() || !window.fileStorage) return null;
  return window.fileStorage.readFile(relativePath);
}

export async function deleteFile(relativePath: string): Promise<boolean> {
  if (!hasIpc() || !window.fileStorage) return false;
  return window.fileStorage.deleteFile(relativePath);
}

export async function makeDir(relativePath: string): Promise<string | null> {
  if (!hasIpc() || !window.fileStorage) return null;
  return window.fileStorage.makeDir(relativePath);
}

export async function showItemInFolder(filePath: string): Promise<boolean> {
  if (!hasIpc() || !window.fileStorage) return false;
  return window.fileStorage.showItemInFolder(filePath);
}

export async function fileExists(relativePath: string): Promise<boolean> {
  if (!hasIpc() || !window.fileStorage) return false;
  return window.fileStorage.fileExists(relativePath);
}

/** Blob → Base64 → IPC 写入磁盘。返回写入的绝对路径 */
export async function saveBlobToFile(relativePath: string, blob: Blob): Promise<string | null> {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = () => {
      const base64 = (reader.result as string).split(',')[1]; // 去掉 data:mime;base64, 前缀
      writeFile(relativePath, base64, 'base64').then(resolve).catch((err) => {
        logger.warn('storage', 'IPC 文件写入失败（saveBlobToFile）', err instanceof Error ? err : undefined);
        resolve(null);
      });
    };
    reader.onerror = () => resolve(null);
    reader.readAsDataURL(blob);
  });
}

/** 读取文件并返回 Blob URL */
export async function readFileAsBlobUrl(relativePath: string, mimeType: string): Promise<string | null> {
  const base64 = await readFile(relativePath);
  if (!base64) return null;
  return `data:${mimeType};base64,${base64}`;
}

/** 获取 heixiu-data 根目录绝对路径 */
export async function getDataDir(): Promise<string | null> {
  if (!hasIpc() || !window.fileStorage) return null;
  return window.fileStorage.getDataDir();
}
