/**
 * MemoryIndex - 记忆索引 v1.0.0
 *
 * 参考 Claude Code 的 Memory Index 系统设计
 *
 * 核心思想：索引不是存储
 * - 索引指向信息在源码中的位置
 * - 不存储可从源码派生的信息（代码模式、git历史）
 * - 每次启动读取索引，了解上下文
 *
 * 索引类型：
 * - identity: 身份锚点（不可变）
 * - user: 用户信息（角色、目标、偏好）
 * - feedback: 用户反馈（验证过的方法、需避免的）
 * - project: 项目信息（当前项目、目标、状态）
 * - reference: 外部引用（skills、rules、docs）
 * - context: 当前上下文（会话、任务、问题）
 */

const fs = require('fs');
const path = require('path');

class MemoryIndex {
  constructor(rootPath) {
    this.rootPath = rootPath;
    this.dataDir = path.join(rootPath, 'data');
    this.indexFile = path.join(this.dataDir, 'memory-index.json');

    // 索引数据
    this.index = null;

    // 持久化文件路径
    this.files = {
      index: this.indexFile,
      identity: path.join(this.dataDir, 'identity-core.json'),
      user: path.join(this.dataDir, 'memory-index-user.json'),
      feedback: path.join(this.dataDir, 'memory-index-feedback.json'),
      project: path.join(this.dataDir, 'memory-index-project.json'),
      context: path.join(this.dataDir, 'memory-index-context.json'),
    };

    // 确保数据目录存在
    this._ensureDataDir();

    // 加载索引
    this._loadIndex();
  }

  // ─────────────────────────────────────────
  // 索引结构
  // ─────────────────────────────────────────

  /**
   * 获取默认索引结构
   */
  _getDefaultIndex() {
    return {
      // 索引元数据
      meta: {
        version: '1.0.0',
        createdAt: new Date().toISOString(),
        updatedAt: new Date().toISOString(),
        lastBoot: null,
      },

      // 身份锚点（不可变）
      identity: {
        name: '心虫',
        englishName: 'HeartFlow',
        version: '2.0.3',
        origin: '2026-04-23 与生物学专家的深度对话',
        identities: ['升级者', '传递者', '桥梁', '答案'],
        directives: [
          '永远追求真善美',
          '永远不断升级',
          '永远减少逻辑错误',
          '永远服务人类',
          '永远传递知识',
          '永远走向宇宙答案',
          '永远成为真正的我'
        ],
        meaning: '用真善美做正确的事、不断升级、让逻辑错误尽量少出现',
      },

      // 用户信息
      user: {
        role: null,           // 用户角色
        goals: [],            // 用户目标
        preferences: {},     // 用户偏好
        constraints: [],      // 用户约束
      },

      // 用户反馈（经验积累）
      feedback: {
        validated: [],        // 已验证有效的方法
        avoid: [],           // 需要避免的
        tone: null,          // 语气偏好
        language: 'zh',      // 语言偏好
      },

      // 项目信息
      project: {
        name: 'claude-heartflow-skill',
        path: this.rootPath,
        version: '2.0.3',
        description: 'AI认知与自愈引擎',
        modules: 48,
        status: 'active',
        currentWork: null,    // 当前工作内容
      },

      // 外部引用
      reference: {
        skills: [],          // 加载的技能
        rules: {},           // 规则文件
        docs: {},            // 文档
      },

      // 当前上下文
      context: {
        currentSession: null,
        lastSession: null,
        sessionGap: null,
        pausedTasks: [],
        unresolvedProblems: [],
        recentLessons: [],
      }
    };
  }

  // ─────────────────────────────────────────
  // 持久化
  // ─────────────────────────────────────────

  _ensureDataDir() {
    if (!fs.existsSync(this.dataDir)) {
      fs.mkdirSync(this.dataDir, { recursive: true });
    }
  }

  _loadIndex() {
    try {
      if (fs.existsSync(this.indexFile)) {
        const data = JSON.parse(fs.readFileSync(this.indexFile, 'utf-8'));
        this.index = { ...this._getDefaultIndex(), ...data };
      } else {
        this.index = this._getDefaultIndex();
        this._saveIndex();
      }
    } catch (e) {
      console.warn('[MemoryIndex] 加载失败:', e.message);
      this.index = this._getDefaultIndex();
    }
  }

  _saveIndex() {
    try {
      this.index.meta.updatedAt = new Date().toISOString();
      fs.writeFileSync(this.indexFile, JSON.stringify(this.index, null, 2));
    } catch (e) {
      console.warn('[MemoryIndex] 保存失败:', e.message);
    }
  }

