import { describe, expect, it } from "bun:test";
import { resolvePromptCacheKey } from "../src/auth-gateway/http";

describe("resolvePromptCacheKey", () => {
	it("prefers body.prompt_cache_key over everything else", () => {
		const headers = new Headers({ "x-prompt-cache-key": "from-header" });
		expect(
			resolvePromptCacheKey(
				{
					prompt_cache_key: "from-body",
					metadata: { session_id: "from-metadata" },
				},
				headers,
			),
		).toBe("from-body");
	});

	it("falls back to body.metadata.session_id when prompt_cache_key absent", () => {
		expect(resolvePromptCacheKey({ metadata: { session_id: "from-metadata" } }, undefined)).toBe("from-metadata");
	});

	it("falls back to body.metadata.conversation_id", () => {
		expect(resolvePromptCacheKey({ metadata: { conversation_id: "conv-1" } }, undefined)).toBe("conv-1");
	});

	it("prefers explicit metadata.prompt_cache_key over session/conversation ids", () => {
		expect(
			resolvePromptCacheKey(
				{ metadata: { prompt_cache_key: "meta-pck", session_id: "sid", conversation_id: "cid" } },
				undefined,
			),
		).toBe("meta-pck");
	});

	it("falls back to x-prompt-cache-key header when body lacks anything", () => {
		expect(resolvePromptCacheKey({}, new Headers({ "x-prompt-cache-key": "hdr-pck" }))).toBe("hdr-pck");
	});

	it("falls back to codex session_id / conversation_id headers", () => {
		expect(resolvePromptCacheKey({}, new Headers({ session_id: "codex-sid" }))).toBe("codex-sid");
		expect(resolvePromptCacheKey({}, new Headers({ conversation_id: "codex-cid" }))).toBe("codex-cid");
	});

	it("falls back to vendor-neutral x-session-id / x-conversation-id headers", () => {
		expect(resolvePromptCacheKey({}, new Headers({ "x-session-id": "x-sid" }))).toBe("x-sid");
		expect(resolvePromptCacheKey({}, new Headers({ "x-conversation-id": "x-cid" }))).toBe("x-cid");
	});

	it("returns undefined when nothing resolvable is present", () => {
		expect(resolvePromptCacheKey({}, new Headers())).toBeUndefined();
		expect(resolvePromptCacheKey({}, undefined)).toBeUndefined();
		expect(resolvePromptCacheKey(null, undefined)).toBeUndefined();
		expect(resolvePromptCacheKey("not-an-object", undefined)).toBeUndefined();
	});

	it("ignores empty string body fields and empty header values", () => {
		expect(resolvePromptCacheKey({ prompt_cache_key: "" }, new Headers({ "x-prompt-cache-key": "fallback" }))).toBe(
			"fallback",
		);
	});

	it("ignores non-string body fields", () => {
		expect(
			resolvePromptCacheKey(
				{ prompt_cache_key: 123, metadata: { session_id: { nested: "wrong-type" } } },
				new Headers({ "x-session-id": "hdr-sid" }),
			),
		).toBe("hdr-sid");
	});
});