/**
 * Copyright (c) 2023-present Plane Software, Inc. and contributors
 * SPDX-License-Identifier: AGPL-3.0-only
 * See the LICENSE file for details.
 */

import type { TCalendarLayouts } from "@plane/types";
import { EStartOfTheWeek } from "@plane/types";

const DEFAULT_LOCALE = "en-US";

export const getCalendarLocaleCode = (): string => {
  if (typeof document !== "undefined" && document.documentElement.lang) {
    return document.documentElement.lang;
  }

  if (typeof navigator !== "undefined" && navigator.language) {
    return navigator.language;
  }

  return DEFAULT_LOCALE;
};

const formatCalendarLabel = (date: Date, options: Intl.DateTimeFormatOptions): string =>
  new Intl.DateTimeFormat(getCalendarLocaleCode(), options).format(date);

export const getCalendarMonthLabel = (monthNumber: number, variant: "long" | "short" = "long"): string =>
  formatCalendarLabel(new Date(2024, monthNumber - 1, 1), { month: variant });

export const getCalendarWeekdayLabel = (dayIndex: EStartOfTheWeek, variant: "long" | "short" = "short"): string => {
  const referenceSunday = new Date(2024, 0, 7);
  referenceSunday.setDate(referenceSunday.getDate() + dayIndex);

  return formatCalendarLabel(referenceSunday, { weekday: variant });
};

export const MONTHS_LIST: {
  [monthNumber: number]: {
    shortTitle: string;
    title: string;
  };
} = {
  1: {
    shortTitle: "Jan",
    title: "January",
  },
  2: {
    shortTitle: "Feb",
    title: "February",
  },
  3: {
    shortTitle: "Mar",
    title: "March",
  },
  4: {
    shortTitle: "Apr",
    title: "April",
  },
  5: {
    shortTitle: "May",
    title: "May",
  },
  6: {
    shortTitle: "Jun",
    title: "June",
  },
  7: {
    shortTitle: "Jul",
    title: "July",
  },
  8: {
    shortTitle: "Aug",
    title: "August",
  },
  9: {
    shortTitle: "Sep",
    title: "September",
  },
  10: {
    shortTitle: "Oct",
    title: "October",
  },
  11: {
    shortTitle: "Nov",
    title: "November",
  },
  12: {
    shortTitle: "Dec",
    title: "December",
  },
};

export const DAYS_LIST: {
  [dayIndex: number]: {
    shortTitle: string;
    title: string;
    value: EStartOfTheWeek;
  };
} = {
  1: {
    shortTitle: "Sun",
    title: "Sunday",
    value: EStartOfTheWeek.SUNDAY,
  },
  2: {
    shortTitle: "Mon",
    title: "Monday",
    value: EStartOfTheWeek.MONDAY,
  },
  3: {
    shortTitle: "Tue",
    title: "Tuesday",
    value: EStartOfTheWeek.TUESDAY,
  },
  4: {
    shortTitle: "Wed",
    title: "Wednesday",
    value: EStartOfTheWeek.WEDNESDAY,
  },
  5: {
    shortTitle: "Thu",
    title: "Thursday",
    value: EStartOfTheWeek.THURSDAY,
  },
  6: {
    shortTitle: "Fri",
    title: "Friday",
    value: EStartOfTheWeek.FRIDAY,
  },
  7: {
    shortTitle: "Sat",
    title: "Saturday",
    value: EStartOfTheWeek.SATURDAY,
  },
};

export const CALENDAR_LAYOUTS: {
  [layout in TCalendarLayouts]: {
    key: TCalendarLayouts;
    titleKey: string;
  };
} = {
  month: {
    key: "month",
    titleKey: "common.month",
  },
  week: {
    key: "week",
    titleKey: "common.week",
  },
};
