/**
 * iCloud 同步（plan.md「6.4 iCloud 同步」）。
 *
 * iOS 通过 iCloud Documents 目录同步 mobile.bean（文件系统级，无需 HTTP）。
 * 原生 iCloud 容器访问通过注入抽象（生产用 expo-file-system 的 iCloudFileSystemAsync，
 * 测试用 mock）。
 *
 * iCloud 优先（iOS 原生同步更可靠）：远程有更新时直接覆盖本地。
 */

import { logger } from '../../utils/logger';

/** iCloud 文件系统抽象（生产用 expo-file-system iCloud 扩展）。 */
export interface ICloudFileSystem {
  /** 读取 iCloud 容器中的文件。 */
  readICloud(path: string): Promise<string | null>;
  /** 写入 iCloud 容器中的文件。 */
  writeICloud(path: string, content: string): Promise<void>;
  /** 获取文件最后修改时间。 */
  getModifiedTime(path: string): Promise<string | null>;
  /** 检查 iCloud 是否可用（用户未登录 iCloud 时返回 false）。 */
  isAvailable(): Promise<boolean>;
}

export interface ICloudSyncResult {
  action: 'pushed' | 'pulled' | 'conflict' | 'noop' | 'unavailable';
  content: string;
}

const ICLOUD_MOBILE_BEAN = 'main.bean';

/**
 * 执行 iCloud 同步。
 * 策略：iCloud 优先——若远程有更新则拉取覆盖本地，否则推送本地到 iCloud。
 */
export async function syncWithICloud(
  fs: ICloudFileSystem,
  localContent: string,
  lastSyncTime: string,
): Promise<ICloudSyncResult> {
  const available = await fs.isAvailable();
  if (!available) {
    logger.warn('icloudSync', 'iCloud 不可用（用户未登录）');
    return { action: 'unavailable', content: localContent };
  }

  const remoteContent = await fs.readICloud(ICLOUD_MOBILE_BEAN);
  const remoteModified = await fs.getModifiedTime(ICLOUD_MOBILE_BEAN);

  // 无远程文件 → 推送
  if (remoteContent === null) {
    await fs.writeICloud(ICLOUD_MOBILE_BEAN, localContent);
    logger.info('icloudSync', '首次推送到 iCloud');
    return { action: 'pushed', content: localContent };
  }

  // 内容相同 → noop
  if (remoteContent === localContent) {
    return { action: 'noop', content: localContent };
  }

  // iCloud 优先：远程有更新 → 拉取
  if (remoteModified && remoteModified > lastSyncTime) {
    logger.info('icloudSync', '从 iCloud 拉取更新');
    return { action: 'pulled', content: remoteContent };
  }

  // 本地有更新 → 推送
  await fs.writeICloud(ICLOUD_MOBILE_BEAN, localContent);
  logger.info('icloudSync', '推送到 iCloud');
  return { action: 'pushed', content: localContent };
}

/** 模拟 iCloud 文件系统（测试用）。 */
export class MockICloudFileSystem implements ICloudFileSystem {
  public files = new Map<string, { content: string; modified: string }>();
  public available = true;

  async isAvailable(): Promise<boolean> { return this.available; }
  async readICloud(path: string): Promise<string | null> {
    return this.files.get(path)?.content ?? null;
  }
  async writeICloud(path: string, content: string): Promise<void> {
    this.files.set(path, { content, modified: new Date().toISOString() });
  }
  async getModifiedTime(path: string): Promise<string | null> {
    return this.files.get(path)?.modified ?? null;
  }
  /** 测试辅助。 */
  setRemoteFile(path: string, content: string, modified: string): void {
    this.files.set(path, { content, modified });
  }
}
