import { isSaturday, isSunday, Locale } from "date-fns";
import { format } from "date-fns";
import { ru, enUS, kk } from "date-fns/locale";
import dayjs, { Dayjs } from "dayjs";
import moment from "moment";

export const timeFromUnixInSeconds = (seconds: number): string => {
	return moment.unix(seconds).format("DD.MM.YYYY HH:mm:ss");
};

export const formatDateFromUnixInSeconds = (seconds: number): string => {
	return moment.unix(seconds).format("DD.MM.YYYY");
};

export const getDateFromUnixInSeconds = (seconds: number) => {
	return moment.unix(seconds).toDate();
};

export const timeFromUnixInMilliseconds = (millieconds: number): string => {
	return moment.unix(millieconds / 1000).format("DD.MM.YYYY HH:mm:ss");
};

export const getCurrentTimeZoneId = (): string => {
	return Intl.DateTimeFormat().resolvedOptions().timeZone;
};

export const getTimeZoneOffsetInMinutes = (): number => {
	const date = new Date();
	const offset = date.getTimezoneOffset();
	const abs = Math.abs(offset);
	return offset > 0 ? -abs : abs;
};

export const getTimeZoneOffsetInHours = (): number => {
	const minutes = getTimeZoneOffsetInMinutes();
	return minutes / 60;
};

export const formatReportDateTime = (time: Dayjs): string => {
	return time.format("YYYY-MM-DD HH:mm:ss ZZ");
};

export const formatDate = (date?: Date): string => {
	return dayjs(date).format("DD.MM.YYYY");
};

export const formatTime = (dateTime?: Date): string => {
	return dayjs(dateTime).format("HH:mm:ss");
};

export const formatDateTime = (dateTime?: Date): string => {
	return dayjs(dateTime).format("DD.MM.YYYY HH:mm:ss");
};

export const formatDateTimeWithoutSeconds = (dateTime?: Date): string => {
	return dayjsFormatDateTimeWithoutSeconds(dayjs(dateTime));
};

export const dayjsFormatDateTimeWithoutSeconds = (dateTime: Dayjs): string => {
	return dateTime.format("DD.MM.YYYY HH:mm");
};

export const formatDateTimeDayjs = (dateTime?: Dayjs): string => {
	return dayjs(dateTime).format("DD.MM.YYYY HH:mm:ss");
};

/**
 * Проверяет, является ли дата выходным днем (суббота или воскресенье).
 * @param date Дата для проверки.
 * @returns True, если дата является выходным днем, иначе False.
 */
export const isWeekend = (date: Date): boolean => {
	return isSaturday(date) || isSunday(date);
};

const dateFnsLocales = new Map<string, Locale>([
	["en", enUS],
	["ru", ru],
	["kk", kk],
]);

/**
 * Получает название дня недели для заданной даты.
 * @param date Дата для получения дня недели.
 * @param locale Локаль для форматирования. По умолчанию используется 'en-US'.
 * @returns Название дня недели.
 */
export function getDayName(date: Date, locale: string): string {
	const dateLocale = dateFnsLocales.get(locale) || enUS;
	return format(date, "EEEE", { locale: dateLocale });
}
