import { sub } from "date-fns";
import { describe, expect, test } from "vitest";
import {
	chatAccessible,
	datePlaceholder,
	resolveDatePlaceholders,
} from "./chat-utils";

describe("chatCodeVisible", () => {
	test("visible when within expiration window", () => {
		const result = chatAccessible({
			isStaff: false,
			expiresAfterDays: 1,
			comparedTo: new Date(),
		});

		expect(result).toBe(true);
	});

	test("not visible when past expiration window", () => {
		const result = chatAccessible({
			isStaff: false,
			expiresAfterDays: 1,
			comparedTo: sub(new Date(), { days: 3 }),
		});

		expect(result).toBe(false);
	});

	test("staff gets 7 extra days", () => {
		const result = chatAccessible({
			isStaff: true,
			expiresAfterDays: 1,
			comparedTo: sub(new Date(), { days: 5 }),
		});

		expect(result).toBe(true);
	});

	test("staff extra days are not infinite", () => {
		const result = chatAccessible({
			isStaff: true,
			expiresAfterDays: 1,
			comparedTo: sub(new Date(), { days: 10 }),
		});

		expect(result).toBe(false);
	});
});

describe("datePlaceholder", () => {
	test("returns correctly formatted placeholder string", () => {
		const date = new Date(1700000000000);

		expect(datePlaceholder(date)).toBe("{{date:1700000000000}}");
	});
});

describe("resolveDatePlaceholders", () => {
	const mockFormat = (d: Date) => `FORMATTED:${d.getTime()}`;

	test("replaces a single placeholder with formatted date", () => {
		const text = "Starts at {{date:1700000000000}}";

		expect(resolveDatePlaceholders(text, mockFormat)).toBe(
			"Starts at FORMATTED:1700000000000",
		);
	});

	test("replaces multiple placeholders in one string", () => {
		const text = "From {{date:1700000000000}} to {{date:1700003600000}}";

		expect(resolveDatePlaceholders(text, mockFormat)).toBe(
			"From FORMATTED:1700000000000 to FORMATTED:1700003600000",
		);
	});

	test("returns text unchanged when no placeholders present", () => {
		const text = "Just a normal string";

		expect(resolveDatePlaceholders(text, mockFormat)).toBe(text);
	});

	test("handles text that is only a placeholder", () => {
		const text = "{{date:1700000000000}}";

		expect(resolveDatePlaceholders(text, mockFormat)).toBe(
			"FORMATTED:1700000000000",
		);
	});
});
