package ankurm.ai21;

import java.util.List;

import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.model.openai.autoconfigure.OpenAiChatAutoConfiguration;
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
import org.springframework.ai.model.openai.autoconfigure.OpenAiResponsesChatAutoConfiguration;
import org.springframework.ai.openai.responses.HostedTool;
import org.springframework.ai.openai.responses.OpenAiResponsesChatOptions;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

/** Which ChatModel does spring.ai.openai.chat.api select, and what do the Responses options look like? */
public class ResponsesDemo {

	public static void main(String[] args) {
		ApplicationContextRunner runner = new ApplicationContextRunner()
			.withConfiguration(AutoConfigurations.of(ToolCallingAutoConfiguration.class, OpenAiChatAutoConfiguration.class, OpenAiResponsesChatAutoConfiguration.class))
			.withPropertyValues("spring.ai.openai.api-key=sk-dummy-never-called");

		System.out.println("== bean selected by spring.ai.openai.chat.api");
		for (String api : new String[] { "(unset)", "chat-completions", "responses" }) {
			ApplicationContextRunner r = api.equals("(unset)") ? runner
					: runner.withPropertyValues("spring.ai.openai.chat.api=" + api);
			r.run(ctx -> {
				if (ctx.getStartupFailure() != null) {
					System.out.println(api + " -> startup failure: " + rootCause(ctx.getStartupFailure()));
					return;
				}
				System.out.println(api + " -> " + ctx.getBeansOfType(ChatModel.class).values().stream()
						.map(m -> m.getClass().getSimpleName()).toList());
			});
		}

		System.out.println("== Responses options with hosted tools");
		OpenAiResponsesChatOptions options = OpenAiResponsesChatOptions.builder()
			.model("gpt-5.1")
			.reasoningEffort("medium")
			.reasoningSummary("auto")
			.maxOutputTokens(2000)
			.hostedTools(List.of(HostedTool.WebSearch.of(), HostedTool.CodeInterpreter.of(),
					HostedTool.Mcp.of("docs", "https://example.com/mcp")))
			.build();
		System.out.println("model            = " + options.getModel());
		System.out.println("reasoningEffort  = " + options.getReasoningEffort());
		System.out.println("reasoningSummary = " + options.getReasoningSummary());
		System.out.println("hostedTools      = " + options.getHostedTools().stream().map(t -> t.getClass().getSimpleName()).toList());
	}

	private static String rootCause(Throwable t) {
		while (t.getCause() != null) {
			t = t.getCause();
		}
		return t.getClass().getSimpleName() + ": " + t.getMessage();
	}
}
