import { DateTimeFormat } from "src/locale";
import { afterAll, beforeAll, describe, expect, it } from "vitest";

describe("DateFormatter", () => {
	// Keep a reference to the real Intl to restore later
	const RealIntl = global.Intl;
	const desiredTimeZone = "Europe/London";
	const desiredLocale = "en-GB";

	beforeAll(() => {
		// Ensure Node-based libs using TZ behave deterministically
		try {
			process.env.TZ = desiredTimeZone;
		} catch {
			// ignore if not available
		}

		// Mock Intl.DateTimeFormat so formatting is stable regardless of host
		const MockedDateTimeFormat = class extends RealIntl.DateTimeFormat {
			constructor(
				_locales?: string | string[],
				options?: Intl.DateTimeFormatOptions,
			) {
				super(desiredLocale, {
					...options,
					timeZone: desiredTimeZone,
				});
			}
		} as unknown as typeof Intl.DateTimeFormat;

		global.Intl = {
			...RealIntl,
			DateTimeFormat: MockedDateTimeFormat,
		};
	});

	afterAll(() => {
		// Restore original Intl after tests
		global.Intl = RealIntl;
	});

	it("format date from iso date", () => {
		const value = "2024-01-01T00:00:00.000Z";
		const text = DateTimeFormat(value);
		expect(text).toBe("Monday, 01/01/2024, 12:00:00 am");
	});

	it("format date from unix timestamp number", () => {
		const value = 1762476112;
		const text = DateTimeFormat(value);
		expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
	});

	it("format date from unix timestamp string", () => {
		const value = "1762476112";
		const text = DateTimeFormat(value);
		expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
	});

	it("catch bad format from string", () => {
		const value = "this is not a good date";
		const text = DateTimeFormat(value);
		expect(text).toBe("this is not a good date");
	});

	it("catch bad format from number", () => {
		const value = -100;
		const text = DateTimeFormat(value);
		expect(text).toBe("-100");
	});

	it("catch bad format from number as string", () => {
		const value = "-100";
		const text = DateTimeFormat(value);
		expect(text).toBe("-100");
	});
});
