/**
 * PR14.5 Desktop LocalStorageAdapter（skeleton）—— 把 Phase 2 PRD 的 "Local backend on
 * Desktop" 落地：用户绑 Local backend 后，agent 上传文件 → 经 HostBridge.fs.write
 * 写到用户本机 ~/FF AI Workspace/，下载读回。
 *
 * **跟现有 `local.adapter.ts` LocalStorageAdapter 同语义但路由不同：**
 * - `LocalStorageAdapter`（现有）→ 服务端 `/tmp/ffai-agent-storage` 落盘
 *   - 实际是"开发期 / 临时 staging" 的 LOCAL，跟 PRD US-501 "Desktop 用户切 Local backend
 *     跑通" 的语义对不上（用户切 LOCAL 期望是自己本机的文件，不是服务器临时区）
 * - `DesktopLocalStorageAdapter`（本文件）→ HostBridge.fs.* 路由到用户 Desktop App 端
 *   - upload(path, content) → SSE 发 tool_use → 前端 dispatcher 拿到 client:fs.write →
 *     用户本机 ~/FF AI Workspace/{path} 落盘
 *
 * **命名冲突清理决策（待用户确认）**：
 *   方案 A（推荐）：把现有 LocalStorageAdapter **重命名** ServerTempStorageAdapter（kind 'SERVER_TEMP'）
 *                  本类升正用 kind 'LOCAL'。改 5 处 import + storage.types.ts 枚举。
 *   方案 B：StorageBackendKindLite 加 'DESKTOP_LOCAL'，两个 adapter 并存。改 1 处枚举 +
 *          DataScope binding 选择逻辑。语义模糊，不推荐。
 *
 * 当前文件是 .skeleton.ts，**不接入 module providers**，等用户决策方案。
 *
 * 详见 docs/modules/agent/01-prd-phase2.md PR14.5 + .learnings/2026-05-16-pr14.5-localstorage-collision.md。
 */

import { Injectable } from '@nestjs/common';
import type { StorageAdapter } from './storage.types';

@Injectable()
export class DesktopLocalStorageAdapter implements StorageAdapter {
  // 命名冲突未清，此 kind 暂留 'LOCAL'；接入前按上述方案 A/B 改
  readonly kind = 'LOCAL' as const;

  isConfigured(_config: Record<string, unknown>, _encryptedSecret: string | null): boolean {
    // Desktop 端永远"可用"，但实际能否走通取决于在线用户的 Desktop App 是否连接 + 是否授权 fs.write
    return true;
  }

  async upload(_args: {
    config: Record<string, unknown>;
    encryptedSecret: string | null;
    path: string;
    content: Buffer;
  }): Promise<{ externalId?: string }> {
    // 真实实现：
    // 1. 通过 SSE 给当前用户的 Desktop session 发 client:fs.write tool_use
    // 2. 等用户 Desktop App 的 HostBridge dispatcher 返回 tool_result
    // 3. 超时（用户未在线 / 拒绝授权 / 网络断）→ 抛 BadRequestException
    // 4. 成功 → 返回 externalId = 文件本机绝对路径（用于审计；不持久化内容副本到服务端）
    throw new Error(
      'DesktopLocalStorageAdapter.upload not implemented: requires SSE tool_use → frontend HostBridge.fs.write round-trip (PR14.5 真实化阶段)',
    );
  }

  async download(_args: {
    config: Record<string, unknown>;
    encryptedSecret: string | null;
    path: string;
    externalId?: string;
  }): Promise<Buffer> {
    // 真实实现：SSE 发 client:fs.read → 等 Desktop dispatcher 回 base64 content → Buffer.from
    throw new Error(
      'DesktopLocalStorageAdapter.download not implemented: requires SSE tool_use → frontend HostBridge.fs.read round-trip (PR14.5 真实化阶段)',
    );
  }
}
