/**
 * 日志工具模块
 * 
 * 支持不同级别的日志记录（info, error, warn, debug）
 * 优先通过 MCP 协议的日志通知功能发送日志，如果 MCP Server 不可用则回退到 console.error
 */

const LOG_LEVELS = {
    DEBUG: 0,
    INFO: 1,
    WARN: 2,
    ERROR: 3,
};

// MCP 日志级别映射
const MCP_LOG_LEVELS = {
    DEBUG: 'debug',
    INFO: 'info',
    WARN: 'warning',
    ERROR: 'error',
};

// 从环境变量获取日志级别，默认为 INFO
const getLogLevel = () => {
    const level = process.env.LOG_LEVEL?.toUpperCase() || 'INFO';
    return LOG_LEVELS[level] ?? LOG_LEVELS.INFO;
};

const currentLogLevel = getLogLevel();

// 全局 MCP Server 实例（由 index.js 设置）
let mcpServer = null;

/**
 * 设置 MCP Server 实例，用于发送日志通知
 */
export function setMcpServer(server) {
    mcpServer = server;
}

/**
 * 通过 MCP 协议发送日志通知
 * 根据 MCP 协议规范，日志通知应该通过 stdout 以 JSON-RPC 通知消息的形式发送
 * 同时也会输出到 stderr 作为备份，确保日志始终可见
 */
function sendLogToMcp(level, message) {
    if (mcpServer) {
        try {
            // MCP 协议的日志通知格式：通过 stdout 发送 JSON-RPC 通知消息
            // 格式：{"jsonrpc": "2.0", "method": "notifications/message", "params": {"level": "info", "message": "..."}}
            const logNotification = {
                jsonrpc: '2.0',
                method: 'notifications/message',
                params: {
                    level: MCP_LOG_LEVELS[level] || 'info',
                    message: message,
                },
            };
            // 输出 JSON-RPC 格式的日志通知到 stdout（MCP 协议的标准方式）
            // 注意：必须以换行符结尾，并且是有效的 JSON
            console.log(JSON.stringify(logNotification));
            // 同时输出到 stderr 作为备份，确保日志始终可见
            // 这样即使 MCP 客户端没有正确处理通知，日志也能在 stderr 中看到
            console.error(formatLogMessage(level, message));
            return true;
        } catch (error) {
            // 如果发送失败，回退到 stderr 输出（普通格式）
            console.error(`[${level}] Failed to send log via MCP: ${error.message}`);
            return false;
        }
    }
    return false;
}

/**
 * 格式化日志消息
 * 不包含时间戳，因为 Cursor 会自动添加
 */
function formatLogMessage(level, message) {
    return `[${level}] ${message}`;
}

/**
 * 记录 INFO 级别的日志（正常操作信息）
 * 优先通过 MCP 协议格式发送，同时也会输出到 stderr 确保可见
 */
export function info(message) {
    if (currentLogLevel <= LOG_LEVELS.INFO) {
        // 尝试通过 MCP 协议格式发送日志（同时会输出到 stderr 作为备份）
        const sent = sendLogToMcp('INFO', message);
        if (!sent) {
            // 如果 MCP Server 不可用，回退到 stderr 输出（普通格式）
            console.error(formatLogMessage('INFO', message));
        }
    }
}

/**
 * 记录 ERROR 级别的日志（错误信息）
 */
export function error(message) {
    if (currentLogLevel <= LOG_LEVELS.ERROR) {
        const sent = sendLogToMcp('ERROR', message);
        if (!sent) {
            console.error(formatLogMessage('ERROR', message));
        }
    }
}

/**
 * 记录 WARN 级别的日志（警告信息）
 */
export function warn(message) {
    if (currentLogLevel <= LOG_LEVELS.WARN) {
        const sent = sendLogToMcp('WARN', message);
        if (!sent) {
            console.error(formatLogMessage('WARN', message));
        }
    }
}

/**
 * 记录 DEBUG 级别的日志（调试信息）
 */
export function debug(message) {
    if (currentLogLevel <= LOG_LEVELS.DEBUG) {
        const sent = sendLogToMcp('DEBUG', message);
        if (!sent) {
            console.error(formatLogMessage('DEBUG', message));
        }
    }
}

