package com.gzzm.lobster.tool.mcp;

import com.gzzm.lobster.common.JsonUtil;

import java.util.LinkedHashMap;
import java.util.Map;

public class McpCallOptions {
    private String requestId;
    private String threadId;
    private String runId;
    private String toolCallId;
    private String userId;
    private String orgId;
    private long timeoutMs;

    public Map<String, Object> toContextMap(McpServerConfig server) {
        Map<String, Object> out = new LinkedHashMap<>();
        if (requestId != null) out.put("requestId", requestId);
        if (userId != null) out.put("userId", userId);
        if (orgId != null) out.put("orgId", orgId);
        Map<String, Object> headers = new LinkedHashMap<>();
        if (server != null && server.getAuthToken() != null && !server.getAuthToken().trim().isEmpty()) {
            headers.put("X-ZGW-Auth", "Bearer " + server.getAuthToken().trim());
        }
        if (server != null && server.getHeadersJson() != null && !server.getHeadersJson().trim().isEmpty()) {
            try {
                Object parsed = JsonUtil.fromJson(server.getHeadersJson(), Object.class);
                if (parsed instanceof Map) {
                    for (Map.Entry<?, ?> e : ((Map<?, ?>) parsed).entrySet()) {
                        if (e.getKey() != null && e.getValue() != null) {
                            headers.put(String.valueOf(e.getKey()), String.valueOf(e.getValue()));
                        }
                    }
                }
            } catch (Throwable ignore) { /* invalid custom headers are ignored */ }
        }
        if (threadId != null) headers.put("X-MCP-Lobster-Thread-Id", threadId);
        if (runId != null) headers.put("X-MCP-Lobster-Run-Id", runId);
        if (toolCallId != null) headers.put("X-MCP-Lobster-Tool-Call-Id", toolCallId);
        if (!headers.isEmpty()) out.put("headers", headers);
        return out;
    }

    public String getRequestId() { return requestId; }
    public void setRequestId(String requestId) { this.requestId = requestId; }
    public String getThreadId() { return threadId; }
    public void setThreadId(String threadId) { this.threadId = threadId; }
    public String getRunId() { return runId; }
    public void setRunId(String runId) { this.runId = runId; }
    public String getToolCallId() { return toolCallId; }
    public void setToolCallId(String toolCallId) { this.toolCallId = toolCallId; }
    public String getUserId() { return userId; }
    public void setUserId(String userId) { this.userId = userId; }
    public String getOrgId() { return orgId; }
    public void setOrgId(String orgId) { this.orgId = orgId; }
    public long getTimeoutMs() { return timeoutMs; }
    public void setTimeoutMs(long timeoutMs) { this.timeoutMs = timeoutMs; }
}
