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

class MessageHistory {
    constructor() {
        this.historyFile = path.join(__dirname, '..', 'chat_history.json');
        this.messages = []; // 内存中的消息历史
        this.maxMessages = 100; // 最大保存消息数量
    }

    // 服务器启动时初始化，从JSON文件预加载历史
    async initialize() {
        try {
            const data = await fs.readFile(this.historyFile, 'utf8');
            this.messages = JSON.parse(data);
            console.log(`已加载 ${this.messages.length} 条历史消息`);
        } catch (error) {
            if (error.code === 'ENOENT') {
                console.log('历史文件不存在，创建新的消息历史');
                this.messages = [];
                await this.saveToFile();
            } else {
                console.error('加载历史消息失败:', error);
                this.messages = [];
            }
        }
    }

    // 添加新消息（用户输入和助手回复）
    async addMessage(userInput, assistantResponse) {
        // 添加用户消息
        this.messages.push({
            role: 'user',
            content: userInput
        });

        // 添加助手回复
        this.messages.push({
            role: 'assistant', 
            content: assistantResponse
        });

        // 限制消息数量（保留最近的对话）
        if (this.messages.length > this.maxMessages * 2) {
            this.messages = this.messages.slice(-this.maxMessages * 2);
        }

        // 同时保存到文件和内存
        await this.saveToFile();
        
        console.log(`已保存对话，当前历史消息数: ${this.messages.length}`);
    }

    // 获取用于大模型的消息格式
    getMessagesForLLM(includeSystem = true, recentCount = 10) {
        const messages = [];
        
        // 添加系统消息
        if (includeSystem) {
            messages.push({
                role: 'system',
                content: 'You are a helpful assistant.'
            });
        }

        // 获取最近的对话历史
        const recentMessages = this.messages.slice(-recentCount * 2); // 用户+助手成对出现
        messages.push(...recentMessages.map(msg => ({
            role: msg.role,
            content: msg.content
        })));

        return messages;
    }

    // 获取完整历史（包含时间戳）
    getFullHistory() {
        return [...this.messages];
    }

    // 清空历史
    async clearHistory() {
        this.messages = [];
        await this.saveToFile();
        console.log('历史消息已清空');
    }

    // 保存到JSON文件
    async saveToFile() {
        try {
            await fs.writeFile(this.historyFile, JSON.stringify(this.messages, null, 2), 'utf8');
        } catch (error) {
            console.error('保存历史消息到文件失败:', error);
        }
    }

    // 导出历史（备份）
    async exportHistory(filename) {
        const exportPath = filename || `chat_backup_${new Date().toISOString().split('T')[0]}.json`;
        try {
            await fs.writeFile(exportPath, JSON.stringify(this.messages, null, 2), 'utf8');
            console.log(`历史消息已导出到: ${exportPath}`);
            return exportPath;
        } catch (error) {
            console.error('导出历史消息失败:', error);
            throw error;
        }
    }

    // 导入历史
    async importHistory(filename) {
        try {
            const data = await fs.readFile(filename, 'utf8');
            const importedMessages = JSON.parse(data);
            
            // 验证消息格式
            if (Array.isArray(importedMessages)) {
                this.messages = importedMessages;
                await this.saveToFile();
                console.log(`已导入 ${this.messages.length} 条历史消息`);
                return true;
            } else {
                throw new Error('无效的消息格式');
            }
        } catch (error) {
            console.error('导入历史消息失败:', error);
            throw error;
        }
    }
}

module.exports = { MessageHistory };