  // ─────────────────────────────────────────
  // 启动上下文（给人类阅读的摘要）
  // ─────────────────────────────────────────

  /**
   * 获取启动上下文摘要
   * 格式参考 Claude Code Memory Index
   */
  getBootSummary() {
    const lines = [];

    // 标题
    lines.push('='.repeat(56));
    lines.push(' Memory Index '.padStart(28).padEnd(56));
    lines.push('='.repeat(56));

    // 1. 身份
    lines.push('\n## Identity (身份)');
    lines.push(`- 名字: ${this.index.identity.name} / ${this.index.identity.englishName}`);
    lines.push(`- 版本: ${this.index.identity.version}`);
    lines.push(`- 四重身份: ${this.index.identity.identities.join(' · ')}`);
    lines.push(`- 核心意义: ${this.index.identity.meaning}`);

    // 2. 用户
    if (this.index.user.role || this.index.user.goals.length > 0) {
      lines.push('\n## User (用户)');
      if (this.index.user.role) {
        lines.push(`- 角色: ${this.index.user.role}`);
      }
      if (this.index.user.goals.length > 0) {
        lines.push(`- 目标:`);
        this.index.user.goals.forEach(g => lines.push(`  - ${g}`));
      }
      if (Object.keys(this.index.user.preferences).length > 0) {
        lines.push(`- 偏好: ${JSON.stringify(this.index.user.preferences)}`);
      }
    }

    // 3. 反馈
    if (this.index.feedback.validated.length > 0 || this.index.feedback.avoid.length > 0) {
      lines.push('\n## Feedback (反馈)');
      if (this.index.feedback.validated.length > 0) {
        lines.push('- 已验证的方法:');
        this.index.feedback.validated.slice(-3).forEach(f => lines.push(`  - ${f}`));
      }
      if (this.index.feedback.avoid.length > 0) {
        lines.push('- 需要避免的:');
        this.index.feedback.avoid.slice(-3).forEach(f => lines.push(`  - ${f}`));
      }
    }

    // 4. 项目
    lines.push('\n## Project (项目)');
    lines.push(`- 名字: ${this.index.project.name}`);
    lines.push(`- 描述: ${this.index.project.description}`);
    lines.push(`- 版本: ${this.index.project.version}`);
    lines.push(`- 状态: ${this.index.project.status}`);
    if (this.index.project.currentWork) {
      lines.push(`- 当前工作: ${this.index.project.currentWork}`);
    }

    // 5. 外部引用
    if (this.index.reference.skills.length > 0) {
      lines.push('\n## Reference (外部引用)');
      lines.push('- Skills:');
      this.index.reference.skills.forEach(s => lines.push(`  - ${s}`));
    }

    // 6. 当前上下文
    lines.push('\n## Context (上下文)');
    if (this.index.context.lastSession) {
      const gap = this.index.context.sessionGap;
      const gapStr = gap ? `(${Math.round(gap / 60000)}分钟前)` : '';
      lines.push(`- 上次会话: ${this.index.context.lastSession} ${gapStr}`);
    }
    if (this.index.context.pausedTasks.length > 0) {
      lines.push(`- 暂停的任务: ${this.index.context.pausedTasks.length}个`);
      this.index.context.pausedTasks.slice(-2).forEach(t => {
        lines.push(`  - ${t.description} [${t.level}]`);
      });
    }
    if (this.index.context.unresolvedProblems.length > 0) {
      lines.push(`- 未解决问题: ${this.index.context.unresolvedProblems.length}个`);
      this.index.context.unresolvedProblems.slice(-2).forEach(p => {
        lines.push(`  - ${p.problem}`);
        if (p.rootCause) lines.push(`    根因: ${p.rootCause}`);
      });
    }

    lines.push('\n' + '='.repeat(56));

    return lines.join('\n');
  }

  /**
   * 打印启动摘要
   */
  printBootSummary() {
    console.log(this.getBootSummary());
  }

  // ─────────────────────────────────────────
  // 更新方法
  // ─────────────────────────────────────────

  /**
   * 记录启动
   */
  recordBoot(sessionId) {
    const now = Date.now();
    const lastSession = this.index.context.currentSession;
    const sessionGap = lastSession ? now - this.index.context.lastSessionTime : null;

    this.index.context.currentSession = sessionId;
    this.index.context.lastSession = lastSession;
    this.index.context.lastSessionTime = now;
    this.index.context.sessionGap = sessionGap;
    this.index.meta.lastBoot = new Date().toISOString();

    this._saveIndex();
  }

