type DateTimeStyle = "full" | "long" | "medium" | "short" | "none" | undefined;

/**
 * Formats the given date and time to a string based on the current locale.
 */
export function formatDateTime(date: string | Date | number, dateStyle: DateTimeStyle = "medium", timeStyle: DateTimeStyle = "medium") {
    const locale = navigator.language;

    let parsedDate;
    if (typeof date === "string" || typeof date === "number") {
        // Parse the given string as a date
        parsedDate = new Date(date);
    } else if (date instanceof Date) {
        // The given date is already a Date instance or a number
        parsedDate = date;
    } else {
        // Invalid type
        throw new TypeError(`Invalid type for the "date" argument.`);
    }

    if (timeStyle !== "none" && dateStyle !== "none") {
        // Format the date and time
        const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle, timeStyle });
        return formatter.format(parsedDate);
    } else if (timeStyle === "none" && dateStyle !== "none") {
        // Format only the date
        return parsedDate.toLocaleDateString(locale, { dateStyle });
    } else if (dateStyle === "none" && timeStyle !== "none") {
        // Format only the time
        return parsedDate.toLocaleTimeString(locale, { timeStyle });
    }

    throw new Error("Incorrect state.");
}
