export interface CloudSyncSettings {
  serverUrl: string;
  enabled: boolean;
}

export interface CloudSyncSession {
  accessToken: string;
  expiresAtUtc: string;
  userId: string;
  role: string;
  permissions: string[];
}

const SETTINGS_KEY = 'Hua.Todo_cloud_sync_settings';
const SESSION_KEY = 'Hua.Todo_cloud_sync_session';

/**
 * 读写云同步设置与会话信息。
 *
 * - 设置（serverUrl/enabled）需要跨重启保留，存 localStorage
 * - 会话（accessToken 等）默认不持久化到磁盘，存 sessionStorage（关闭应用即失效）
 *
 * v1.2.0 仅实现“配置 + 登录 + 拉取任务”的最小闭环；更细的“可控落盘/内存模式”由 06-* 任务接管。
 */
export class CloudSyncStorage {
  /**
   * 读取云同步设置；不存在时返回默认值。
   */
  static loadSettings(): CloudSyncSettings {
    try {
      const raw = localStorage.getItem(SETTINGS_KEY);
      if (!raw) {
        return { serverUrl: '', enabled: false };
      }

      const parsed = JSON.parse(raw) as Partial<CloudSyncSettings>;
      return {
        serverUrl: typeof parsed.serverUrl === 'string' ? parsed.serverUrl : '',
        enabled: typeof parsed.enabled === 'boolean' ? parsed.enabled : false,
      };
    } catch {
      return { serverUrl: '', enabled: false };
    }
  }

  /**
   * 保存云同步设置。
   */
  static saveSettings(settings: CloudSyncSettings): void {
    localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
  }

  /**
   * 清空云同步设置（不会影响本地任务数据）。
   */
  static clearSettings(): void {
    localStorage.removeItem(SETTINGS_KEY);
  }

  /**
   * 读取云同步会话；不存在时返回 null。
   */
  static loadSession(): CloudSyncSession | null {
    try {
      const raw = sessionStorage.getItem(SESSION_KEY);
      if (!raw) return null;

      const parsed = JSON.parse(raw) as Partial<CloudSyncSession>;
      if (!parsed.accessToken || typeof parsed.accessToken !== 'string') return null;

      return {
        accessToken: parsed.accessToken,
        expiresAtUtc: typeof parsed.expiresAtUtc === 'string' ? parsed.expiresAtUtc : '',
        userId: typeof parsed.userId === 'string' ? parsed.userId : '',
        role: typeof parsed.role === 'string' ? parsed.role : '',
        permissions: Array.isArray(parsed.permissions)
          ? parsed.permissions.filter((p): p is string => typeof p === 'string')
          : [],
      };
    } catch {
      return null;
    }
  }

  /**
   * 保存云同步会话到 sessionStorage。
   */
  static saveSession(session: CloudSyncSession): void {
    sessionStorage.setItem(SESSION_KEY, JSON.stringify(session));
  }

  /**
   * 清空云同步会话（登出）。
   */
  static clearSession(): void {
    sessionStorage.removeItem(SESSION_KEY);
  }
}

export default CloudSyncStorage;