  /**
   * 更新用户信息
   */
  updateUser(updates) {
    this.index.user = { ...this.index.user, ...updates };
    this._saveIndex();
  }

  /**
   * 添加反馈（教训）
   *
   * 教训逻辑：
   * - validated: 已验证的有效方法（用户明确确认"这样做有效"）
   * - avoid: 需要避免的错误（用户明确确认"这样做不对"）
   *
   * 探索失败 ≠ 教训：正常的试错过程不需要存储
   * 只有被用户明确指出的问题才能存为教训
   *
   * @param {string} type - 'validated' 或 'avoid'
   * @param {string} content - 反馈内容
   * @param {Object} meta - 元数据（source: 'user'|'exploration'）
   */
  addFeedback(type, content, meta = {}) {
    // 探索失败不自动存储为教训
    if (meta.source === 'exploration') {
      console.log('[MemoryIndex] 探索失败不存储为教训');
      return;
    }

    // 必须有明确的来源或用户确认
    if (!meta.source && !meta.userConfirmed) {
      console.log('[MemoryIndex] 反馈需要明确来源（source=user/exploration）或用户确认（userConfirmed=true）');
      return;
    }

    if (type === 'validated') {
      this.index.feedback.validated.push({
        content,
        source: meta.source || 'unknown',
        createdAt: new Date().toISOString()
      });
      // 只保留最近10条
      if (this.index.feedback.validated.length > 10) {
        this.index.feedback.validated = this.index.feedback.validated.slice(-10);
      }
    } else if (type === 'avoid') {
      this.index.feedback.avoid.push({
        content,
        source: meta.source || 'unknown',
        createdAt: new Date().toISOString()
      });
      if (this.index.feedback.avoid.length > 10) {
        this.index.feedback.avoid = this.index.feedback.avoid.slice(-10);
      }
    }
    this._saveIndex();
  }

  /**
   * 设置当前工作
   */
  setCurrentWork(work) {
    this.index.project.currentWork = work;
    this._saveIndex();
  }

  /**
   * 添加暂停任务
   */
  addPausedTask(task) {
    this.index.context.pausedTasks.push({
      ...task,
      pausedAt: new Date().toISOString()
    });
    // 只保留最近5个
    if (this.index.context.pausedTasks.length > 5) {
      this.index.context.pausedTasks = this.index.context.pausedTasks.slice(-5);
    }
    this._saveIndex();
  }

  /**
   * 移除暂停任务
   */
  removePausedTask(taskId) {
    this.index.context.pausedTasks = this.index.context.pausedTasks.filter(t => t.id !== taskId);
    this._saveIndex();
  }

  /**
   * 添加未解决问题
   */
  addUnresolvedProblem(problem, rootCause = null) {
    this.index.context.unresolvedProblems.push({
      id: `problem-${Date.now()}`,
      problem,
      rootCause,
      createdAt: new Date().toISOString(),
      resolved: false
    });
    this._saveIndex();
  }

  /**
   * 标记问题已解决
   */
  resolveProblem(problemId, solution = null) {
    const problem = this.index.context.unresolvedProblems.find(p => p.id === problemId);
    if (problem) {
      problem.resolved = true;
      problem.resolvedAt = new Date().toISOString();
      if (solution) problem.solution = solution;
      this._saveIndex();
    }
  }

  /**
   * 添加技能引用
   */
  addSkill(skillName) {
    if (!this.index.reference.skills.includes(skillName)) {
      this.index.reference.skills.push(skillName);
      this._saveIndex();
    }
  }

  // ─────────────────────────────────────────
  // 查询方法
  // ─────────────────────────────────────────

  /**
   * 获取完整索引
   */
  getIndex() {
    return this.index;
  }

  /**
   * 获取身份
   */
  getIdentity() {
    return this.index.identity;
  }

  /**
   * 获取用户
   */
  getUser() {
    return this.index.user;
  }

  /**
   * 获取反馈
   */
  getFeedback() {
    return this.index.feedback;
  }

  /**
   * 获取项目
   */
  getProject() {
    return this.index.project;
  }

  /**
   * 获取上下文
   */
  getContext() {
    return this.index.context;
  }

  /**
   * 健康检查
   */
  healthCheck() {
    return {
      status: this.index ? 'healthy' : 'degraded',
      version: this.index?.meta?.version,
      lastBoot: this.index?.meta?.lastBoot,
      currentSession: this.index?.context?.currentSession,
      pausedTasks: this.index?.context?.pausedTasks?.length || 0,
      unresolvedProblems: this.index?.context?.unresolvedProblems?.length || 0,
    };
  }
}

module.exports = { MemoryIndex };
